diff -r 885c2596c964 -r 5d007b20cfd0 qthighway/xqservice/src/xqaiwservicedriver.cpp --- /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 +#include +#include +#include +#include +#include +#include + +#include +#include +#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 &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; + +}