diff -r 5d007b20cfd0 -r cd2778e5acfe qthighway/xqservice/src/xqappmgr_p.cpp --- a/qthighway/xqservice/src/xqappmgr_p.cpp Tue Aug 31 16:02:37 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,542 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU Lesser General Public License as published by -* the Free Software Foundation, version 2.1 of the License. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this program. If not, -* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/". -* -* Description: -* -*/ - -#include -#include -#include -#include -#include -#include - -#include "xqservicelog.h" -#include "xqaiwutils.h" -#include "xqaiwuridriver.h" -#include "xqaiwdecl.h" -#include "xqappmgr_p.h" - -/*! - \class XQApplicationManagerPrivate - \brief Private implementation of the XQApplicationManager -*/ - -XQApplicationManagerPrivate::XQApplicationManagerPrivate(): - serviceMgr(0), - aiwUtilities(0) - -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate"); - serviceMgr = new XQServiceManager(); -} - -XQApplicationManagerPrivate::~XQApplicationManagerPrivate() -{ - XQSERVICE_DEBUG_PRINT("~XQApplicationManagerPrivate"); - delete serviceMgr; - delete aiwUtilities; -} - -XQAiwRequest* XQApplicationManagerPrivate::create( const QString &interface, const QString &operation, bool embedded) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create(interface)"); - return create("", interface, operation, embedded); -} - -XQAiwRequest* XQApplicationManagerPrivate::create( - const QString &service, const QString &interface, const QString &operation, bool embedded) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create(service+interface)"); - - QList impls; - if (service.isEmpty()) - impls = serviceMgr->findFirstInterface(interface); - else - impls = serviceMgr->findFirstInterface(service, interface); - - // Pick up the first implementation - if (impls.count()) - { - return new XQAiwRequest(impls[0], operation, embedded); - } - return 0; -} - - -XQAiwRequest* XQApplicationManagerPrivate::create( - const XQAiwInterfaceDescriptor &implementation, const QString &operation, bool embedded) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create (impl)"); - return new XQAiwRequest(implementation, operation, embedded); -} - -XQAiwRequest* XQApplicationManagerPrivate::create( - const QUrl &uri, const XQAiwInterfaceDescriptor *implementation, bool embedded) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create (uri)"); - XQSERVICE_DEBUG_PRINT("uri=%s", qPrintable(uri.toString())); - - if (!uri.isValid()) - { - XQSERVICE_CRITICAL_PRINT("Invalid URI %s", qPrintable(uri.toString())); - return 0; - } - - if (hasCustomHandler(uri)) - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::custom handler applied"); - XQAiwInterfaceDescriptor nullDescr; - return new XQAiwRequest(uri, nullDescr, XQOP_URI_VIEW); - } - - const XQAiwInterfaceDescriptor *impl = implementation; - QList impls; - if (impl == 0) - { - // Implementation not given, find first one - impls = list(uri); - if (impls.count()) - { - impl = &impls[0]; - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create (impl) use first)"); - } - } - - XQAiwRequest *req = 0; - if (impl != 0) - { - // Create service request for viewing the URI - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create (impl) creating request)"); - req = new XQAiwRequest(uri, *impl, XQOP_URI_VIEW); - if (req) - { - req->setEmbedded(embedded); - } - } - - return req; - - -} - -XQAiwRequest* XQApplicationManagerPrivate::create( - const QFile &file, const XQAiwInterfaceDescriptor *implementation, bool embedded) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create(file)"); - XQSERVICE_DEBUG_PRINT("file=%s", qPrintable(file.fileName())); - - const XQAiwInterfaceDescriptor *impl = implementation; - QList impls; - if (impl == 0) - { - // Implementation not given, find services capable of handling the "file" - impls = list(file); - if (impls.count()) - { - impl = &impls[0]; - } - } - - XQAiwRequest * req = 0; - if (impl != 0) - { - QVariant v = impl->property(XQAiwInterfaceDescriptor::ImplementationId); - req = new XQAiwRequest(file, *impl, XQOP_FILE_VIEW); - if (req) - { - req->setEmbedded(embedded); - XQSERVICE_DEBUG_PRINT("File handled by %x", v.toInt()); - } - } - - return req; -} - -XQAiwRequest* XQApplicationManagerPrivate::create( - const XQSharableFile &file, const XQAiwInterfaceDescriptor *implementation, bool embedded) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::create(XQSharableFile)"); - if (!file.isValid()) - { - XQSERVICE_DEBUG_PRINT("\tInvalid XQSharableFile)"); - return 0; - } - - const XQAiwInterfaceDescriptor *impl = implementation; - QList impls; - if (impl == 0) - { - // Implementation not given, find services capable of handling the "file" - impls = list(file); - if (impls.count()) - { - impl = &impls[0]; - } - } - - XQAiwRequest * req = 0; - if (impl != 0) - { - QVariant v = impl->property(XQAiwInterfaceDescriptor::ImplementationId); - req = new XQAiwRequest(file, *impl, XQOP_FILE_VIEW_SHARABLE); - if (req) - { - req->setEmbedded(embedded); - XQSERVICE_DEBUG_PRINT("File handled by %x", v.toInt()); - } - } - - return req; -} - - - -QList XQApplicationManagerPrivate::list( - const QString &interface, const QString& operation) -{ - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::list(interface)"); - Q_UNUSED(operation); - - return serviceMgr->findInterfaces(interface); -} - -QList XQApplicationManagerPrivate::list( - const QString &service, const QString& interface, const QString& operation) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::list (service+interface)"); - Q_UNUSED(operation); - - return serviceMgr->findInterfaces(service, interface); -} - -QList XQApplicationManagerPrivate::list( - const QUrl &uri) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::list (uri) %s", qPrintable(uri.toString())); - - QList result; - if (!uri.isValid()) - { - XQSERVICE_CRITICAL_PRINT("Invalid URI %s", qPrintable(uri.toString())); - return result; // Empty - } - - QString scheme = uri.scheme(); - - if (scheme.compare(XQURI_SCHEME_FILE,Qt::CaseInsensitive) == 0) - { - QFile file (uri.toLocalFile()); - return list(file); // Apply file based listing - } - - // Find all services implementing URI interface and support URI scheme - QList uriHandlers; - uriHandlers = list(XQI_URI_VIEW, ""); - - // Pick up services supporting the required scheme - foreach (XQAiwInterfaceDescriptor uh, uriHandlers) - { - // Find services that support the scheme - if (uh.customProperty(XQCUSTOM_PROP_SCHEMES).contains(scheme,Qt::CaseInsensitive)) // Allow multiple schemes in same string - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Service %s can handle scheme %s", - qPrintable(uh.serviceName()), qPrintable(scheme)) - result.append(uh); - } - } - - return result; -} - -// -// List services capable of handling the file by MIME type -// -QList XQApplicationManagerPrivate::list(const QFile &file) -{ - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::list (file) %s", qPrintable(file.fileName())); - - // List first MIME handlers for file - QList mimeHandlers; - mimeHandlers = listMimeHandlers(file); - - // Then list those file services that can support the MIME type - return listFileHandlers(mimeHandlers); -} - -// -// List services capable of handling the sharable file by MIME type -// -QList XQApplicationManagerPrivate::list(const XQSharableFile &file) -{ - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::list (handle)"); - - // List first MIME handlers for the sharable file - QList mimeHandlers; - if (!file.isValid()) - { - return mimeHandlers; // Empty set - } - mimeHandlers = listMimeHandlers(file); - - // Then list those file services that can support the MIME type - return listFileHandlers(mimeHandlers); -} - - -int XQApplicationManagerPrivate::lastError() const -{ - int err=0; - err = serviceMgr->latestError(); - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: lastError=%d", err); - return err; -} - -bool XQApplicationManagerPrivate::isRunning(const XQAiwInterfaceDescriptor& implementation) const -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate isRunning"); - return serviceMgr->isRunning(implementation); -} - -bool XQApplicationManagerPrivate::getDrmAttributes(const QFile &file, const QList &attributeNames, QVariantList &attributeValues) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate drmAttributes"); - if (aiwUtilities == 0) - aiwUtilities = new XQAiwUtils(); - return aiwUtilities->getDrmAttributes(file.fileName(), attributeNames, attributeValues); -} - -bool XQApplicationManagerPrivate::getDrmAttributes(const XQSharableFile &file, const QList &attributeNames, QVariantList &attributeValues) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate drmAttributes"); - if (aiwUtilities == 0) - aiwUtilities = new XQAiwUtils(); - return aiwUtilities->getDrmAttributes(file,attributeNames, attributeValues); -} - -int XQApplicationManagerPrivate::status(const XQAiwInterfaceDescriptor& implementation) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate status"); - QString statusKeyValue = implementation.customProperty(XQCUSTOM_PROP_AIW_SERVICE_STATUS); - if (statusKeyValue.isEmpty()) - { - // No custom property, have to assume service is enabled - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate no custom property %s", - XQCUSTOM_PROP_AIW_SERVICE_STATUS); - return XQApplicationManager::Unknown; - } - - if (aiwUtilities == 0) - aiwUtilities = new XQAiwUtils(); - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate custom property value=%s", - qPrintable(statusKeyValue)); - - bool b=false; - int keyId = aiwUtilities->toIntFromHex(statusKeyValue, &b); - if (!b) - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate bad custom property value"); - return XQApplicationManager::Unknown; - } - - XQSettingsManager settingsManager; - int implId = implementation.property(XQAiwInterfaceDescriptor::ImplementationId).toInt(); - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate %x,%x", keyId, implId); - - XQSettingsKey statusKey (XQSettingsKey::TargetCentralRepository, implId, keyId); - QVariant value = settingsManager.readItemValue(statusKey); - if (value.isNull()) - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate Cenrep %x does not contain key %x", - implId, keyId); - return XQApplicationManager::Unknown; - } - - - int status = value.toInt(&b); - if (!b) - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate invalid status value %s", - qPrintable(value.toString())); - return XQApplicationManager::Unknown; - } - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate status=%d", status); - - return status; - -} - -// ---- PRIVATE FUNCTIONS ---- - -bool XQApplicationManagerPrivate::hasCustomHandler(const QUrl &uri) const -{ - return XQAiwUriDriver::hasCustomHandler(uri); -} - -// -// Get file handlers -// TODO: Currently only one, default handler is returned !!! -// Possibly later all handlers need to be returned. -// -QList XQApplicationManagerPrivate::listMimeHandlers(const QFile &file) -{ - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::listMimeHandlers %s", qPrintable(file.fileName())); - QList mimeHandlers; - - if (aiwUtilities == 0) - aiwUtilities = new XQAiwUtils(); - if (aiwUtilities == 0) - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Can not create aiw utils"); - return mimeHandlers; - } - - XQAiwInterfaceDescriptor descriptor; - - // Find default application that can handle MIME type (only one at the moment) - int applicationId = 0; - if (aiwUtilities->findApplication(file, applicationId) != XQService::ENoError) - { - return mimeHandlers; // Empty set - } - - // Set incomplete descriptor - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Found file handler %x", applicationId); - descriptor.setProperty(XQAiwInterfaceDescriptor::ImplementationId, QVariant(applicationId)); - - mimeHandlers.append(descriptor); - - return mimeHandlers; -} - -// -// Get handlers for sharable file -// TODO: Currently only one, default handler is returned !!! -// Possibly later all handlers need to be returned. -// -QList XQApplicationManagerPrivate::listMimeHandlers(const XQSharableFile &file) -{ - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::listMimeHandlers (handle)"); - QList mimeHandlers; - - if (aiwUtilities == 0) - aiwUtilities = new XQAiwUtils(); - if (aiwUtilities == 0) - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Can not create aiw utils"); - return mimeHandlers; - } - - XQAiwInterfaceDescriptor descriptor; - - // Find default application that can handle MIME type (only one at the moment) - int applicationId = 0; - if (aiwUtilities->findApplication(file, applicationId) != XQService::ENoError) - { - return mimeHandlers; // Empty set - } - - // Set incomplete descriptor - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Found file handler %x", applicationId); - descriptor.setProperty(XQAiwInterfaceDescriptor::ImplementationId, QVariant(applicationId)); - - mimeHandlers.append(descriptor); - - return mimeHandlers; -} - - -// To be called only for URI having scheme XQURI_SCHEME_ACTIVITY -// Check that application exists and fill in only the implementationId -bool XQApplicationManagerPrivate::getAppDescriptor(const QUrl &uri, XQAiwInterfaceDescriptor *descriptor) -{ - - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::getAppDescriptor %s)", qPrintable(uri.toString())); - - if (aiwUtilities == 0) - aiwUtilities = new XQAiwUtils(); - if (aiwUtilities == 0) - { - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Can not create aiw utils"); - return false; - } - - int applicationId = 0; - if (aiwUtilities->findApplication(uri, applicationId) != XQService::ENoError) - { - return false; // No application registered for file - } - - // Create incomplete descriptor - descriptor->setProperty(XQAiwInterfaceDescriptor::ImplementationId, QVariant(applicationId)); - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Found uri handler %x", applicationId); - - return true; -} - - -// -// Get file handlers that can support the give MIME type -// -QList XQApplicationManagerPrivate::listFileHandlers( - const QList &mimeHandlers) -{ - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate::listFileHandlers"); - - // Find all services implementing URI interface, support "file" scheme and can handle the file - // by MIME type - QList fileServices; - fileServices = list(XQI_FILE_VIEW, ""); - if (fileServices.count() == 0) - { - return fileServices; // Empty set - } - - QList result; - foreach (XQAiwInterfaceDescriptor fs, fileServices) - { - // Find services that support the file scheme - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Service %s can handle file", qPrintable(fs.serviceName())); - int serviceAppId = fs.property(XQAiwInterfaceDescriptor::ImplementationId).toInt(); - foreach (XQAiwInterfaceDescriptor mh, mimeHandlers) - { - int mimeAppId = mh.property(XQAiwInterfaceDescriptor::ImplementationId).toInt(); - if (mimeAppId == serviceAppId) - { - // Return only those services that support file scheme and claim to support also MIME type - XQSERVICE_DEBUG_PRINT("XQApplicationManagerPrivate:: Service %s (UID=%x) can handle file and MIME type", - qPrintable(fs.serviceName()), serviceAppId); - result.append(fs); - } - } - } - - if (result.isEmpty()) - { - // No service support present, try using the MIME handlers via old way - return mimeHandlers; - } - return result; -}