40 #include <QTimerEvent> 48 : QObject( arnNullptr)
51 _arnNetworkAccessManagerFactory =
new ArnNetworkAccessManagerFactory;
56 delete _arnNetworkAccessManagerFactory;
72 QObject* ArnQml::constructorArnInterface(
QML_ENGINE* engine, QJSEngine* scriptEngine)
75 Q_UNUSED(scriptEngine)
87 if (flags.is( flags.
ArnLib) && !in._regedUse.is( flags.
ArnLib)) {
88 in._regedUse.set( flags.
ArnLib);
89 qmlRegisterType<ArnItemQml>(
"ArnLib", 1, 0,
"ArnItem");
90 qmlRegisterType<ArnMonitorQml>(
"ArnLib", 1, 0,
"ArnMonitor");
91 qmlRegisterType<ArnSapiQml>(
"ArnLib", 1, 0,
"ArnSapi");
92 qmlRegisterType<XStringMapQml>(
"ArnLib", 1, 0,
"XStringMap");
94 qmlRegisterType<ArnInterface>(
"ArnLib", 1, 0,
"Arn");
96 qmlRegisterSingletonType<ArnInterface>(
"ArnLib", 1, 0,
"Arn", constructorArnInterface);
99 if (flags.is( flags.
MSystem) && !in._regedUse.is( flags.
MSystem)) {
100 in._regedUse.set( flags.
MSystem);
101 qmlRegisterType<QmlMFileIO>(
"MSystem", 1, 0,
"MFileIO");
103 if (flags.is( flags.
MQt) && !in._regedUse.is( flags.
MQt)) {
104 in._regedUse.set( flags.
MQt);
105 qmlRegisterType<QmlMQtObject>(
"MQtQml", 1, 0,
"MQtObject");
109 qmlEngine->setNetworkAccessManagerFactory( in._arnNetworkAccessManagerFactory);
112 qmlEngine->rootContext()->setContextProperty(
"arn",
new ArnInterface( qmlEngine));
114 qmlEngine->rootContext()->setContextProperty(
"mSys",
new QmlMSys( qmlEngine));
129 ArnItemQml::ArnItemQml( QObject* parent)
132 _isCompleted =
false;
135 setIgnoreSameValue(
true);
141 if (!_variantType)
return QString();
143 const char* typeName = QMetaType::typeName(_variantType);
144 if (!typeName)
return QString();
150 void ArnItemQml::setVariantType(
const QString& typeName)
152 if (typeName.isEmpty()) {
156 int type = QMetaType::type( typeName.toLatin1().constData());
158 qWarning() <<
"ItemQml setVariantType, Unknown: type=" + typeName +
" path=" +
path();
165 emit variantTypeChanged();
175 void ArnItemQml::setPath(
const QString& path)
193 void ArnItemQml::setVariant(
const QVariant& value)
198 QVariant val = value;
199 if (val.convert( QVariant::Type( _variantType))) {
203 qWarning() <<
"ItemQml setVariant, Can't convert: type=" 204 << _variantType <<
" path=" +
path();
258 void ArnItemQml::setUseUuid(
bool useUuid)
264 void ArnItemQml::classBegin()
269 void ArnItemQml::componentComplete()
272 if (!_path.isEmpty())
277 void ArnItemQml::itemUpdated(
const ArnLinkHandle& handleData,
const QByteArray* value)
279 ArnItem::itemUpdated( handleData, value);
281 if (delayTimerId() == 0)
286 void ArnItemQml::itemCreatedBelow(
const QString& path)
293 void ArnItemQml::itemModeChangedBelow(
const QString& path, uint linkId,
ObjectMode mode)
300 void ArnItemQml::timerEvent( QTimerEvent* ev)
302 if (ev->timerId() == delayTimerId()) {
307 return ArnItem::timerEvent( ev);
313 ArnMonitorQml::ArnMonitorQml( QObject* parent)
316 _isCompleted =
false;
326 void ArnMonitorQml::setClientId(
const QString&
id)
356 void ArnMonitorQml::classBegin()
361 void ArnMonitorQml::componentComplete()
364 if (!_path.isEmpty())
369 QString ArnMonitorQml::outPathConvert(
const QString& path)
375 QString ArnMonitorQml::inPathConvert(
const QString& path)
383 ArnSapiQml::ArnSapiQml( QObject* parent)
386 _isCompleted =
false;
387 _providerPrefix =
"pv_";
388 _requesterPrefix =
"rq_";
392 void ArnSapiQml::setPipePath(
const QString& path)
397 setConvVariantPar(
true);
401 QString receivePrefix;
403 receivePrefix = _providerPrefix;
404 _sendPrefix = _requesterPrefix;
407 receivePrefix = _requesterPrefix;
408 _sendPrefix = _providerPrefix;
427 void ArnSapiQml::classBegin()
432 void ArnSapiQml::componentComplete()
435 if (!_path.isEmpty())
443 XStringMapQml::XStringMapQml( QObject* parent)
446 _isCompleted =
false;
450 QObject* XStringMapQml::add( QObject* other)
460 void XStringMapQml::classBegin()
465 void XStringMapQml::componentComplete()
487 for (
int i = 0; i < xsm.
size(); ++i) {
489 QByteArray key = xsm.
key(i);
493 enumValue = 1 << bitPos;
501 retMap.insert( enumerator, QVariant( enumValue ) );
507 QmlMSys::QmlMSys( QObject* parent)
523 ArnNetworkReply::ArnNetworkReply( QObject* parent)
524 : QNetworkReply( parent)
531 bool ArnNetworkReply::isFinished()
const 537 qint64 ArnNetworkReply::bytesAvailable()
const 539 return QNetworkReply::bytesAvailable() + _data.size() - _readPos;
543 bool ArnNetworkReply::isSequential()
const 549 qint64 ArnNetworkReply::size()
const 555 qint64 ArnNetworkReply::readData(
char* data, qint64 maxlen)
557 int len = qMin( _data.size() - _readPos, int(maxlen));
559 memcpy( data, _data.constData() + _readPos, size_t( len));
563 if ((len == 0) && (bytesAvailable() == 0)) {
571 void ArnNetworkReply::abort()
577 QByteArray ArnNetworkReply::data()
const 583 void ArnNetworkReply::setup(
const QString& path)
589 if (path.endsWith(
"/qmldir"))
595 QMetaObject::invokeMethod(
this,
"postSetup", Qt::QueuedConnection);
606 void ArnNetworkReply::postSetup()
613 _arnItem.open( _arnPath);
619 connect( &_arnItem, SIGNAL(changed()),
this, SLOT(dataArived()));
624 setData( _arnItem.toByteArray());
628 void ArnNetworkReply::dataArived()
630 disconnect( &_arnItem, SIGNAL(changed()),
this, SLOT(dataArived()));
633 setData( _arnItem.toByteArray());
637 void ArnNetworkReply::setData(
const QByteArray& data)
645 int posStart = _data.indexOf(
"import QtQuick 1.");
647 int posEnd = _data.indexOf(
'\n', posStart);
649 _data.replace( posStart, posEnd - posStart,
"import QtQuick 2.3");
654 QMetaObject::invokeMethod (
this,
"downloadProgress", Qt::QueuedConnection,
655 Q_ARG( qint64, _data.size()),
656 Q_ARG( qint64, _data.size()));
657 QMetaObject::invokeMethod(
this,
"readyRead", Qt::QueuedConnection);
658 QMetaObject::invokeMethod(
this,
"finished", Qt::QueuedConnection);
665 ArnNetworkAccessManager::ArnNetworkAccessManager( QObject* parent)
666 : QNetworkAccessManager( parent)
671 QNetworkReply* ArnNetworkAccessManager::createRequest( QNetworkAccessManager::Operation op,
672 const QNetworkRequest& request,
673 QIODevice* outgoingData)
675 QUrl url = request.url();
676 if (url.scheme() !=
"arn")
677 return QNetworkAccessManager::createRequest( op, request, outgoingData);
681 ArnNetworkReply* reply =
new ArnNetworkReply;
685 reply->setRequest( request);
686 reply->setOperation( op);
692 QString path = url.path();
695 reply->setup( arnPath);
699 qWarning() <<
"ArnNetworkAccessManager: Operation not supported op=" << op;
709 QNetworkAccessManager* ArnNetworkAccessManagerFactory::create( QObject* parent)
711 return new ArnNetworkAccessManager( parent);
void setMethodPrefix(const QString &prefix)
Mode mode() const
Get the mode.
static uchar strToBitpos(const QByteArray &str, bool *isOk=arnNullptr)
void addSubEnumPlainTo(Arn::XStringMap &xsm, quint16 nameSpace=0, bool neverHumanize=false) const
Adds all sub enum plain and shifted to a XStringMap.
void reStart()
The monitor is restarted.
bool setReceiver(QObject *receiver, bool useTrackRpcSender=true)
void setValue(const ArnItem &other, int ignoreSame=Arn::SameValue::DefaultAction)
Assign the value of an other ArnItem to an Arn Data Object
static ArnQml & instance()
ArnItem & setAutoDestroy()
Set client session sync mode as AutoDestroy for this ArnItem.
void addSenderSignals(QObject *sender, const QString &prefix)
static void setup(QML_ENGINE *qmlEngine, UseFlags flags=UseFlags::ArnLib)
Add ArnLib support to a Qml instance.
Path: "/@/test" ==> "//test", Item: "@" ==> "".
ArnItem & setPipeMode()
Set general mode as Pipe for this Arn Data Object
QString path
The path of this ArnItem.
static bool exist(const QString &path)
Container class with string representation for serialized data.
void setMonitorPath(const QString &path, ArnClient *client=arnNullptr)
Set the path to be monitored.
Arn::DataType type() const
The type stored in the Arn Data Object
void setClient(ArnClient *client)
Set the client to be used.
bool useUuid
Select to use ArnItem::openUuid()
void addFlagsTo(Arn::XStringMap &xsm, const IncludeMode &incMode, quint16 nameSpace=0, bool neverHumanize=false) const
Adds enum flags to a XStringMap.
Note: ArnLib is always included.
QVariantMap xstringToEnum(const QString &xstring)
ArnItem & setMaster()
Set client session sync mode as Master for this ArnItem.
ArnItem & setBiDirMode()
Set general mode as Bidirectional for this Arn Data Object
QString monitorPath() const
Get the monitored path
void setAtomicOpProvider()
Set this Arn Data Object as Atomic Operator Provider
Include some system fuctions like file-io.
static QString arnRootPath()
Gives current ARN root path for all qml instances.
bool start(const QString &path, ArnClient *client)
Starts the monitoring.
QString changeBasePath(const QString &oldBasePath, const QString &newBasePath, const QString &path)
Change the base (start) of a path.
bool open(const QString &path)
Open a handle to an Arn Data Object
QObject * receiver() const
Provider side (opposed to requester)
QString convertPath(const QString &path, Arn::NameF nameF)
Convert a path to a specific format.
ArnItem & setSaveMode()
Set general mode as Save for this Arn Data Object
QString path(Arn::NameF nameF=Arn::NameF::EmptyOk) const
Path of the Arn Data Object
QString pipePath() const
Get the path for the used pipe
bool loadBitSet(const Arn::XStringMap &xsm, const QString &name=QString())
Loads the instance by an bit set (flags) XStringMap.
void arnItemCreated(const QString &path)
Signal emitted when an Arn Data Object is created in the tree below.
QString valueString(int i, const QString &def=QString()) const
static void setArnRootPath(const QString &path)
Change ARN root path for all qml instances.
Include some Qt extensions like MQtObject.
QByteArray key(int i, const char *def=arnNullptr) const
QString variantType
The type used inside the variant, e.g. QString.
bool isAutoDestroy() const
uint linkId() const
Get the id for this Arn Data Object
XStringMap & add(const char *key, const QByteArray &val)
static uint strToNum(const QByteArray &str, bool *isOk=arnNullptr)
void reStart()
Restart the monitor.
void arnModeChanged(const QString &path, uint linkId, Arn::ObjectMode mode)
Signal emitted when an Arn Data Object in the tree below has a general mode change.
bool open(const QString &pipePath)
A client remote monitor to detect changes at server.
QString clientId() const
Get the id name of the used client
Handle for an Arn Data Object.
bool openUuid(const QString &path)
Open a handle to an Arn Object with a unique uuid name.