24 #include "dbusoperationqueuehandler.h"
26 #include <QMetaMethod>
30 #include "libsignoncommon.h"
31 #include "identityinfo.h"
40 DBusOperationQueueHandler::Operation::Operation(
const char *name,
41 QList<QGenericArgument *> args)
47 void DBusOperationQueueHandler::Operation::copy(
const char *name,
48 const QList<QGenericArgument *> &args)
50 Q_ASSERT(name != NULL);
52 m_name =
new char[qstrlen(name) + 1];
53 qstrcpy(m_name, name);
55 QListIterator<QGenericArgument *> it(args);
56 while (it.hasNext()) {
57 QGenericArgument *arg = it.next();
58 int type = QMetaType::type(arg->name());
59 if (!QMetaType::isRegistered(type)) {
62 << QString(QLatin1String(
"Type %1 not registered."))
63 .arg(QLatin1String(arg->name()));
65 Q_ASSERT(arg->name() != NULL);
67 char *localName =
new char[qstrlen(arg->name()) + 1];
68 qstrcpy(localName, arg->name());
69 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
70 void *localData = QMetaType::construct(type, arg->data());
72 void *localData = QMetaType::create(type, arg->data());
75 m_args << (
new QGenericArgument(localName, localData));
80 DBusOperationQueueHandler::Operation::~Operation()
85 foreach (QGenericArgument *arg, m_args) {
86 QMetaType::destroy(QMetaType::type(arg->name()), arg->data());
88 delete [] arg->name();
95 DBusOperationQueueHandler::DBusOperationQueueHandler(QObject *clientObject):
96 m_clientObject(clientObject),
97 m_maxNumberOfOperationParameters(6),
98 m_operationsStopped(false)
102 DBusOperationQueueHandler::~DBusOperationQueueHandler()
106 void DBusOperationQueueHandler::enqueueOperation(Operation *operation)
108 m_operationsQueue.enqueue(operation);
111 void DBusOperationQueueHandler::enqueueOperation(
const char *name,
112 QList<QGenericArgument *> args)
114 m_operationsQueue.enqueue(
new Operation(name, args));
117 void DBusOperationQueueHandler::execQueuedOperations()
119 m_operationsStopped =
false;
121 while (m_operationsStopped ==
false && !m_operationsQueue.empty()) {
122 Operation *op = m_operationsQueue.dequeue();
124 if (op->m_args.size() > m_maxNumberOfOperationParameters) {
125 qWarning() <<
"DBusOperationQueueHandler::execQueuedOperations(): "
126 "Maximum number of operation parameters exceeded(6).";
130 int indexOfMethod = m_clientObject->metaObject()->indexOfMethod(
131 QMetaObject::normalizedSignature(op->m_name));
133 QMetaMethod method = m_clientObject->metaObject()->method(indexOfMethod);
135 TRACE() <<
"Executing cached oparation: SIGNATURE:" <<
136 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
139 method.methodSignature();
142 switch (op->m_args.count()) {
143 case 0: TRACE(); method.invoke(m_clientObject);
break;
144 case 1: TRACE(); method.invoke(
146 *(op->m_args.at(0)));
break;
147 case 2: TRACE(); method.invoke(
150 *(op->m_args.at(1)));
break;
151 case 3: TRACE(); method.invoke(
155 *(op->m_args.at(2)));
break;
156 case 4: TRACE(); method.invoke(
161 *(op->m_args.at(3)));
break;
162 case 5: TRACE(); method.invoke(
168 *(op->m_args.at(4)));
break;
169 case 6: TRACE(); method.invoke(
176 *(op->m_args.at(5)));
break;
177 default: TRACE(); method.invoke(m_clientObject);
break;
183 void DBusOperationQueueHandler::removeOperation(
const char *name,
bool removeAll)
185 foreach (Operation *operation, m_operationsQueue) {
186 if (operation != NULL && qstrcmp(operation->m_name, name) == 0) {
187 m_operationsQueue.removeOne(operation);
194 bool DBusOperationQueueHandler::queueContainsOperation(
const char *name)
196 foreach (Operation *operation, m_operationsQueue)
197 if (operation != NULL && qstrcmp(operation->m_name, name) == 0)