33 #include "private/ArnDepend_p.hpp" 38 #include <QtAlgorithms> 46 ArnDependOfferPrivate::ArnDependOfferPrivate()
51 ArnDependOfferPrivate::~ArnDependOfferPrivate()
58 , d_ptr( new ArnDependOfferPrivate)
80 d->_serviceName = serviceName;
81 QString basePath = QString(
ArnDependPath) + serviceName +
"/";
83 d->_arnEchoPipeFB.setPipeMode().setMaster();
84 d->_arnStateName.setMaster();
85 d->_arnStateId.setMaster();
86 d->_arnEchoPipeFB.open( basePath +
"echoPipe!");
87 d->_arnStateName.open( basePath +
"stateName");
88 d->_arnStateId.open( basePath +
"stateId");
90 d->_arnEchoPipeFB =
"{}";
91 d->_arnStateName =
"Start";
94 connect( &d->_arnEchoPipeFB, SIGNAL(changed(QByteArray)),
this, SLOT(requestReceived(QByteArray)));
102 d->_arnStateName = name;
110 return d->_arnStateName.toString();
126 return d->_arnStateId.toInt();
130 void ArnDependOffer::requestReceived( QByteArray req)
134 if (
Arn::debugDepend) qDebug() <<
"DepOffer request: service=" << d->_serviceName <<
" req=" << req
135 <<
"itemId=" << d->_arnEchoPipeFB.itemId();
136 d->_arnEchoPipeFB = req;
144 ArnDependPrivate::ArnDependPrivate()
146 QUuid uuid = QUuid::createUuid();
147 _uuid = uuid.toString().toLatin1();
148 _pipeRegx =
ARN_RegExp( ARN_RegExp::escape( QString::fromLatin1( _uuid)));
150 _timerEchoRefresh =
new QTimer;
151 _timerEchoRefresh->setInterval(2000);
155 ArnDependPrivate::~ArnDependPrivate()
157 qDeleteAll( _depTab);
158 delete _timerEchoRefresh;
162 void ArnDepend::init()
166 connect( d->_timerEchoRefresh, SIGNAL(timeout()),
this, SLOT(echoRefresh()));
172 , d_ptr( new ArnDependPrivate)
196 QString basePath = QString(
ArnDependPath) + serviceName +
"/";
199 slot->serviceName = serviceName;
200 slot->arnEchoPipe.open( basePath +
"echoPipe");
201 slot->arnStateName.open( basePath +
"stateName");
202 slot->arnStateId.open( basePath +
"stateId");
204 slot->arnEchoPipe.setReference( slot);
205 slot->arnStateName.setReference( slot);
206 slot->arnStateId.setReference( slot);
215 DepSlot* slot = setupDepSlot( serviceName);
216 slot->stateName = stateName;
217 slot->useStateCheck =
true;
223 DepSlot* slot = setupDepSlot( serviceName);
224 slot->stateId = stateId;
225 slot->useStateCheck = stateId >= 0;
241 if (d->_started)
return;
244 foreach(
DepSlot* slot, d->_depTab) {
245 connect( &slot->arnEchoPipe, SIGNAL(changed(QByteArray)),
this, SLOT(echoCheck(QByteArray)));
252 void ArnDepend::echoRefresh()
258 foreach(
DepSlot* slot, d->_depTab) {
264 void ArnDepend::echoCheck(
const QByteArray& echo, DepSlot* slot)
268 d->_timerEchoRefresh->start();
271 if (slot == arnNullptr) {
275 if (slot == arnNullptr) {
276 ArnM::errorLog( QString(tr(
"Can't get slot for DependEchoCheck monitor=")) + d->_name,
280 if (slot->isEchoOk)
return;
282 if (echo.isEmpty()) {
283 if (
Arn::debugDepend) qDebug() <<
"echoCheck: Send request monitorName=" << d->_name <<
" req=" << d->_uuid;
284 slot->arnEchoPipe.setValueOverwrite( d->_uuid, d->_pipeRegx);
286 else if (echo == d->_uuid) {
287 slot->isEchoOk =
true;
288 disconnect( &slot->arnEchoPipe, SIGNAL(changed(QByteArray)),
this, SLOT(echoCheck(QByteArray)));
289 if (slot->useStateCheck) {
290 connect( &slot->arnStateId, SIGNAL(changed()),
this, SLOT(stateCheck()));
291 connect( &slot->arnStateName, SIGNAL(changed()),
this, SLOT(stateCheck()));
301 void ArnDepend::stateCheck( DepSlot* slot)
305 if (slot == arnNullptr) {
309 if (slot == arnNullptr) {
310 ArnM::errorLog( QString(tr(
"Can't get slot for DependStateCheck monitor=")) + d->_name,
314 if (slot->isStateOk)
return;
316 if (!slot->stateName.isEmpty() && (slot->arnStateName.toString() == slot->stateName)) {
317 slot->isStateOk =
true;
320 else if ((slot->stateId > 0) && (slot->arnStateId.toInt() >= slot->stateId)) {
321 slot->isStateOk =
true;
327 void ArnDepend::doDepOk( DepSlot* slot)
332 QMetaObject::invokeMethod(
this,
334 Qt::QueuedConnection,
335 Q_ARG(
void*, slot));
339 void ArnDepend::deleteSlot(
void* slot_)
345 if (!d->_depTab.removeOne( slot)) {
346 ArnM::errorLog( QString(tr(
"Can't get slot for delete Depend monitor=")) + d->_name,
352 if (d->_depTab.isEmpty()) {
353 d->_timerEchoRefresh->stop();
QString stateName() const
void add(const QString &serviceName, int stateId=-1)
Add a dependency for a service
ArnDependOffer(QObject *parent=arnNullptr)
void setStateId(int id)
Set the state of the service by an id number.
void completed()
Signal emitted when all dependent services are available.
Class for advertising that a service is available.
const char * ArnDependPath
ArnDepend(QObject *parent=arnNullptr)
void * reference() const
Get the stored external reference.
void setMonitorName(const QString &name)
Set an optional monitor name for debugging.
Class for setting up dependencis to needed services.
void setStateName(const QString &name)
Set the state of the service by a logic name.
void advertise(const QString &serviceName)
Advertise an available service
ArnItem specialized as a pipe.
static void errorLog(QString errText, ArnError err=ArnError::Undef, void *reference=arnNullptr)
Handle for an Arn Data Object.
void startMonitor()
Starting the dependency monitor.