qthighway/examples/serviceapp/src/serviceapp.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 8 71781823f776
--- 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<int> caps = info.clientCapabilities();
     QSetIterator<int> 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<XQSharableFile>();
+        
+        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<XQRequestInfo>();
+        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<CntServicesContactList>())
+    {
+        qDebug() << "DialerService::showRecipients: canConvert";
+        list = qVariantValue<CntServicesContactList>(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<int> caps = info.clientCapabilities();
+    QSetIterator<int> 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<XQSharableFile>();
+
+        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<XQRequestInfo>();
+        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<CntServicesContactList>())
+    {
+        qDebug() << "NewDialerService::showRecipients: canConvert";
+        list = qVariantValue<CntServicesContactList>(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());
+
+}
+