qthighway/xqservice/src/xqaiwservicedriver.cpp
branchRCL_3
changeset 22 5d007b20cfd0
--- /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;
+    
+}