diff -r 885c2596c964 -r 5d007b20cfd0 qthighway/xqservice/src/xqaiwuridriver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qthighway/xqservice/src/xqaiwuridriver.cpp Tue Aug 31 16:02:37 2010 +0300 @@ -0,0 +1,238 @@ +/* +* 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 "xqserviceglobal.h" +#include "xqservicelog.h" +#include "xqaiwuridriver.h" +#include // Integrate to activity manager + +using namespace QtMobility; + +XQAiwUriDriver::XQAiwUriDriver(const QUrl &uri, const XQAiwInterfaceDescriptor& descriptor, const QString &operation) + : XQAiwRequestDriver(), + mUtilities(NULL) +{ + + mErrorMsg = ""; + mDescr = descriptor; + mUri = uri; + mOperation = operation; + + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::XQAiwUriDriver: %s", + qPrintable(mUri.toString())); + +} + +XQAiwUriDriver::~XQAiwUriDriver() +{ + XQSERVICE_DEBUG_PRINT("~XQAiwUriDriver::XQAiwUriDriver"); + delete mUtilities; + +} + +QAction *XQAiwUriDriver::createAction() +{ + return NULL; // Not supported +} + +void XQAiwUriDriver::setArguments(const QList &arguments) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::setArguments"); + mArguments = arguments; +} + + +bool XQAiwUriDriver::send(QVariant& retValue) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::send %s", qPrintable(mUri.toString())); + + mErrorCode = XQService::ENoError; + + // Browser URI + if (mUri.scheme().compare("http", Qt::CaseInsensitive) == 0 || + mUri.scheme().compare("https", Qt::CaseInsensitive) == 0) + { + XQSERVICE_DEBUG_PRINT("Apply QDesktopServices::openUrl"); + bool b = QDesktopServices::openUrl(mUri); + if (!b) + { + mErrorCode = XQService::EConnectionError; + mErrorMsg = XQAiwUtils::createErrorMessage(mErrorCode, "QDesktopServices::openUrl", mUri.toString()); + } + return b; + } + + // "appto" URI + if (mUri.scheme().compare(XQURI_SCHEME_ACTIVITY,Qt::CaseInsensitive) == 0) + { + return handleApptoUri(mUri); + } + + // + // The rest + // + mErrorCode = XQService::EArgumentError; + mErrorMsg = XQAiwUtils::createErrorMessage(mErrorCode, "XQAiwUriDriver:Not custom handler for", mUri.toString()); + + return false; + +} + +const QString& XQAiwUriDriver::lastErrorMessage() const +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::lastErrorMessage: %s", qPrintable(mErrorMsg)); + return mErrorMsg; +} + +int XQAiwUriDriver::lastError() const +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::lastError %d", mErrorCode); + return mErrorCode; +} + +const XQAiwInterfaceDescriptor &XQAiwUriDriver::descriptor() const +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::descriptor"); + return mDescr; +} + +void XQAiwUriDriver::setEmbedded(bool embedded) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::setEmbedded"); + mEmbedded = embedded; +} +bool XQAiwUriDriver::isEmbedded() const +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::isEmbedded"); + return mEmbedded; +} + +void XQAiwUriDriver::setOperation(const QString &operation) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::setOperation"); + mOperation = operation; +} +const QString &XQAiwUriDriver::operation() const +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::operation"); + return mOperation; +} + +void XQAiwUriDriver::setSynchronous(bool synchronous) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::setSynchronous"); + mSynchronous = synchronous; +} +bool XQAiwUriDriver::isSynchronous() const +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::isSynchronous"); + return mSynchronous; +} + +// +// Check if we can handle the URI +// +bool XQAiwUriDriver::hasCustomHandler(const QUrl &uri) +{ + QString scheme = uri.scheme(); + return (scheme.compare(XQURI_SCHEME_ACTIVITY,Qt::CaseInsensitive) == 0 || + scheme.compare(XQURI_SCHEME_HTTP,Qt::CaseInsensitive) == 0 || + scheme.compare(XQURI_SCHEME_HTTPS,Qt::CaseInsensitive) == 0); +} + + +void XQAiwUriDriver::handleAsyncResponse(const QVariant& value) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::handleAsyncResponse"); + emit requestOk(value); +} + +void XQAiwUriDriver::handleAsyncError(int err) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::handleAsyncError"); + + mErrorCode = err; + mErrorMsg = XQAiwUtils::createErrorMessage(mErrorCode,"XQAiwUriDriver", "async send"); + emit requestError(mErrorCode, mErrorMsg); +} + +void XQAiwUriDriver::setBackground(bool background ) +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::setBackground"); + mBackground = background; +} +bool XQAiwUriDriver::isBackground() const +{ + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::isBackground"); + return mBackground; +} + +bool XQAiwUriDriver::handleApptoUri(const QUrl &uri) +{ + // + // Use Qt service framework errors as is (they are in different range than XQ errors) + // + QLatin1String xml("Z:/resource/activity/activityserviceplugin.xml"); + mErrorCode = QServiceManager::NoError; + + QtMobility::QServiceManager serviceManager; + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::handleApptoUri"); + + bool b = serviceManager.addService(xml); + mErrorCode = serviceManager.error(); + XQSERVICE_DEBUG_PRINT("\taddService=%d", mErrorCode); + switch (mErrorCode) + { + case QServiceManager::NoError: + case QServiceManager::ServiceAlreadyExists: + case QServiceManager::ImplementationAlreadyExists: + // These are OK cases. + mErrorCode = QServiceManager::NoError; + break; + default: + return false; + } + + QObject* activityManager = serviceManager.loadInterface("com.nokia.qt.activities.ActivityManager"); + mErrorCode = serviceManager.error(); + XQSERVICE_DEBUG_PRINT("\tloadInterface %s=%d", "com.nokia.qt.activities.ActivityManager", mErrorCode); + if (!activityManager) + { + mErrorCode = serviceManager.error(); + return false; + } + + QMetaObject::invokeMethod(activityManager, "launchActivity", Q_ARG(QUrl,uri)); + mErrorCode = serviceManager.error(); + + XQSERVICE_DEBUG_PRINT("\tinvokeMethod=%d", mErrorCode); + delete activityManager; + + XQSERVICE_DEBUG_PRINT("XQAiwUriDriver::handleApptoUri done"); + + return mErrorCode == QServiceManager::NoError; +}