void ServiceBrowser::reloadAttributesList() { QListWidgetItem *item = interfacesListWidget->currentItem(); if (!item) return; QServiceInterfaceDescriptor selectedImpl = item->data(Qt::UserRole).value<QServiceInterfaceDescriptor>(); QObject *implementationRef; if (selectedImplRadioButton->isChecked()) implementationRef = serviceManager->loadInterface(selectedImpl, 0, 0); else implementationRef = serviceManager->loadInterface(selectedImpl.interfaceName(), 0, 0); attributesListWidget->clear(); if (!implementationRef) { attributesListWidget->addItem(tr("(Error loading service plugin)")); return; } const QMetaObject *metaObject = implementationRef->metaObject(); attributesGroup->setTitle(tr("Invokable attributes for %1 class") .arg(QString(metaObject->className()))); for (int i=0; i<metaObject->methodCount(); i++) { QMetaMethod method = metaObject->method(i); attributesListWidget->addItem("[METHOD] " + QString(method.signature())); } for (int i=0; i<metaObject->propertyCount(); i++) { QMetaProperty property = metaObject->property(i); attributesListWidget->addItem("[PROPERTY] " + QString(property.name())); } }
void ServiceBrowser::reloadAttributesRadioButtonText() { QListWidgetItem *item = interfacesListWidget->currentItem(); if (!item) return; QServiceInterfaceDescriptor selectedImpl = item->data(Qt::UserRole).value<QServiceInterfaceDescriptor>(); QServiceInterfaceDescriptor defaultImpl = serviceManager->interfaceDefault(selectedImpl.interfaceName()); defaultImplRadioButton->setText(tr("Default implementation for %1\n(currently provided by %2)") .arg(defaultImpl.interfaceName()) .arg(defaultImpl.serviceName())); }
void ServiceBrowser::currentInterfaceImplChanged(QListWidgetItem *current, QListWidgetItem *previous) { Q_UNUSED(previous); if (!current) return; reloadAttributesList(); reloadAttributesRadioButtonText(); QServiceInterfaceDescriptor descriptor = current->data(Qt::UserRole).value<QServiceInterfaceDescriptor>(); if (descriptor.isValid()) { #if defined(Q_WS_MAEMO_5) defaultInterfaceButton->setText(tr("Set as default implementation for \n%1").arg(descriptor.interfaceName())); #else defaultInterfaceButton->setText(tr("Set as default implementation for %1").arg(descriptor.interfaceName())); #endif defaultInterfaceButton->setEnabled(true); } }
/*! \fn bool QServiceInterfaceDescriptor::operator==(const QServiceInterfaceDescriptor& other) const Compares a QServiceInterfaceDescriptor to \a other. Returns true if they are equal and false otherwise. */ bool QServiceInterfaceDescriptor::operator==(const QServiceInterfaceDescriptor& other) const { if (isValid() ^ other.isValid()) return false; if (!d) return true; if ((*d) == *(other.d)) return true; return false; }
bool lessThan(const QServiceInterfaceDescriptor &d1, const QServiceInterfaceDescriptor &d2) { return (d1.majorVersion() < d2.majorVersion()) || ( d1.majorVersion() == d2.majorVersion() && d1.minorVersion() < d2.minorVersion()); }
void tst_QServiceInterfaceDescriptor::destructor() { //test destructor if descriptor is invalid QServiceInterfaceDescriptor* invalid = new QServiceInterfaceDescriptor(); delete invalid; //test destructor if descriptor is valid QServiceInterfaceDescriptor* valid = new QServiceInterfaceDescriptor(); QServiceInterfaceDescriptorPrivate *d = new QServiceInterfaceDescriptorPrivate(); QServiceInterfaceDescriptorPrivate::setPrivate(valid, d); d->serviceName = "name"; d->interfaceName = "interface"; d->major = 3; d->minor = 1; d->attributes.insert(QServiceInterfaceDescriptor::Location, QString("myValue")); d->attributes.insert(QServiceInterfaceDescriptor::Capabilities, QStringList() << "val1" << "val2"); d->attributes.insert(QServiceInterfaceDescriptor::ServiceDescription, QString("This is the service description")); d->attributes.insert(QServiceInterfaceDescriptor::InterfaceDescription, QString("This is the interface description")); d->customAttributes.insert("ckey", "cvalue"); QVERIFY(valid->isValid()); delete valid; }
void ServiceBrowser::setDefaultInterfaceImplementation() { QListWidgetItem *item = interfacesListWidget->currentItem(); if (!item) return; QServiceInterfaceDescriptor descriptor = item->data(Qt::UserRole).value<QServiceInterfaceDescriptor>(); if (descriptor.isValid()) { QServiceManager *manager = serviceManager; if (descriptor.scope() == QService::SystemScope) manager = systemManager; if (manager->setInterfaceDefault(descriptor)) { int currentIndex = interfacesListWidget->row(item); reloadInterfaceImplementationsList(); interfacesListWidget->setCurrentRow(currentIndex); } else { qWarning() << "Unable to set default service for interface:" << descriptor.interfaceName(); } } }
void ToDoTool::init() { bool ok; QString interfaceName = QInputDialog::getText(this, tr("ToDoTool"), tr("Specify Notes Manager interface:"), QLineEdit::Normal, "com.nokia.qt.examples.NotesManager", &ok); if (ok) { QServiceInterfaceDescriptor desc = serviceManager->interfaceDefault(interfaceName); if (desc.isValid()) { QServiceManager mgr; notesManager = mgr.loadInterface(desc); if (notesManager) notesManager->setParent(this); bool connect; QMetaObject::invokeMethod(notesManager, "init", Q_RETURN_ARG(bool, connect)); if (connect) { currentNote = 1; searchWord = ""; refreshList(); addButton->setEnabled(true); deleteButton->setEnabled(true); searchButton->setEnabled(true); nextButton->setEnabled(true); prevButton->setEnabled(true); QObject::connect(notesManager, SIGNAL(soundAlarm(QDateTime)), this, SLOT(soundAlarm(QDateTime))); } else { QMessageBox msgBox; msgBox.setWindowTitle(tr("ToDoTool")); msgBox.setText("Unable to access notes manager database\n in current or home directory"); msgBox.exec(); } } else {
QDebug operator<<(QDebug dbg, const QServiceInterfaceDescriptor &desc) { if (desc.isValid()) { QString serviceInterface = QString(QLatin1String("%1 %2.%3")).arg(desc.interfaceName()) .arg(desc.majorVersion() < 0 ? '?' : desc.majorVersion()) .arg(desc.minorVersion() < 0 ? '?' : desc.minorVersion()); dbg.nospace() << "QServiceInterfaceDescriptor("; dbg.nospace() << "service=" << desc.serviceName() << ", "; dbg.nospace() << "interface=" << serviceInterface; dbg.nospace() << ")"; } else { dbg.nospace() << "QServiceInterfaceDescriptor(invalid)"; } return dbg.space(); }
void tst_QServiceInterfaceDescriptor::comparison() { QServiceInterfaceDescriptor desc; QVERIFY(desc.majorVersion() == -1); QVERIFY(desc.minorVersion() == -1); QVERIFY(desc.serviceName().isEmpty()); QVERIFY(desc.interfaceName().isEmpty()); QVERIFY(!desc.attribute(QServiceInterfaceDescriptor::Capabilities).isValid()); QVERIFY(!desc.attribute(QServiceInterfaceDescriptor::Location).isValid()); QVERIFY(!desc.attribute(QServiceInterfaceDescriptor::InterfaceDescription).isValid()); QVERIFY(!desc.attribute(QServiceInterfaceDescriptor::ServiceDescription).isValid()); QVERIFY(desc.scope() == QService::UserScope); QVERIFY(!desc.isValid()); QServiceInterfaceDescriptor copy(desc); QVERIFY(copy.majorVersion() == -1); QVERIFY(copy.minorVersion() == -1); QVERIFY(copy.serviceName().isEmpty()); QVERIFY(copy.interfaceName().isEmpty()); QVERIFY(!copy.attribute(QServiceInterfaceDescriptor::Capabilities).isValid()); QVERIFY(!copy.attribute(QServiceInterfaceDescriptor::Location).isValid()); QVERIFY(!copy.attribute(QServiceInterfaceDescriptor::InterfaceDescription).isValid()); QVERIFY(!copy.attribute(QServiceInterfaceDescriptor::ServiceDescription).isValid()); QVERIFY(copy.scope() == QService::UserScope); QVERIFY(!copy.isValid()); QVERIFY(desc == copy); QServiceInterfaceDescriptor valid; QServiceInterfaceDescriptorPrivate *d = new QServiceInterfaceDescriptorPrivate(); QServiceInterfaceDescriptorPrivate::setPrivate(&valid, d); d->serviceName = "name"; d->interfaceName = "interface"; d->major = 3; d->minor = 1; d->attributes.insert(QServiceInterfaceDescriptor::ServiceDescription, QString("mydescription")); d->customAttributes.insert(QString("ckey"), QString("cvalue")); d->scope = QService::SystemScope; QCOMPARE(valid.interfaceName(), QString("interface")); QCOMPARE(valid.serviceName(), QString("name")); QCOMPARE(valid.majorVersion(), 3); QCOMPARE(valid.minorVersion(), 1); QCOMPARE(valid.customAttribute("ckey"), QString("cvalue")); QCOMPARE(valid.attribute(QServiceInterfaceDescriptor::ServiceDescription).toString(), QString("mydescription")); QCOMPARE(valid.attribute(QServiceInterfaceDescriptor::Location).toString(), QString("")); QCOMPARE(valid.scope(), QService::SystemScope); QVERIFY(valid.isValid()); QVERIFY(valid != desc); QVERIFY(desc != valid); //test copy constructor QServiceInterfaceDescriptor validCopy(valid); QVERIFY(valid==validCopy); QVERIFY(validCopy==valid); QServiceInterfaceDescriptorPrivate::getPrivate(&validCopy)->attributes.insert(QServiceInterfaceDescriptor::Location, QString("myValue")); QVERIFY(valid!=validCopy); QVERIFY(validCopy!=valid); QCOMPARE(validCopy.interfaceName(), QString("interface")); QCOMPARE(validCopy.serviceName(), QString("name")); QCOMPARE(validCopy.majorVersion(), 3); QCOMPARE(validCopy.minorVersion(), 1); QCOMPARE(validCopy.attribute(QServiceInterfaceDescriptor::Location).toString(), QString("myValue")); QCOMPARE(validCopy.attribute(QServiceInterfaceDescriptor::ServiceDescription).toString(), QString("mydescription")); QCOMPARE(validCopy.customAttribute("ckey"),QString("cvalue")); QCOMPARE(validCopy.scope(), QService::SystemScope); QVERIFY(validCopy.isValid()); //test assignment operator QServiceInterfaceDescriptor validCopy2 = valid; QVERIFY(valid==validCopy2); QVERIFY(validCopy2==valid); QServiceInterfaceDescriptorPrivate::getPrivate(&validCopy2)->attributes.insert(QServiceInterfaceDescriptor::Location, QString("myValue2")); QVERIFY(valid!=validCopy2); QVERIFY(validCopy2!=valid); QCOMPARE(validCopy2.interfaceName(), QString("interface")); QCOMPARE(validCopy2.serviceName(), QString("name")); QCOMPARE(validCopy2.majorVersion(), 3); QCOMPARE(validCopy2.minorVersion(), 1); QCOMPARE(validCopy2.attribute(QServiceInterfaceDescriptor::Location).toString(), QString("myValue2")); QCOMPARE(validCopy2.customAttribute("ckey"),QString("cvalue")); QCOMPARE(validCopy2.attribute(QServiceInterfaceDescriptor::ServiceDescription).toString(), QString("mydescription")); QCOMPARE(validCopy2.scope(), QService::SystemScope); QVERIFY(validCopy2.isValid()); //test customAttributes d->customAttributes.insert(QString("ckey"), QString("cvalue")); d->customAttributes.insert(QString("ckey1"), QString("cvalue1")); d->customAttributes.insert(QString("ckey2"), QString("cvalue2")); QStringList customAttributes = valid.customAttributes(); QVERIFY(customAttributes.contains("ckey")); QVERIFY(customAttributes.contains("ckey1")); QVERIFY(customAttributes.contains("ckey2")); QCOMPARE(customAttributes.count(), 3); }
void tst_QServiceInterfaceDescriptor::testStreamOperators() { QByteArray byteArray; QBuffer buffer(&byteArray); buffer.open(QIODevice::ReadWrite); QDataStream stream(&buffer); QServiceInterfaceDescriptor empty; QVERIFY(!empty.isValid()); //stream invalid into invalid QServiceInterfaceDescriptor invalid; QVERIFY(!invalid.isValid()); QVERIFY(invalid == empty); buffer.seek(0); stream << empty; buffer.seek(0); stream >> invalid; QVERIFY(invalid == empty); //stream invalid into valid QServiceInterfaceDescriptor valid; QServiceInterfaceDescriptorPrivate *d = new QServiceInterfaceDescriptorPrivate(); QServiceInterfaceDescriptorPrivate::setPrivate(&valid, d); d->serviceName = "name"; d->interfaceName = "interface"; d->major = 3; d->minor = 1; d->attributes.insert(QServiceInterfaceDescriptor::Location, QString("myValue")); d->attributes.insert(QServiceInterfaceDescriptor::Capabilities, QStringList() << "val1" << "val2"); d->attributes.insert(QServiceInterfaceDescriptor::ServiceDescription, QString("This is the service description")); d->attributes.insert(QServiceInterfaceDescriptor::InterfaceDescription, QString("This is the interface description")); d->customAttributes.insert(QString("key1"), QString("value1")); d->customAttributes.insert(QString("abcd"), QString("efgh")); d->customAttributes.insert(QString("empty"), QString("")); d->scope = QService::SystemScope; QVERIFY(valid.isValid()); QServiceInterfaceDescriptor validref = valid; QVERIFY(validref == valid); QVERIFY(!(validref!=valid)); QVERIFY(empty!=validref); buffer.seek(0); stream << empty; buffer.seek(0); stream >> validref; QVERIFY(empty == validref); QVERIFY(!(empty!=validref)); QVERIFY(validref != valid); //stream valid into invalid QServiceInterfaceDescriptor invalid2; QVERIFY(!invalid2.isValid()); validref = valid; QVERIFY(validref == valid); QVERIFY(validref != invalid2); buffer.seek(0); stream << validref; buffer.seek(0); stream >> invalid2; QVERIFY(invalid2 == validref); QVERIFY(!(invalid2 != validref)); QVERIFY(invalid2.isValid()); QVERIFY(invalid2.interfaceName() == QString("interface")); QVERIFY(invalid2.serviceName() == QString("name")); QVERIFY(invalid2.majorVersion() == 3); QVERIFY(invalid2.minorVersion() == 1); QVERIFY(invalid2.attribute(QServiceInterfaceDescriptor::Location).toString() == QString("myValue")); QVERIFY(invalid2.attribute(QServiceInterfaceDescriptor::Capabilities).toStringList() == (QStringList() << "val1" << "val2")); QVERIFY(invalid2.attribute(QServiceInterfaceDescriptor::ServiceDescription).toString() == QString("This is the service description")); QVERIFY(invalid2.attribute(QServiceInterfaceDescriptor::InterfaceDescription).toString() == QString("This is the interface description")); QCOMPARE(invalid2.customAttribute("key1"), QString("value1")); QCOMPARE(invalid2.customAttribute("abcd"), QString("efgh")); QCOMPARE(invalid2.customAttribute("notvalid"), QString()); QVERIFY(invalid2.customAttribute("notvalid").isEmpty()); QVERIFY(invalid2.customAttribute("notvalid").isNull()); QCOMPARE(invalid2.customAttribute("empty"), QString("")); QVERIFY(invalid2.customAttribute("empty").isEmpty()); QVERIFY(!invalid2.customAttribute("empty").isNull()); QCOMPARE(invalid2.scope(), QService::SystemScope); //stream valid into valid QServiceInterfaceDescriptor valid2; QServiceInterfaceDescriptorPrivate *d2 = new QServiceInterfaceDescriptorPrivate(); QServiceInterfaceDescriptorPrivate::setPrivate(&valid2, d2); d2->serviceName = "name2"; d2->interfaceName = "interface2"; d2->major = 5; d2->minor = 6; d2->attributes.insert(QServiceInterfaceDescriptor::Location, QString("myValue1")); d2->attributes.insert(QServiceInterfaceDescriptor::Capabilities, QStringList() << "val3" << "val4"); d2->attributes.insert(QServiceInterfaceDescriptor::ServiceDescription, QString("This is the second service description")); d2->attributes.insert(QServiceInterfaceDescriptor::InterfaceDescription, QString("This is the second interface description")); d2->customAttributes.insert(QString("key1"), QString("value2")); d2->customAttributes.insert(QString("abcd1"), QString("efgh")); d2->customAttributes.insert(QString("empty"), QString("")); d2->scope = QService::UserScope; QVERIFY(valid2.isValid()); QCOMPARE(valid2.customAttribute("key1"), QString("value2")); QCOMPARE(valid2.customAttribute("abcd1"), QString("efgh")); QCOMPARE(valid2.customAttribute("abcd"), QString()); QVERIFY(valid2.customAttribute("abcd").isEmpty()); QVERIFY(valid2.customAttribute("abcd").isNull()); QCOMPARE(valid2.customAttribute("empty"), QString("")); QVERIFY(valid2.customAttribute("empty").isEmpty()); QVERIFY(!valid2.customAttribute("empty").isNull()); QVERIFY(valid2 != valid); QVERIFY(!(valid2 == valid)); buffer.seek(0); stream << valid; buffer.seek(0); stream >> valid2; QVERIFY(valid2 == valid); QVERIFY(!(valid2 != valid)); QVERIFY(valid2.isValid()); QVERIFY(valid2.interfaceName() == QString("interface")); QVERIFY(valid2.serviceName() == QString("name")); QVERIFY(valid2.majorVersion() == 3); QVERIFY(valid2.minorVersion() == 1); QVERIFY(valid2.attribute(QServiceInterfaceDescriptor::Location).toString() == QString("myValue")); QVERIFY(valid2.attribute(QServiceInterfaceDescriptor::Capabilities).toStringList() == (QStringList() << "val1" << "val2")); QVERIFY(valid2.attribute(QServiceInterfaceDescriptor::ServiceDescription).toString() == QString("This is the service description")); QVERIFY(valid2.attribute(QServiceInterfaceDescriptor::InterfaceDescription).toString() == QString("This is the interface description")); QCOMPARE(valid2.customAttribute("key1"), QString("value1")); QCOMPARE(valid2.customAttribute("abcd"), QString("efgh")); QCOMPARE(valid2.customAttribute("notvalid"), QString()); QVERIFY(valid2.customAttribute("notvalid").isEmpty()); QVERIFY(valid2.customAttribute("notvalid").isNull()); QCOMPARE(valid2.customAttribute("empty"), QString("")); QVERIFY(valid2.customAttribute("empty").isEmpty()); QVERIFY(!valid2.customAttribute("empty").isNull()); QCOMPARE(valid2.customAttribute("abcd1"), QString()); QCOMPARE(valid2.scope(), QService::SystemScope); }
void ctkQtMobilityServiceRuntime::processPlugin(QSharedPointer<ctkPlugin> plugin) { QHash<QString, QString> headers = plugin->getHeaders(); QHash<QString, QString>::const_iterator it = headers.find(ctkQtMobilityServiceConstants::SERVICE_DESCRIPTOR); ctkLogService* log = ctkQtMobilityServiceActivator::getLogService(); CTK_DEBUG(log) << "Process header " << ctkQtMobilityServiceConstants::SERVICE_DESCRIPTOR << " for plugin #" << plugin->getPluginId() << ": " << (it != headers.end() ? it.value() : "[missing]"); if (it != headers.end()) { QString sd = it.value(); if (sd.isEmpty()) { QString msg = QString("Header ") + ctkQtMobilityServiceConstants::SERVICE_DESCRIPTOR + " empty."; ctkQtMobilityServiceActivator::logError(plugin->getPluginContext(), msg); return; } QByteArray serviceDescription = plugin->getResource(sd); QBuffer serviceBuffer(&serviceDescription); qServiceManager.addService(&serviceBuffer); QServiceManager::Error error = qServiceManager.error(); if (!(error == QServiceManager::NoError || error == QServiceManager::ServiceAlreadyExists)) { QString msg = QString("Registering the QtMobility service descriptor failed: ") + getQServiceManagerErrorString(error); ctkQtMobilityServiceActivator::logError(plugin->getPluginContext(), msg); return; } QString serviceName = plugin->getSymbolicName() + "_" + plugin->getVersion().toString(); QList<QServiceInterfaceDescriptor> descriptors = qServiceManager.findInterfaces(serviceName); if (descriptors.isEmpty()) { QString msg = QString("No interfaces found for service name ") + serviceName; ctkQtMobilityServiceActivator::logWarning(plugin->getPluginContext(), msg); return; } QListIterator<QServiceInterfaceDescriptor> it(descriptors); while (it.hasNext()) { QServiceInterfaceDescriptor descr = it.next(); CTK_DEBUG(ctkQtMobilityServiceActivator::getLogService()) << "Registering:" << descr.interfaceName(); QStringList classes; ctkDictionary props; QStringList customKeys = descr.customAttributes(); QStringListIterator keyIt(customKeys); bool classAttrFound = false; while (keyIt.hasNext()) { QString key = keyIt.next(); if (key == ctkPluginConstants::OBJECTCLASS) { classAttrFound = true; classes << descr.customAttribute(key); } else { props.insert(key, descr.customAttribute(key)); } } if (!classAttrFound) { QString msg = QString("The custom attribute \"") + ctkPluginConstants::OBJECTCLASS + "\" is missing in the interface description of \"" + descr.interfaceName(); ctkQtMobilityServiceActivator::logError(plugin->getPluginContext(), msg); continue; } ctkQtMobilityServiceFactory* serviceObject = new ctkQtMobilityServiceFactory(descr, this, plugin); ctkServiceRegistration serviceReg = plugin->getPluginContext()->registerService(classes, serviceObject, props); if (serviceReg) { mapPluginToServiceFactory.insert(plugin, serviceObject); mapPluginToServiceRegistration.insert(plugin, serviceReg); } else { QString msg = QString("Could not register QtMobility service ") + descr.serviceName() + " " + descr.interfaceName(); ctkQtMobilityServiceActivator::logError(plugin->getPluginContext(), msg); continue; } } } }