--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qthighway/xqservice/src/xqaiwservicedriver.cpp Tue Aug 31 16:02:37 2010 +0300
@@ -0,0 +1,361 @@
+/*
+*
+* 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 <QObject>
+#include <qglobal.h>
+#include <QApplication>
+#include <QLatin1String>
+#include <QLocale>
+#include <QIcon>
+#include <QFileInfo>
+
+#include <xqaiwdecl.h>
+#include <xqservicerequest.h>
+#include "xqrequestutil.h"
+#include "xqservicelog.h"
+#include "xqaiwutils.h"
+#include "xqaiwservicedriver.h"
+
+// Constants
+
+XQAiwServiceDriver::XQAiwServiceDriver(const XQAiwInterfaceDescriptor& descriptor, const QString &operation)
+ : XQAiwRequestDriver(),
+ currentRequest(NULL),
+ completeSignalConnected(false),
+ errorSignalConnected(false)
+ {
+ mErrorMsg = "";
+ mDescr = descriptor;
+ mOperation = operation;
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::XQAiwServiceDriver: %s %s,%x",
+ qPrintable(mDescr.interfaceName()),
+ qPrintable(mOperation),
+ mDescr.property(XQAiwInterfaceDescriptor::ImplementationId).toInt());
+
+ // Allocate QtHighway request
+ currentRequest = new XQServiceRequest(mDescr, mOperation);
+ }
+
+XQAiwServiceDriver::~XQAiwServiceDriver()
+{
+ XQSERVICE_DEBUG_PRINT("~XQAiwServiceDriver::XQAiwServiceDriver");
+
+ // Disconnect signals
+ if (completeSignalConnected)
+ {
+ disconnect(currentRequest, SIGNAL(requestCompleted(const QVariant&)), this, SLOT(handleAsyncResponse(const QVariant&)));
+ }
+ if (errorSignalConnected)
+ {
+ disconnect(currentRequest, SIGNAL(requestError(int)), this, SLOT(handleAsyncError(int)));
+ }
+
+ delete currentRequest; // Destructor cancels the async request
+
+ XQSERVICE_DEBUG_PRINT("~XQAiwServiceDriver::XQAiwServiceDriver 2");
+ removeTranslator();
+ currentRequest = NULL;
+}
+
+
+
+QAction *XQAiwServiceDriver::createAction()
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::createAction");
+
+ if (!qApp)
+ return NULL; // Not supported in non-GUI environments
+
+ installTranslator();
+
+ QString textId = mDescr.customProperty(XQCUSTOM_PROP_AIW_TEXT);
+ if (textId.isEmpty())
+ {
+ // Applye the key name and make it visible to client as indication of
+ // missing property ..
+ textId = "#missing " + XQCUSTOM_PROP_AIW_TEXT;
+ }
+
+ QByteArray ba = textId.toLatin1();
+ const char *textPtr = ba.data();
+ QString text = qtTrId(textPtr); // translate
+ XQSERVICE_DEBUG_PRINT("Translated text %s", qPrintable(text));
+
+ QAction *action=0;
+ QIcon icon;
+ QString iconFile = mDescr.customProperty(XQCUSTOM_PROP_AIW_ICON);
+ if (!iconFile.isEmpty())
+ {
+ XQSERVICE_DEBUG_PRINT("QAction with icon and text");
+ icon.addFile(iconFile);
+ action = new QAction(icon, text, 0);
+ }
+ else
+ {
+ XQSERVICE_DEBUG_PRINT("QAction with text");
+ action = new QAction(text,0);
+ }
+
+ return action;
+}
+
+void XQAiwServiceDriver::setArguments(const QList<QVariant> &arguments)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::setArguments");
+ currentRequest->setArguments(arguments);
+}
+
+
+bool XQAiwServiceDriver::send(QVariant& retValue)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::send>>>");
+
+ // Update info (these ones can be given via XQAiwRequest function count)
+ XQRequestInfo opt = info();
+ QVariant emb = opt.info(XQServiceUtils::OptEmbedded);
+ QVariant bg = opt.info(XQServiceUtils::OptBackground);
+ if (!emb.isValid())
+ {
+ // Not set via setInfo
+ opt.setEmbedded(mEmbedded);
+ }
+ if (!bg.isValid())
+ {
+ // Not set via setInfo
+ opt.setBackground(mBackground);
+ }
+ currentRequest->setInfo(opt);
+
+ QStringList list;
+ bool res = true;
+ if (!currentRequest->isSynchronous() && !completeSignalConnected)
+ {
+ // Async request. Connect signal only once
+ XQSERVICE_DEBUG_PRINT("request::async send");
+ connect(currentRequest, SIGNAL(requestCompleted(const QVariant&)), this, SLOT(handleAsyncResponse(const QVariant&)));
+ completeSignalConnected = true;
+ }
+ if (!errorSignalConnected)
+ {
+ // Connect error signal only once
+ connect(currentRequest, SIGNAL(requestError(int)), this, SLOT(handleAsyncError(int)));
+ errorSignalConnected = true;
+ }
+
+ XQSERVICE_DEBUG_PRINT("request::send>>>");
+ res = currentRequest->send(retValue); // Result is valid for sync request only
+ XQSERVICE_DEBUG_PRINT("request::send: %d<<<", res);
+
+ mErrorCode = XQRequestUtil::mapError(currentRequest->latestError());
+ if (res && !mErrorCode)
+ {
+ mErrorMsg = "";
+ }
+ else
+ {
+ // This is for debugging/trace purposes only, no need to localize
+ mErrorMsg = XQAiwUtils::createErrorMessage(mErrorCode, "XQAiwServiceDriver", "sync send");
+ }
+
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::send: %d<<<", res);
+
+ return res;
+
+}
+
+const QString& XQAiwServiceDriver::lastErrorMessage() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::lastErrorMessage: %s", qPrintable(mErrorMsg));
+ return mErrorMsg;
+}
+
+int XQAiwServiceDriver::lastError() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::lastError %d", mErrorCode);
+ return mErrorCode;
+}
+
+const XQAiwInterfaceDescriptor &XQAiwServiceDriver::descriptor() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::descriptor");
+ return mDescr;
+}
+
+void XQAiwServiceDriver::setEmbedded(bool embedded)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::setEmbedded");
+ // Embedded is option
+ mEmbedded = embedded;
+}
+bool XQAiwServiceDriver::isEmbedded() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::isEmbedded");
+ // Embedded is option
+ return mEmbedded;
+}
+
+
+void XQAiwServiceDriver::setBackground(bool background )
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::setBackground");
+ mBackground = background;
+}
+bool XQAiwServiceDriver::isBackground() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::isBackground");
+ return mBackground;
+}
+
+
+void XQAiwServiceDriver::setOperation(const QString &operation)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwRequest::setOperation");
+ mOperation = operation;
+ currentRequest->setMessage(operation);
+}
+const QString &XQAiwServiceDriver::operation() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwRequest::operation");
+ return mOperation;
+}
+
+void XQAiwServiceDriver::setSynchronous(bool synchronous)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::setSynchronous");
+ currentRequest->setSynchronous(synchronous);
+}
+bool XQAiwServiceDriver::isSynchronous() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::isSynchronous");
+
+ return currentRequest->isSynchronous();
+}
+
+void XQAiwServiceDriver::setInfo(const XQRequestInfo &info)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::setInfo");
+ currentRequest->setInfo(info);
+}
+
+XQRequestInfo XQAiwServiceDriver::info() const
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::info");
+ return currentRequest->info();
+}
+
+void XQAiwServiceDriver::handleAsyncResponse(const QVariant& value)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::handleAsyncResponse");
+ emit requestOk(value);
+}
+
+void XQAiwServiceDriver::handleAsyncError(int err)
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::handleAsyncError");
+
+ mErrorCode = XQRequestUtil::mapError(err);
+ mErrorMsg = XQAiwUtils::createErrorMessage(mErrorCode, "XQAiwServiceDriver", "async send");
+ emit requestError(mErrorCode, mErrorMsg);
+
+}
+
+
+bool XQAiwServiceDriver::installTranslator()
+{
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::installTranslator");
+
+ if (!qApp)
+ {
+ XQSERVICE_DEBUG_PRINT("\tNo application context");
+ return false;
+ }
+
+ // The the name of the resource file containing the text
+ QString textFile = mDescr.customProperty(XQCUSTOM_PROP_AIW_TEXT_FILE);
+ if (textFile.isEmpty())
+ {
+ XQSERVICE_DEBUG_PRINT("\tCustom property missing for text file");
+ return false;
+ }
+
+ // Check if locale has changed since last request
+ QString lang = QLocale::system().name();
+ XQSERVICE_DEBUG_PRINT("\tLanguage now is%s", qPrintable(lang));
+ if (!this->lastLang.isEmpty() && (this->lastLang != lang))
+ {
+ // Language has changed since last time
+ // Remove previous translator, if any
+ removeTranslator();
+ }
+
+ textFile = makeFileName(textFile);
+
+ bool res=false;
+ if (this->translator.isEmpty())
+ {
+ // Construct the full name of the localized resource
+ XQSERVICE_DEBUG_PRINT("textFile name is %s", qPrintable(textFile));
+ res = this->translator.load(textFile);
+ if (res)
+ {
+ qApp->installTranslator(&this->translator);
+ this->lastLang = lang; // Remember the current language
+ XQSERVICE_DEBUG_PRINT("Translator installed %s", qPrintable(lang));
+ }
+ }
+
+ return res;
+
+}
+
+void XQAiwServiceDriver::removeTranslator()
+{
+ if (qApp && !this->translator.isEmpty())
+ {
+ qApp->removeTranslator(&this->translator);
+ }
+}
+
+QString XQAiwServiceDriver::makeFileName(const QString &textFile) const
+{
+ QFileInfo info(textFile);
+ QString ret = textFile;
+
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::makeFileName %s", qPrintable(textFile));
+
+ if (info.baseName() == info.filePath())
+ {
+ // No path, apply the default path
+ // Drive is where app is loaded, like "C:" or "Z:"
+ ret = qApp->applicationFilePath().left(2) + "/resource/qt/translations/" + textFile;
+ }
+
+ // Add current language
+ QString lang = QLocale::system().name();
+ ret += "_";
+ ret += lang;
+
+ XQSERVICE_DEBUG_PRINT("XQAiwServiceDriver::makeFileName ret=%s", qPrintable(ret));
+
+ return ret;
+
+}