diff -r 2b40d63a9c3d -r 90517678cc4f qthighway/examples/serviceapp/src/serviceapp.cpp --- a/qthighway/examples/serviceapp/src/serviceapp.cpp Fri Apr 16 15:51:22 2010 +0300 +++ b/qthighway/examples/serviceapp/src/serviceapp.cpp Mon May 03 13:18:40 2010 +0300 @@ -40,16 +40,22 @@ ServiceApp::ServiceApp(QWidget *parent, Qt::WFlags f) : QWidget(parent, f), - mService(NULL), + mDialService(NULL), mUriService(NULL), - mFileService(NULL) + mFileService(NULL), + mNewDialService(NULL), + mNewFileService(NULL), + mNewUriService(NULL) { XQSERVICE_DEBUG_PRINT("ServiceApp::ServiceApp"); if (XQServiceUtil::isService()) { - mService = new DialerService(this); + mDialService = new DialerService(this); mUriService = new UriService(this); mFileService = new FileService(this); + mNewDialService = new NewDialerService(this); + mNewUriService = new NewUriService(this); + mNewFileService = new NewFileService(this); } /* Adjust the palette */ #if defined(Q_WS_S60) @@ -69,9 +75,13 @@ #endif QPushButton *quitButton = new QPushButton(tr("Quit")); - QPushButton *answerButton = new QPushButton(tr("Async Answer")); + QPushButton *answerButtonDial = new QPushButton(tr("Dial answer")); + QPushButton *answerButtonUri = new QPushButton(tr("Uri answer")); + QPushButton *answerButtonFile = new QPushButton(tr("File answer")); connect(quitButton, SIGNAL(clicked()), this, SLOT(quit())); - connect(answerButton, SIGNAL(clicked()), this, SLOT(answer())); + connect(answerButtonDial, SIGNAL(clicked()), this, SLOT(answerDial())); + connect(answerButtonUri, SIGNAL(clicked()), this, SLOT(answerUri())); + connect(answerButtonFile, SIGNAL(clicked()), this, SLOT(answerFile())); /* mEndCallButton = new QPushButton(tr("End Call")); @@ -79,17 +89,15 @@ connect(mEndCallButton, SIGNAL(clicked()), this, SLOT(endCall())); */ bool isService = XQServiceUtil::isService(); + QString interface = XQServiceUtil::interfaceName(); + QString operation = XQServiceUtil::operationName(); QString t = "SERVICEAPP:\n"; - t = t + (isService ? " LAUNCHED AS SERVICE\n" : " LAUNCHED NORMALLY\n"); - t = t + (XQServiceUtil::isEmbedded() ? " EMBEDDED\n" : " NOT EMBEDDED\n"); - - QStringList args = QApplication::arguments(); - foreach (QString arg, args) - { - t += "cmdline arg=" + arg + "\n"; - } - + t = t + (isService ? " Service launch\n" : " Normal launch\n"); + t = t + (XQServiceUtil::isEmbedded() ? " Embedded\n" : " Not embedded\n"); + t = t + (" Interface=" + interface + "\n"); + t = t + (" Operation=" + operation + "\n"); + QLabel *title = new QLabel(t); mLabel = new QLabel(""); @@ -99,8 +107,10 @@ vl->setMargin(0); vl->setSpacing(0); - vl->addWidget(answerButton); vl->addWidget(quitButton); + vl->addWidget(answerButtonDial); + vl->addWidget(answerButtonUri); + vl->addWidget(answerButtonFile); vl->addWidget(title); vl->addWidget(mLabel); vl->addWidget(mNumber); @@ -120,7 +130,7 @@ ServiceApp::~ServiceApp() { XQSERVICE_DEBUG_PRINT("ServiceApp::~ServiceApp"); - delete mService; + delete mDialService; delete mUriService; delete mFileService; } @@ -131,34 +141,36 @@ qApp->quit(); } -void ServiceApp::answer() +void ServiceApp::answerDial() { - XQSERVICE_DEBUG_PRINT("ServiceApp::answer"); - if (mService && mService->asyncAnswer()) + XQSERVICE_DEBUG_PRINT("ServiceApp::answerDial"); + if (mDialService && mDialService->asyncAnswer()) { - // connect(mService, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); - mService->complete(mNumber->text()); + mDialService->complete(mNumber->text()); } +} + + +void ServiceApp::answerUri() +{ + XQSERVICE_DEBUG_PRINT("ServiceApp::answerUri"); if (mUriService && mUriService->asyncAnswer()) { - connect(mUriService, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); - mUriService->complete(true); - } - if (mFileService && mFileService->asyncAnswer()) - { - connect(mUriService, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); mUriService->complete(true); } } -void ServiceApp::handleAnswerDelivered() +void ServiceApp::answerFile() { - XQSERVICE_DEBUG_PRINT("ServiceApp::handleAnswerDelivered"); - quit(); - + XQSERVICE_DEBUG_PRINT("ServiceApp::answerFile"); + if (mFileService && mFileService->asyncAnswer()) + { + mFileService->complete(true); + } } + void ServiceApp::endCall() { XQSERVICE_DEBUG_PRINT("ServiceApp::endCall"); @@ -179,13 +191,10 @@ DialerService::DialerService(ServiceApp* parent) : XQServiceProvider(QLatin1String("com.nokia.services.serviceapp.Dialer"),parent), - mServiceApp(parent), - mAsyncReqId(-1), - mAsyncAnswer(false) + mServiceApp(parent) { XQSERVICE_DEBUG_PRINT("DialerService::DialerService"); publishAll(); - connect(this, SIGNAL(returnValueDelivered()), parent, SLOT(handleAnswerDelivered())); } DialerService::~DialerService() @@ -195,10 +204,14 @@ void DialerService::complete(QString number) { - if (mAsyncReqId == -1) - return; XQSERVICE_DEBUG_PRINT("DialerService::complete"); - completeRequest(mAsyncReqId,number.toInt()); + + // Complete all IDs + foreach (quint32 reqId, mAsyncReqIds) + { + XQSERVICE_DEBUG_PRINT("DialerService::complete %d", reqId); + completeRequest(reqId, number.toInt()); + } } int DialerService::dial(const QString& number, bool asyncAnswer) @@ -206,7 +219,7 @@ XQSERVICE_DEBUG_PRINT("DialerService::dial: %s,%d", qPrintable(number), asyncAnswer); XQRequestInfo info = requestInfo(); - XQSERVICE_DEBUG_PRINT("\tRequest info: sid=%X,vid=%X", info.clientSecureId(), info.clientVendorId()); + XQSERVICE_DEBUG_PRINT("\tRequest info: id=%d,sid=%X,vid=%X", info.id(), info.clientSecureId(), info.clientVendorId()); QSet caps = info.clientCapabilities(); QSetIterator i(caps); while (i.hasNext()) @@ -217,13 +230,14 @@ label += QString("number=%1\n").arg(number); label += QString("asyncAnswer=%1\n").arg(asyncAnswer); - mAsyncAnswer = asyncAnswer; + connect(this, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); + mNumber = number ; mServiceApp->setLabelNumber(label, number); int ret = 0; - if (mAsyncAnswer) + if (asyncAnswer) { - mAsyncReqId = setCurrentRequestAsync(); + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); } else @@ -233,22 +247,387 @@ return ret; } +CntServicesContactList DialerService::testContactList(CntServicesContactList list) +{ + XQSERVICE_DEBUG_PRINT("DialerService::testContactList"); + showRecipients(list); + + // Create output + CntServicesContact cnt1; + cnt1.mDisplayName = "Test1-Return"; + cnt1.mPhoneNumber = "060-1111111"; + cnt1.mEmailAddress = "test1.return@nokia.com"; + + CntServicesContact cnt2; + cnt2.mDisplayName = "Test1-Return"; + cnt2.mPhoneNumber = "060-2222222"; + cnt2.mEmailAddress = "test2.return@nokia.com"; + + CntServicesContactList ret; + ret.append(cnt1); + ret.append(cnt2); + + return ret; + +} + +QVariant DialerService::testVariant(QVariant variant) +{ + XQSERVICE_DEBUG_PRINT("DialerService::testVariant::variant(%d,%d,%s)", + variant.type(), variant.userType(), variant.typeName()); + XQSERVICE_DEBUG_PRINT("DialerService::testVariant::variant value=%s", qPrintable(variant.toString())); + + if (variant.typeName() == QLatin1String("QStringList")) + { + QStringList ret = variant.toStringList(); + return qVariantFromValue(ret); + } + else if (variant.typeName() == QLatin1String("XQShabarableFile")) + { + XQSharableFile sf = variant.value(); + + RFile file; + bool ok = sf.getHandle( file ); + if (ok) + { + HBufC8* data = HBufC8::NewL(100); + TPtr8 ptr = data->Des(); + TInt err = file.Read( ptr ); + QString text = QString::fromUtf8((const char *)(data->Ptr()), data->Length()); + XQSERVICE_DEBUG_PRINT("DialerService::testVariant ::file content,%d,%s", err, qPrintable(text)); + sf.close(); + delete data; + } + + return QVariant(ok); + + } + else if (variant.typeName() == QLatin1String("XQRequestInfo")) + { + XQRequestInfo info = variant.value(); + QStringList keys = info.infoKeys(); + foreach (QString key, keys) + { + XQSERVICE_DEBUG_PRINT("DialerService::testVariant: info %s=%s", + qPrintable(key), + qPrintable(info.info(key).toString())); + } + + return qVariantFromValue(info); + + } + else if (variant.typeName() == QLatin1String("CntServicesContactList")) + { + // Show input + showRecipients(variant); + + // Create output + CntServicesContact cnt1; + cnt1.mDisplayName = "Test1-Return"; + cnt1.mPhoneNumber = "060-1111111"; + cnt1.mEmailAddress = "test1.return@nokia.com"; + + CntServicesContact cnt2; + cnt2.mDisplayName = "Test1-Return"; + cnt2.mPhoneNumber = "060-2222222"; + cnt2.mEmailAddress = "test2.return@nokia.com"; + + CntServicesContactList list; + list.append(cnt1); + list.append(cnt2); + + // Return contact list back + return qVariantFromValue(list); + } + else + { + return variant.toString(); + } +} + void DialerService::handleClientDisconnect() { XQSERVICE_DEBUG_PRINT("DialerService::handleClientDisconnect"); + + // Get the info of the cancelled request + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tDisconnected request info: id=%d,sid=%X,vid=%X", info.id(),info.clientSecureId(), info.clientVendorId()); + // Just quit service application if client ends - mAsyncAnswer = false; mServiceApp->quit(); } +void DialerService::handleAnswerDelivered() +{ + XQSERVICE_DEBUG_PRINT("DialerService::handleAnswerDelivered"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: sid=%X,vid=%X", info.clientSecureId(), info.clientVendorId()); + // Done + mAsyncReqIds.remove(info.clientSecureId()); +} + + + +void DialerService::showRecipients(QVariant &value) +{ + CntServicesContactList list; + if(value.canConvert()) + { + qDebug() << "DialerService::showRecipients: canConvert"; + list = qVariantValue(value); + } + else + { + qDebug() << "DialerService::showRecipients: canConvert NOK"; + return; + } + + showRecipients(list); +} + +void DialerService::showRecipients(CntServicesContactList &list) +{ + if (list.count() == 0) + { + qDebug() << "DialerService::showRecipients(2): Count==0"; + } + else + { + for (int i = 0; i < list.count(); ++i) + { + qDebug() << "DialerService::showRecipients(2)[" << i << "]=" << list[i].mDisplayName; + qDebug() << "DialerService::showRecipients(2)[" << i << "]=" << list[i].mPhoneNumber; + qDebug() << "DialerService::showRecipients(2)[" << i << "]=" << list[i].mEmailAddress; + } + } +} + + +// ----------New dialler service--------------- + +NewDialerService::NewDialerService(ServiceApp* parent) +: XQServiceProvider(QLatin1String("serviceapp.Dialer"),parent), +mServiceApp(parent) +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::NewDialerService"); + publishAll(); +} + +NewDialerService::~NewDialerService() +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::~NewDialerService"); +} + +void NewDialerService::complete(QString number) +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::complete"); + + // Complete all IDs + foreach (quint32 reqId, mAsyncReqIds) + { + XQSERVICE_DEBUG_PRINT("NewDialerService::complete %d", reqId); + completeRequest(reqId, number.toInt()); + } +} + +int NewDialerService::dial(const QString& number, bool asyncAnswer) +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::dial: %s,%d", qPrintable(number), asyncAnswer); + XQRequestInfo info = requestInfo(); + + XQSERVICE_DEBUG_PRINT("\tRequest info: id=%d,sid=%X,vid=%X", info.id(), info.clientSecureId(), info.clientVendorId()); + QSet caps = info.clientCapabilities(); + QSetIterator i(caps); + while (i.hasNext()) + qDebug() << "Has capability " << i.next(); + XQSERVICE_DEBUG_PRINT("\tRequest info: embed=%d,sync=%d", info.isEmbedded(), info.isSynchronous()); + + QString label = "NewDialer::dial:\n"; + label += QString("number=%1\n").arg(number); + label += QString("asyncAnswer=%1\n").arg(asyncAnswer); + + connect(this, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); + + mNumber = number ; + mServiceApp->setLabelNumber(label, number); + int ret = 0; + if (asyncAnswer) + { + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); + connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); + } + else + { + ret = number.toInt(); + } + return ret; +} + +CntServicesContactList NewDialerService::testContactList(CntServicesContactList list) +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::testContactList"); + showRecipients(list); + + // Create output + CntServicesContact cnt1; + cnt1.mDisplayName = "Test1-Return"; + cnt1.mPhoneNumber = "060-1111111"; + cnt1.mEmailAddress = "test1.return@nokia.com"; + + CntServicesContact cnt2; + cnt2.mDisplayName = "Test1-Return"; + cnt2.mPhoneNumber = "060-2222222"; + cnt2.mEmailAddress = "test2.return@nokia.com"; + + CntServicesContactList ret; + ret.append(cnt1); + ret.append(cnt2); + + return ret; + +} + +QVariant NewDialerService::testVariant(QVariant variant) +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::testVariant::variant(%d,%d,%s)", + variant.type(), variant.userType(), variant.typeName()); + XQSERVICE_DEBUG_PRINT("NewDialerService::testVariant::variant value=%s", qPrintable(variant.toString())); + + if (variant.typeName() == QLatin1String("QStringList")) + { + QStringList ret = variant.toStringList(); + return qVariantFromValue(ret); + } + else if (variant.typeName() == QLatin1String("XQShabarableFile")) + { + XQSharableFile sf = variant.value(); + + RFile file; + bool ok = sf.getHandle( file ); + if (ok) + { + HBufC8* data = HBufC8::NewL(100); + TPtr8 ptr = data->Des(); + TInt err = file.Read( ptr ); + QString text = QString::fromUtf8((const char *)(data->Ptr()), data->Length()); + XQSERVICE_DEBUG_PRINT("NewDialerService::testVariant ::file content,%d,%s", err, qPrintable(text)); + sf.close(); + delete data; + } + + return QVariant(ok); + + } + else if (variant.typeName() == QLatin1String("XQRequestInfo")) + { + XQRequestInfo info = variant.value(); + QStringList keys = info.infoKeys(); + foreach (QString key, keys) + { + XQSERVICE_DEBUG_PRINT("NewDialerService::testVariant: info %s=%s", + qPrintable(key), + qPrintable(info.info(key).toString())); + } + + return qVariantFromValue(info); + + } + else if (variant.typeName() == QLatin1String("CntServicesContactList")) + { + // Show input + showRecipients(variant); + + // Create output + CntServicesContact cnt1; + cnt1.mDisplayName = "Test1-Return"; + cnt1.mPhoneNumber = "060-1111111"; + cnt1.mEmailAddress = "test1.return@nokia.com"; + + CntServicesContact cnt2; + cnt2.mDisplayName = "Test1-Return"; + cnt2.mPhoneNumber = "060-2222222"; + cnt2.mEmailAddress = "test2.return@nokia.com"; + + CntServicesContactList list; + list.append(cnt1); + list.append(cnt2); + + // Return contact list back + return qVariantFromValue(list); + } + else + { + return variant.toString(); + } +} + +void NewDialerService::handleClientDisconnect() +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::handleClientDisconnect"); + + // Get the info of the cancelled request + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tDisconnected request info: id=%d,sid=%X,vid=%X", info.id(),info.clientSecureId(), info.clientVendorId()); + + // Just quit service application if client ends + mServiceApp->quit(); +} + +void NewDialerService::handleAnswerDelivered() +{ + XQSERVICE_DEBUG_PRINT("NewDialerService::handleAnswerDelivered"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: sid=%X,vid=%X", info.clientSecureId(), info.clientVendorId()); + // Done + mAsyncReqIds.remove(info.clientSecureId()); +} + + + +void NewDialerService::showRecipients(QVariant &value) +{ + CntServicesContactList list; + if(value.canConvert()) + { + qDebug() << "NewDialerService::showRecipients: canConvert"; + list = qVariantValue(value); + } + else + { + qDebug() << "NewDialerService::showRecipients: canConvert NOK"; + return; + } + + showRecipients(list); +} + +void NewDialerService::showRecipients(CntServicesContactList &list) +{ + if (list.count() == 0) + { + qDebug() << "NewDialerService::showRecipients(2): Count==0"; + } + else + { + for (int i = 0; i < list.count(); ++i) + { + qDebug() << "NewDialerService::showRecipients(2)[" << i << "]=" << list[i].mDisplayName; + qDebug() << "NewDialerService::showRecipients(2)[" << i << "]=" << list[i].mPhoneNumber; + qDebug() << "NewDialerService::showRecipients(2)[" << i << "]=" << list[i].mEmailAddress; + } + } +} + + + +Q_IMPLEMENT_USER_METATYPE(CntServicesContact) +Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList) // ----------UriService--------------- UriService::UriService(ServiceApp* parent) : XQServiceProvider(QLatin1String("com.nokia.services.serviceapp.com.nokia.symbian.IUriView"),parent), - mServiceApp(parent), - mAsyncReqId(-1), - mAsyncAnswer(false) + mServiceApp(parent) { XQSERVICE_DEBUG_PRINT("UriService::UriService"); @@ -262,10 +641,13 @@ void UriService::complete(bool ok) { - if (mAsyncReqId == -1) - return; XQSERVICE_DEBUG_PRINT("UriService::complete"); - completeRequest(mAsyncReqId, QVariant(mRetValue)); + // Complete all IDs + foreach (quint32 reqId, mAsyncReqIds) + { + XQSERVICE_DEBUG_PRINT("UriService::complete %d", reqId); + completeRequest(reqId, QVariant(mRetValue)); + } } bool UriService::view(const QString& uri) @@ -282,12 +664,15 @@ label += QString ("retValue=%1\n").arg(retValue); QString param = QString ("retValue=%1\n").arg(retValue); - mAsyncAnswer = !XQServiceUtil::isEmbedded();; + XQRequestInfo info = requestInfo(); + bool asyncAnswer = !info.isSynchronous();; + connect(this, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); + mRetValue = retValue; mServiceApp->setLabelNumber(label,param); - if (mAsyncAnswer) + if (asyncAnswer) { - mAsyncReqId = setCurrentRequestAsync(); + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); } @@ -297,20 +682,105 @@ void UriService::handleClientDisconnect() { XQSERVICE_DEBUG_PRINT("UriService::handleClientDisconnect"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: id=%d,sid=%X,vid=%X", info.id(),info.clientSecureId(), info.clientVendorId()); - // Just quit application - mAsyncAnswer = false; + mAsyncReqIds.remove(info.clientSecureId()); mServiceApp->quit(); } +void UriService::handleAnswerDelivered() +{ + XQSERVICE_DEBUG_PRINT("UriService::handleAnswerDelivered"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: sid=%X,vid=%X", info.clientSecureId(), info.clientVendorId()); + // Done + mAsyncReqIds.remove(info.clientSecureId()); + +} + +// ----------NewUriService--------------- + +NewUriService::NewUriService(ServiceApp* parent) +: XQServiceProvider(QLatin1String("serviceapp.com.nokia.symbian.IUriView"),parent), +mServiceApp(parent) + +{ + XQSERVICE_DEBUG_PRINT("NewUriService::NewUriService"); + publishAll(); +} + +NewUriService::~NewUriService() +{ + XQSERVICE_DEBUG_PRINT("NewUriService::~NewUriService"); +} + +void NewUriService::complete(bool ok) +{ + XQSERVICE_DEBUG_PRINT("NewUriService::complete"); + // Complete all IDs + foreach (quint32 reqId, mAsyncReqIds) + { + XQSERVICE_DEBUG_PRINT("NewUriService::complete %d", reqId); + completeRequest(reqId, QVariant(mRetValue)); + } +} + +bool NewUriService::view(const QString& uri) +{ + XQSERVICE_DEBUG_PRINT("NewUriService::view(1)"); + return view(uri, true); +} + +bool NewUriService::view(const QString& uri, bool retValue) +{ + XQSERVICE_DEBUG_PRINT("NewUriService::view(2)"); + QString label = "New IUri::view\n:"; + label += QString ("Uri=%1\n").arg(uri); + label += QString ("retValue=%1\n").arg(retValue); + QString param = QString ("retValue=%1\n").arg(retValue); + + XQRequestInfo info = requestInfo(); + bool asyncAnswer = !info.isSynchronous();; + connect(this, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); + + mRetValue = retValue; + mServiceApp->setLabelNumber(label,param); + if (asyncAnswer) + { + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); + connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); + } + + return retValue; +} + +void NewUriService::handleClientDisconnect() +{ + XQSERVICE_DEBUG_PRINT("NewUriService::handleClientDisconnect"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: id=%d,sid=%X,vid=%X", info.id(),info.clientSecureId(), info.clientVendorId()); + + mAsyncReqIds.remove(info.clientSecureId()); + mServiceApp->quit(); +} + +void NewUriService::handleAnswerDelivered() +{ + XQSERVICE_DEBUG_PRINT("NewUriService::handleAnswerDelivered"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: sid=%X,vid=%X", info.clientSecureId(), info.clientVendorId()); + // Done + mAsyncReqIds.remove(info.clientSecureId()); + +} + // ----------FileService--------------- FileService::FileService(ServiceApp* parent) : XQServiceProvider(QLatin1String("com.nokia.services.serviceapp.com.nokia.symbian.IFileView"),parent), - mServiceApp(parent), - mAsyncReqId(-1), - mAsyncAnswer(false) + mServiceApp(parent) { XQSERVICE_DEBUG_PRINT("FileService::FileService"); @@ -324,10 +794,13 @@ void FileService::complete(bool ok) { - if (mAsyncReqId == -1) - return; XQSERVICE_DEBUG_PRINT("FileService::complete"); - completeRequest(mAsyncReqId, QVariant(ok)); + // Complete all + foreach (quint32 reqId, mAsyncReqIds) + { + XQSERVICE_DEBUG_PRINT("FileService::complete %d", reqId); + completeRequest(reqId, QVariant(ok)); + } } bool FileService::view(QString file) @@ -336,11 +809,14 @@ QString label = "IFile::view\n:"; QString param = QString ("File=%1\n").arg(file); - mAsyncAnswer = !XQServiceUtil::isEmbedded();; + XQRequestInfo info = requestInfo(); + bool asyncAnswer = !info.isSynchronous();; + connect(this, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); + mServiceApp->setLabelNumber(label,param); - if (mAsyncAnswer) + if (asyncAnswer) { - mAsyncReqId = setCurrentRequestAsync(); + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); } @@ -367,11 +843,13 @@ delete data; } - mAsyncAnswer = !XQServiceUtil::isEmbedded();; + XQRequestInfo info = requestInfo(); + bool asyncAnswer = !info.isSynchronous();; + mServiceApp->setLabelNumber(label,param); - if (mAsyncAnswer) + if (asyncAnswer) { - mAsyncReqId = setCurrentRequestAsync(); + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); } return true; @@ -381,9 +859,123 @@ void FileService::handleClientDisconnect() { XQSERVICE_DEBUG_PRINT("FileService::handleClientDisconnect"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: id=%d,sid=%X,vid=%X", info.id(),info.clientSecureId(), info.clientVendorId()); - // Just quit application - mAsyncAnswer = false; + mAsyncReqIds.remove(info.clientSecureId()); mServiceApp->quit(); } + +void FileService::handleAnswerDelivered() +{ + XQSERVICE_DEBUG_PRINT("FileService::handleAnswerDelivered"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: sid=%X,vid=%X", info.clientSecureId(), info.clientVendorId()); + // Done + mAsyncReqIds.remove(info.clientSecureId()); + +} + + +// ----------NewFileService--------------- + +NewFileService::NewFileService(ServiceApp* parent) +: XQServiceProvider(QLatin1String("serviceapp.com.nokia.symbian.IFileView"),parent), +mServiceApp(parent) + +{ + XQSERVICE_DEBUG_PRINT("NewFileService::NewFileService"); + publishAll(); +} + +NewFileService::~NewFileService() +{ + XQSERVICE_DEBUG_PRINT("NewFileService::~NewFileService"); +} + +void NewFileService::complete(bool ok) +{ + XQSERVICE_DEBUG_PRINT("NewFileService::complete"); + // Complete all + foreach (quint32 reqId, mAsyncReqIds) + { + XQSERVICE_DEBUG_PRINT("NewFileService::complete %d", reqId); + completeRequest(reqId, QVariant(ok)); + } +} + +bool NewFileService::view(QString file) +{ + XQSERVICE_DEBUG_PRINT("NewFileService::view(QString)"); + QString label = "New IFile::view\n:"; + QString param = QString ("File=%1\n").arg(file); + + XQRequestInfo info = requestInfo(); + bool asyncAnswer = !info.isSynchronous();; + connect(this, SIGNAL(returnValueDelivered()), this, SLOT(handleAnswerDelivered())); + + mServiceApp->setLabelNumber(label,param); + if (asyncAnswer) + { + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); + connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); + } + + return true; +} + + +bool NewFileService::view(XQSharableFile sf) +{ + XQSERVICE_DEBUG_PRINT("NewFileService::view(XQSharebleFile)"); + QString label = "IFile::view\n:"; + QString param = QString ("File=%1\n").arg(sf.fileName()); + + RFile file; + bool ok = sf.getHandle( file ); + if (ok) + { + HBufC8* data = HBufC8::NewL(100); + TPtr8 ptr = data->Des(); + TInt err = file.Read( ptr ); + QString text = QString::fromUtf8((const char *)(data->Ptr()), data->Length()); + XQSERVICE_DEBUG_PRINT("NewFileService::file read,%d,%s", err, qPrintable(text)); + sf.close(); + delete data; + } + + XQRequestInfo info = requestInfo(); + bool asyncAnswer = !info.isSynchronous();; + + mServiceApp->setLabelNumber(label,param); + if (asyncAnswer) + { + mAsyncReqIds.insert(info.clientSecureId(), setCurrentRequestAsync()); + connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnect())); + } + return true; +} + + +void NewFileService::handleClientDisconnect() +{ + XQSERVICE_DEBUG_PRINT("NewFileService::handleClientDisconnect"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: id=%d,sid=%X,vid=%X", info.id(),info.clientSecureId(), info.clientVendorId()); + + mAsyncReqIds.remove(info.clientSecureId()); + mServiceApp->quit(); +} + + +void NewFileService::handleAnswerDelivered() +{ + XQSERVICE_DEBUG_PRINT("NewFileService::handleAnswerDelivered"); + XQRequestInfo info = requestInfo(); + XQSERVICE_DEBUG_PRINT("\tRequest info: sid=%X,vid=%X", info.clientSecureId(), info.clientVendorId()); + // Done + mAsyncReqIds.remove(info.clientSecureId()); + +} +