diff -r cfcbf08528c4 -r 2b40d63a9c3d qthighway/examples/appmgrclient/src/appmgrclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qthighway/examples/appmgrclient/src/appmgrclient.cpp Fri Apr 16 15:51:22 2010 +0300 @@ -0,0 +1,747 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "appmgrservices.h" +#include "appmgrclient.h" + + +AppMgrClient::AppMgrClient(QWidget *parent, Qt::WFlags f) + : QWidget(parent, f), + req1(0), + req2(0), + req3(0), + req4(0), + req5(0), + req6(0), + req7(0), + req8(0), + req9(0), + actionButton(0), + mImplIndex(0) +{ + /* Adjust the palette */ +#if defined(Q_WS_S60) + QPalette p = qApp->palette(); + QColor color(192,192,192); + QColor bg(0,128,192); + p.setColor(QPalette::Highlight, color.lighter(200)); + p.setColor(QPalette::Text, Qt::black); + p.setColor(QPalette::Base, bg); + p.setColor(QPalette::WindowText, Qt::black); + p.setColor(QPalette::Window, bg); + p.setColor(QPalette::ButtonText, Qt::black); + p.setColor(QPalette::Button, color.lighter(150)); + p.setColor(QPalette::Link, QColor(240,40,40)); + qApp->setPalette(p); +#endif + + QPushButton *testButton1 = 0; + QPushButton *anyTestButton = 0; + + QPushButton *quitButton = new QPushButton(tr("quit")); + connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit())); + + testButton1 = new QPushButton("Tests"); + mMenu = new QMenu(this); + testButton1->setMenu(mMenu); + anyTestButton = new QPushButton(tr("Any test")); + connect(anyTestButton, SIGNAL(clicked()), this, SLOT(anyTest())); + + QAction *test1 = new QAction("Interface", this); + connect(test1, SIGNAL(triggered()), this, SLOT(test1())); + QAction *test2 = new QAction("Descriptor", this); + connect(test2, SIGNAL(triggered()), this, SLOT(test2())); + QAction *test3 = new QAction("Errors", this); + connect(test3, SIGNAL(triggered()), this, SLOT(test3())); + QAction *test4 = new QAction("QAction", this); + connect(test4, SIGNAL(triggered()), this, SLOT(test4())); + QAction *test5 = new QAction("appto:", this); + connect(test5, SIGNAL(triggered()), this, SLOT(test5())); + QAction *test6 = new QAction("testto:", this); + connect(test6, SIGNAL(triggered()), this, SLOT(test6())); + QAction *test7 = new QAction("MIME", this); + connect(test7, SIGNAL(triggered()), this, SLOT(test7())); + QAction *test8 = new QAction("URI", this); + connect(test8, SIGNAL(triggered()), this, SLOT(test8())); + QAction *test9 = new QAction("XQSharableFile", this); + connect(test9, SIGNAL(triggered()), this, SLOT(test9())); + + mMenu = new QMenu(this); + mMenu->addAction(test1); + mMenu->addAction(test2); + mMenu->addAction(test3); + mMenu->addAction(test4); + mMenu->addAction(test5); + mMenu->addAction(test6); + mMenu->addAction(test7); + mMenu->addAction(test8); + mMenu->addAction(test9); + + testButton1->setMenu(mMenu); + + mCheckEmbedded = new QCheckBox("Embedded"); + mSynchronous = new QCheckBox("Synchronous"); + mBackground = new QCheckBox("Background"); + mCheckDeleteRequest = new QCheckBox("Delete request"); + mGenericSend = new QCheckBox("Use generic send()"); + mCheckEmbedded->setCheckState(Qt::Checked); + mSynchronous->setCheckState(Qt::Checked); + mGenericSend->setCheckState(Qt::Checked); // Apply one send() for both embedded/non-embedded + + mReqArg = new QLineEdit("0"); + + mTextRetValue = new QLineEdit("no ret value set"); + + QLabel *label = new QLabel("APPMGR CLIENT TEST"); + + vl = new QVBoxLayout; + vl->setMargin(0); + vl->setSpacing(0); + + vl->addWidget(label); + vl->addWidget(mCheckEmbedded); + vl->addWidget(mSynchronous); + vl->addWidget(mBackground); + vl->addWidget(mCheckDeleteRequest); + vl->addWidget(mGenericSend); + vl->addWidget(mReqArg); + vl->addWidget(mTextRetValue); + vl->addWidget(new QLabel(" ")); + vl->addWidget(testButton1); + vl->addWidget(anyTestButton); + vl->addWidget(quitButton); + + setLayout(vl); + +#if defined(Q_WS_X11) || defined(Q_WS_WIN) + setFixedSize(QSize(360,640)); // nHD +#elif defined(Q_WS_S60) + // showMaximized(); + showFullScreen(); +#endif + +} + +AppMgrClient::~AppMgrClient() +{ + delete req1; + delete req2; + delete req3; + delete req4; + delete req5; + delete req6; + delete req7; + delete req8; + delete req9; + delete mMenu; + +} + +void AppMgrClient::test(XQAiwRequest **req, const QString& interface, const QString& operation, bool embedded) +{ + qDebug() << "AppMgrClient::test START"; + + bool embed = (mCheckEmbedded->checkState() == Qt::Checked); + bool sync = (mSynchronous->checkState() == Qt::Checked); + bool background = (mBackground->checkState() == Qt::Checked); + + qDebug() << "AppMgrClient:test: embed=" << embed << ",sync=" << sync << "background=" << background; + + if (!*req) + { + *req = appmgr.create(interface, operation); + connectSignals(*req); + } + // Test embedded funcions + (*req)->setEmbedded(embed); + (*req)->setSynchronous(sync); + (*req)->setBackground(background); + + qDebug("AppMgrClient::isEmbbedded %d", (*req)->isEmbedded()); + + test(req, mReqArg->text()); + + qDebug() << "AppMgrClient::test END"; + +} + + +void AppMgrClient::test(XQAiwRequest **req, XQAiwInterfaceDescriptor &impl, const QString& operation, bool embedded) +{ + qDebug() << "AppMgrClient::test START"; + + if (!*req) + { + *req = appmgr.create(impl, operation); + connectSignals(*req); + } + // Test embedded funcions + qDebug("AppMgrClient::isEmbbedded %d", (*req)->isEmbedded()); + + test(req, mReqArg->text()); + + qDebug() << "AppMgrClient::test END"; + +} + + + +void AppMgrClient::test(XQAiwRequest **req, const QString &arg) +{ + qDebug() << "AppMgrClient::testreq START"; + + if (!req || !*req) + { + qDebug() << "AIW-ERROR:AppMgrClient::NULL request"; + return; + } + + + bool embed = (mCheckEmbedded->checkState() == Qt::Checked); + bool sync = (mSynchronous->checkState() == Qt::Checked); + bool background = (mBackground->checkState() == Qt::Checked); + + // Set arguments for request + QList args; + args << arg; + args << QVariant(!sync); + (*req)->setArguments(args); + + bool genericSend = (mGenericSend->checkState() == Qt::Checked); + (*req)->setEmbedded(embed); + (*req)->setSynchronous(sync); + (*req)->setBackground(background); + + // Make the request + if (genericSend || !sync) + { + if (!(*req)->send()) + { + qDebug() << "AIW-ERROR: AppMgrClient:test: Send failed" << (*req)->lastError();; + } + } + else if (!genericSend && sync) + { + QVariant retValue; + if (!(*req)->send(retValue)) + { + qDebug() << "AIW-ERROR: AppMgrClient:test: Send(retValue) failed" << (*req)->lastError();; + } + else + { + if (retValue.canConvert()) + { + qDebug("AppMgrClient::retValue=%s,%s", + retValue.typeName(), + qPrintable(retValue.value())); + mTextRetValue->setText(retValue.value()); + } + else + { + qDebug("AppMgrClient:retValue=%s", + retValue.typeName()); + mTextRetValue->setText("Not displayable"); + } + + } + } + + // Delete request if wanted + bool deleteRequest = (mCheckDeleteRequest->checkState() == Qt::Checked); + + if ((*req)->lastError() == XQService::EMessageNotFound) + { + // Slot was not found + deleteRequest = true; + } + + if (deleteRequest) + { + qDebug() << "AIW-NOTE: Request deleted"; + delete *req; + *req = 0; + } + + qDebug() << "AppMgrClient::test END"; + + update(); + + +} + + +void AppMgrClient::connectSignals(XQAiwRequest *req) +{ + if (req) + { + // Connect signals once + connect(req, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); + connect(req, SIGNAL(requestError(int,const QString&)), this, SLOT(handleError(int,const QString&))); + } +} + + +void AppMgrClient::createTestFile(const QString &dir, const QString &fileName) +{ + + QDir d("."); + d.mkpath(dir); + qDebug() << dir; + + QFile file(dir + "/" + fileName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + qDebug() << "Creating file failed " << QString(dir + "/" + fileName); + return; + } + QTextStream out(&file); + out << "Text in file" << "\n"; + file.close(); + +} + + +void AppMgrClient::test1() +{ + qDebug() << "AppMgrClient::test1 START"; + test(&req1, IDIAL, OPERATION1); + qDebug() << "AppMgrClient::test1 END"; + + /* + mReqArg->setText("77777"); + qDebug() << "AppMgrClient::test1 second call"; + test(&req1, IDIAL, OPERATION1); + */ +} + + +void AppMgrClient::test2() +{ + qDebug() << "AppMgrClient::test2 START"; + + QList list=appmgr.list(IDIAL, ""); + qDebug() << "AppMgrClient::Found implementations: " << list.count(); + int i=0; + foreach (XQAiwInterfaceDescriptor d, list) + { + qDebug("AppMgrClient::Service[%d]=%s",i,qPrintable(d.serviceName())); + qDebug("AppMgrClient::Interface[%d]=%s",i,qPrintable(d.interfaceName())); + qDebug("AppMgrClient::Implementation Id[%d]=%x",i,d.property(XQAiwInterfaceDescriptor::ImplementationId).toInt()); + i++; + } + + if (!list.isEmpty()) + { + // Use the first found + qDebug() << "AppMgrClient::Using implementation nbr: " << mImplIndex; + test(&req2,list[mImplIndex], OPERATION1); + } + + qDebug() << "AppMgrClient::test2 END"; + +} + +void AppMgrClient::test3() +{ + qDebug() << "AppMgrClient::test3 START"; + + test(&req3,IDIAL,ERR_OPERATION1); + test(&req3,ERR_IDIAL,ERR_OPERATION1); + test(&req3,ERR_IDIAL,ERR_OPERATION1); + + qDebug() << "AppMgrClient::test3 END"; + +} + +void AppMgrClient::test4() +{ + qDebug() << "AppMgrClient::test4 START"; + + bool embed = (mCheckEmbedded->checkState() == Qt::Checked); + bool sync = (mSynchronous->checkState() == Qt::Checked); + + if (req4) + { + delete req4; // Previous + req4 = 0; + } + + // Only hbserviceprovider support localization + req4 = appmgr.create(QLatin1String("com.nokia.services.hbserviceprovider"), IDIAL, OPERATION1); + if (!req4) + { + qDebug() << "AIW-ERROR:AppMgrClient::NULL request"; + return; + } + + connectSignals(req4); + req4->setEmbedded(embed); + req4->setSynchronous(embed); + + if (actionButton) + { + // Previous + vl->removeWidget(actionButton); + delete actionButton; + actionButton = 0; + update(); + } + + QAction *action = req4->createAction(); // Also connects the triggered event to req !!!! + qDebug() << "AppMgrClient::action:" << action->isEnabled(); + + // Create UI + if (action) + { + actionButton = new QPushButton(action->text()); + actionButton->addAction(action); + vl->addWidget(actionButton); + setLayout(vl); + // For some reason triggered does not come from request + // Workaround... + connect(actionButton, SIGNAL(clicked()), action, SIGNAL(triggered())); + connect(req4, SIGNAL(triggered()), this, SLOT(test4ActionTriggered())); + } + else + { + qDebug() << "AppMgrClient::test4 No action available"; + + } + + qDebug() << "AppMgrClient::test4 END"; + +} + +void AppMgrClient::test4ActionTriggered() +{ + XQAiwRequest *r = (XQAiwRequest *)sender(); + + // Set arguments for request + bool embed = (mCheckEmbedded->checkState() == Qt::Checked); + QList args; + args << QVariant(mReqArg->text()); + args << QVariant(!embed); + r->setArguments(args); + +} + +void AppMgrClient::test5() +{ + qDebug() << "AppMgrClient::test5 START"; + + // E0022E73 == ServiceApp + QUrl uri(XQURI_SCHEME_ACTIVITY + "://E0022E73?" + XQURI_KEY_ACTIVITY_NAME + "=emailView&view=myview"); + qDebug() << "AppMgrClient::Uri=" << uri.toString(); + qDebug() << "AppMgrClient::isValid=" << uri.isValid(); + qDebug() << "AppMgrClient::Uri authority=" << uri.authority(); + QString old=mReqArg->text(); + if (!req5) + { + req5 = appmgr.create(uri); + connectSignals(req5); + } + + mReqArg->setText(uri.encodedQuery()); + test(&req5, mReqArg->text()); + mReqArg->setText(old); + + qDebug() << "AppMgrClient::test5 END"; + +} + +void AppMgrClient::test6() +{ + qDebug() << "AppMgrClient::test6 START"; + + QUrl uri("testto://authority?param1=value1¶m1=value2"); + qDebug() << "AppMgrClient::Uri=" << uri.toString(); + qDebug() << "AppMgrClient::isValid=" << uri.isValid(); + qDebug() << "AppMgrClient::Uri authority=" << uri.authority(); + + QList uriHandlers = appmgr.list(uri); + // Note : Only services supporting custom property are returned + foreach (XQAiwInterfaceDescriptor d, uriHandlers) + { + qDebug() << "AppMgrClient::Service=" << d.serviceName(); + qDebug() << "AppMgrClient::Interface=" << d.interfaceName(); + qDebug("AppMgrClient::Implementation Id=%x",d.property(XQAiwInterfaceDescriptor::ImplementationId).toInt()); + } + + if (!req6) + { + req6 = appmgr.create(uri); + connectSignals(req6); + } + + test(&req6, uri.toString()); + + qDebug() << "AppMgrClient::test6 END"; + +} + +void AppMgrClient::test7() +{ + qDebug() << "AppMgrClient::test7 START"; + + // Should launch viewer for text/plain MimeTestApp. + // Create test file + createTestFile("C:/data/Others", "test.txt"); + + QFile file("C:/data/Others/test.txt"); + qDebug() << "AppMgrClient::File=" << file.fileName(); + qDebug() << "AppMgrClient::exists=" << file.exists(); + + QList fileHandlers = appmgr.list(file); + foreach (XQAiwInterfaceDescriptor d, fileHandlers) + { + qDebug() << "AppMgrClient::Service=" << d.serviceName(); + qDebug() << "AppMgrClient::Interface=" << d.interfaceName(); + qDebug() << "AppMgrClient::Implementation Id=" << d.property(XQAiwInterfaceDescriptor::ImplementationId).toInt(); + } + + if (!req7) + { + req7 = appmgr.create(file); + connectSignals(req7); + } + test(&req7, file.fileName()); + + qDebug() << "AppMgrClient::test7 END"; + +} + + +void AppMgrClient::test8() +{ + qDebug() << "AppMgrClient::test8 START"; + + // E0022E73 == ServiceApp + QUrl uri("http://www.nokia.com"); + qDebug() << "AppMgrClient::Uri=" << uri.toString(); + qDebug() << "AppMgrClient::isValid=" << uri.isValid(); + qDebug() << "AppMgrClient::Uri authority=" << uri.authority(); + + if (!req8) + { + req8 = appmgr.create(uri); + connectSignals(req8); + } + test(&req8, uri.toString()); + + qDebug() << "AppMgrClient::test8 END"; + +} + +void AppMgrClient::test9() +{ + + qDebug() << "AppMgrClient::test9 START"; + + bool embed = (mCheckEmbedded->checkState() == Qt::Checked); + bool sync = (mSynchronous->checkState() == Qt::Checked); + bool deleteRequest = (mCheckDeleteRequest->checkState() == Qt::Checked); + + + // Access data-caged file + XQSharableFile sf; + createTestFile("c:/private/e0022e74", "test.txt"); + if (!sf.open("c:\\private\\e0022e74\\test.txt")) + { + qDebug() << "AppMgrClient:file open failed"; + return; + } + + // Just test listing by sharable file + QList fileHandlers = appmgr.list(sf); + if (fileHandlers.count() > 0) + { + XQAiwInterfaceDescriptor d = fileHandlers.first(); + qDebug() << "AppMgrClient::File Service=" << d.serviceName(); + qDebug() << "AppMgrClient::File Interface=" << d.interfaceName(); + qDebug() << "AppMgrClient::Handler Implementation Id=" << d.property(XQAiwInterfaceDescriptor::ImplementationId).toInt(); + if (!req9) + { + // Create by descriptor + req9 = appmgr.create(sf, d); + } + if (!req9) + { + sf.close(); + qDebug() << "AppMgrClient:anyTest: ERROR IN XQAppMgr API"; + return ; + } + } + else + { + sf.close(); + qDebug() << "AppMgrClient:anyTest: NO HANDLER FOUND"; + } + + connectSignals(req9); + req9->setEmbedded(embed); + req9->setSynchronous(sync); + + QList args; + args << qVariantFromValue(sf); + req9->setArguments(args); + + req9->send(); + if (req9->lastError() == XQService::EMessageNotFound) + { + // Slot was not found + qDebug() << "AIW-ERROR:XQService::EMessageNotFound"; + deleteRequest = true; + } + // Remember to close the file !!! + sf.close(); + + if (deleteRequest) + { + delete req9; + req9 = 0; + } + + qDebug() << "AppMgrClient::test9 END"; + +} + + + + +#define TXT_ID QLatin1String("txt_aiw_action_text") + +void AppMgrClient::anyTest() +{ + + + qDebug() << "AppMgrClient:name" << qApp->applicationName(); + qDebug() << "AppMgrClient:dirpath" << qApp->applicationDirPath(); + qDebug() << "AppMgrClient:filename" << qApp->applicationFilePath(); + qDebug() << "AppMgrClient:pid" << qApp->applicationPid(); + + QFileInfo appinfo (qApp->applicationFilePath()); + qDebug() << "AppMgrClient:appinfo.applicationFilePath" << qApp->applicationFilePath(); + qDebug() << "AppMgrClient:appinfo.absolutePath" << appinfo.absolutePath(); + qDebug() << "AppMgrClient:appinfo.baseName" << appinfo.baseName(); + + QString lang = QLocale::system().name(); + qDebug() << "AppMgrClient::anyTest:" << lang; + + // QString textFile = "z:/resource/qt/translations/hbserviceprovider"; + QString textFile = "hbserviceprovider"; + QFileInfo info(textFile); + qDebug() << "AppMgrClient::base" << info.baseName(); + qDebug() << "AppMgrClient::path" << info.filePath(); + if (info.baseName() == info.filePath()) + { + textFile = qApp->applicationFilePath().left(2) + "/resource/qt/translations/" + textFile; + qDebug() << "AppMgrClient::path added" << textFile; + } + + textFile += "_"; + textFile += lang; + qDebug() << "AppMgrClient::anyTest:" << textFile; + + QTranslator translator; + bool res = translator.load(textFile); + qDebug() << "AppMgrClient::anyTest:" << res; + if (res) + { + qApp->installTranslator(&translator); + } + + QString textId = TXT_ID; + QByteArray ba = textId.toLatin1(); + const char *textPtr = ba.data(); + + QString text = qtTrId(textPtr); // translate + qDebug() << "Translated text:" << text; + + qApp->removeTranslator(&translator); + +} + + + + +// Aiw request responses +void AppMgrClient::handleOk(const QVariant& result) +{ + XQAiwRequest *r = (XQAiwRequest *)sender(); + int impl=-1; + impl = (r->descriptor().property(XQAiwInterfaceDescriptor::ImplementationId)).toInt(); + + if (result.canConvert()) + { + qDebug("AppMgrClient::%x:handleOk result=%s,%s", + impl, + result.typeName(), + qPrintable(result.value())); + mTextRetValue->setText(result.value()); + } + else + { + qDebug("AppMgrClient::%x:handleOk result=%s", + impl, + result.typeName()); + mTextRetValue->setText("Not displayable"); + } +} + +void AppMgrClient::handleError(int errorCode, const QString& errorMessage) +{ + XQAiwRequest *r = (XQAiwRequest *)sender(); + int impl=-1; + impl = (r->descriptor().property(XQAiwInterfaceDescriptor::ImplementationId)).toInt(); + + qDebug("AppMgrClient::%x:handleError code=%d, errorMessage:%s", + impl, errorCode, qPrintable(errorMessage)); + + mTextRetValue->setText(errorMessage); +} + +