iaupdate/IAD/api/client/src/iaupdateclient.cpp
branchRCL_3
changeset 66 8b7f4e561641
parent 65 7333d7932ef7
child 70 e8965914fac7
--- a/iaupdate/IAD/api/client/src/iaupdateclient.cpp	Tue Aug 31 15:21:33 2010 +0300
+++ b/iaupdate/IAD/api/client/src/iaupdateclient.cpp	Wed Sep 01 12:22:02 2010 +0100
@@ -11,7 +11,7 @@
 *
 * Contributors:
 *
-* Description:   This module contains the implementation of IAUpdateClient
+* Description:   This module contains the implementation of RIAUpdateClient
 *                class member functions.
 *
 */
@@ -22,406 +22,390 @@
 #include <eikenv.h>
 #include <apgcli.h>
 #include <e32math.h>
-#include <iaupdateparameters.h>
-#include <iaupdateresult.h>
-#include <xqservicerequest.h>
-#include <xqserviceutil.h>
-#include <xqrequestinfo.h>
-
 #include "iaupdateclient.h"
 #include "iaupdateclientdefines.h"
+#include "iaupdatetools.h"
 #include "iaupdatedebug.h"
 
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::IAUpdateClient
+// RIAUpdateClient::RIAUpdateClient
 // 
 // -----------------------------------------------------------------------------
 // 
-IAUpdateClient::IAUpdateClient(MIAUpdateObserver& observer):
-    mObserver(observer)
+RIAUpdateClient::RIAUpdateClient() 
+: iPtr1( NULL, 0 ),
+  iPtr2( NULL, 0 ),
+  iPtr3( NULL, 0 )
     {
-    mServiceRequest = NULL;
-    mCurrentRequestType = NoOperation;
-    }
-
-// -----------------------------------------------------------------------------
-// IAUpdateClient::~IAUpdateClient
-// 
-// -----------------------------------------------------------------------------
-// 
-IAUpdateClient::~IAUpdateClient() 
-    {
-    if ( mServiceRequest)
-        {
-        delete mServiceRequest;
-        }
     }
 
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::initRequest
+// RIAUpdateClient::Open
 // 
 // -----------------------------------------------------------------------------
 // 
-int IAUpdateClient::initRequest(const CIAUpdateParameters* updateParameters, const QString& message, bool toBackground)
-{
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::initRequest() begin");
-    int error(KErrNone);
-    if (mCurrentRequestType != NoOperation) 
-        {
-        error = KErrServerBusy;
-        }
-    else if (!mServiceRequest)
+TInt RIAUpdateClient::Open()
     {
-        mServiceRequest = new XQServiceRequest("com.nokia.services.swupdate.swupdate_interface", message, false);
-        if (mServiceRequest)
-        {    
-            connect(mServiceRequest, SIGNAL(requestCompleted(QVariant)), this, SLOT(requestCompleted(QVariant)));
-            connect(mServiceRequest, SIGNAL(requestError(int)), this, SLOT(requestError(int)));
-        }
-        else
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::Open() begin");
+    TInt error( KErrNone );
+    
+    if ( !iConnected )
         {
-            error = KErrNoMemory;
-        }
-    }
-    else
-    {
-        mServiceRequest->setMessage(message);
-    }
-    
-    
-    if (error == KErrNone)
-    {    
-        XQRequestInfo requestInfo;
-        requestInfo.setBackground(toBackground);
-        mServiceRequest->setInfo(requestInfo); 
-        int wgId = 0;
-        CEikonEnv* eikEnv = CEikonEnv::Static();
-        if ( eikEnv )
-        {
-            RWindowGroup owngroup;
-            wgId = eikEnv->RootWin().Identifier();
+        TRAP( error, ConnectNewAppL( ServiceUid() ) );
+        if ( error == KErrNone ) 
+            {
+            iConnected = ETrue;
+            CEikonEnv* eikEnv = CEikonEnv::Static();
+            if ( eikEnv )
+                {
+            	RWindowGroup owngroup;
+		        iOwnWgId = eikEnv->RootWin().Identifier(); 
+		        
+	            TPckg<TInt> wgId( iOwnWgId );
+	            delete iData;
+	            iData = NULL;
+	             TRAP_IGNORE( iData = wgId.AllocL() );
+	            
+                TIpcArgs args;
+                args.Set( 0, iData );
+                SendReceive( IAUpdateClientDefines::EIAUpdateServerSendWgId, args );    
+	            } 
+            }
         }
-        IAUPDATE_TRACE_1("IAUpdateClient::initRequest() wgId: %d", wgId);
-        QString stringWgid;
-        stringWgid.setNum(wgId);
-        *mServiceRequest << stringWgid;  
-        if (updateParameters)
-        {    
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() UID: %d", updateParameters->Uid().iUid);
-            QString stringUid; 
-            stringUid.setNum(updateParameters->Uid().iUid);
-            *mServiceRequest << stringUid;
-                
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() searchcriteria: %S", &updateParameters->SearchCriteria());
-            *mServiceRequest << qStringFromTDesC(updateParameters->SearchCriteria());
-                
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() executable: %S", &updateParameters->CommandLineExecutable());
-            *mServiceRequest << qStringFromTDesC(updateParameters->CommandLineExecutable());
-                
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() arguments: %S8", &updateParameters->CommandLineArguments());
-            *mServiceRequest << qStringFromTDesC8(updateParameters->CommandLineArguments());
-                
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() show progress: %d", updateParameters->ShowProgress());
-            QString stringShowProgress;
-            stringShowProgress.setNum(updateParameters->ShowProgress());
-            *mServiceRequest << stringShowProgress;
-                
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() importance: %d", updateParameters->Importance());
-            QString stringImportance;
-            stringImportance.setNum(updateParameters->Importance());
-            *mServiceRequest << stringImportance;
-                
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() type: %d", updateParameters->Type());
-            QString stringType;
-            stringType.setNum(updateParameters->Type());
-            *mServiceRequest << stringType;
-                
-            IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() refresh: %d", updateParameters->Refresh());
-            QString stringRefresh;
-            stringRefresh.setNum(updateParameters->Refresh());
-            *mServiceRequest << stringRefresh;
-        }
-    }                 
-     
-    
-    IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::initRequest() error code: %d", error );
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::initRequest() end");
+    IAUPDATE_TRACE_1("[IAUPDATE] RIAUpdateClient::Open() end error code: %d", error );
     return error;
-}
+    }
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::checkUpdates
+// RIAUpdateClient::OpenToBackroundAsync
+// 
+// -----------------------------------------------------------------------------
+//
+TInt RIAUpdateClient::OpenToBackroundAsync( TRequestStatus& aStatus )
+    {
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::OpenToBackroundAsync() begin");
+    TInt error( KErrNone );
+    if ( !iConnected )
+        {
+        TRAP( error, StartNewAppToBackgroundL( ServiceUid(), aStatus ) );
+        }
+    IAUPDATE_TRACE_1("[IAUPDATE] RIAUpdateClient::OpenToBackroundAsync() end error code: %d", error );
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// RIAUpdateClient::ConnectToApp
 // 
 // -----------------------------------------------------------------------------
 //
-void IAUpdateClient::checkUpdates(const CIAUpdateParameters& updateParameters)
+TInt RIAUpdateClient::ConnectToApp()
     {
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::checkUpdates()");
-    QString message("checkUpdates(QString,QString,QString,QString,QString,QString,QString,QString,QString)");
-    //QString message("checkUpdates(int,int)");
-    int ret = initRequest(&updateParameters,message,!updateParameters.ShowProgress());
-    if (ret == KErrNone)
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::ConnectToApp() begin");
+    TInt error( KErrNone );
+    TName serverName;
+    ServerName(serverName, ServiceUid(), iDifferentiator);
+    TRAP( error,ConnectExistingByNameL( serverName ) );
+    
+    if ( error == KErrNone ) 
         {
-        if (mServiceRequest->send()) 
+        iConnected = ETrue;
+        CEikonEnv* eikEnv = CEikonEnv::Static();
+        if ( eikEnv )
             {
-            mCurrentRequestType = CheckUpdates;
-            }
-        else
-            {
-            mObserver.CheckUpdatesComplete(ret,0);        
-            }
+            RWindowGroup owngroup;
+            iOwnWgId = eikEnv->RootWin().Identifier(); 
+                    
+            TPckg<TInt> wgId( iOwnWgId );
+            delete iData;
+            iData = NULL;
+            TRAP_IGNORE( iData = wgId.AllocL() );
+                    
+            TIpcArgs args;
+            args.Set( 0, iData );
+            SendReceive( IAUpdateClientDefines::EIAUpdateServerSendWgId, args );    
+            } 
         }
+    IAUPDATE_TRACE_1("[IAUPDATE] RIAUpdateClient::ConnectToApp() end error code: %d", error );
+    return error; 
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// RIAUpdateClient::Close
+// 
+// -----------------------------------------------------------------------------
+//
+void RIAUpdateClient::Close()
+    {
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::Close() begin");
+    // Let the parent handle closing.
+    RAknAppServiceBase::Close();
+    iConnected = EFalse;
+    delete iData;
+    iData = NULL;
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::Close() end");
     }
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::showUpdates
+// RIAUpdateClient::CheckUpdates
 // 
 // -----------------------------------------------------------------------------
 //
-void IAUpdateClient::showUpdates(const CIAUpdateParameters& updateParameters)
+TInt RIAUpdateClient::CheckUpdates( const CIAUpdateParameters& aUpdateParameters,
+                                    TInt& aAvailableUpdates, 
+                                    TRequestStatus& aStatus )
     {
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::showUpdates()");
-    QString message("showUpdates(QString,QString,QString,QString,QString,QString,QString,QString,QString)");
-    int ret = initRequest(&updateParameters, message, false);
-    if (ret == KErrNone)
-        {
-        if (mServiceRequest->send())
-            {
-            mCurrentRequestType = ShowUpdates;
-            }
-        else
-            {
-            mObserver.UpdateComplete(ret,NULL);
-            }
-        }
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::CheckUpdates()");
+    // Inform the caller about the success of the request initializing.
+    return SendCheckUpdatesRequest( IAUpdateClientDefines::EIAUpdateServerCheckUpdates,
+                                    aUpdateParameters,
+                                    aAvailableUpdates,
+                                    aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RIAUpdateClient::ShowUpdates
+// 
+// -----------------------------------------------------------------------------
+//
+TInt RIAUpdateClient::ShowUpdates( const CIAUpdateParameters& aUpdateParameters,
+                                   TInt& aNumberOfSuccessfullUpdates,
+                                   TInt& aNumberOfFailedUpdates,
+                                   TInt& aNumberOfCancelledUpdates,
+                                   TRequestStatus& aStatus )
+    {
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::ShowUpdates()");
+    // Inform the caller about the success of the request initializing.
+    return SendUpdateRequest( IAUpdateClientDefines::EIAUpdateServerShowUpdates,
+                              aUpdateParameters,
+                              aNumberOfSuccessfullUpdates,
+                              aNumberOfFailedUpdates,
+                              aNumberOfCancelledUpdates,
+                              aStatus );
     }
     
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::updateQuery
+// RIAUpdateClient::UpdateQuery
 // 
 // -----------------------------------------------------------------------------
 //    
-void IAUpdateClient::updateQuery()
-{
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::updateQuery() begin");
-    QString message("updateQuery(QString)");
-    CIAUpdateParameters* nullParameters = NULL;
-    int ret = initRequest(nullParameters, message, false);
-    if (ret == KErrNone)
+TInt RIAUpdateClient::UpdateQuery( TBool& aUpdateNow, TRequestStatus& aStatus )
     {
-        if (mServiceRequest->send()) 
-        {
-            mCurrentRequestType = UpdateQuery;
-        }
-        else
-        {
-            mObserver.UpdateQueryComplete(ret,false);
-        }
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::UpdateQuery() begin");
+	TPckg<TBool> updateNow( aUpdateNow );
+	iPtr1.Set( updateNow );
+	            
+    TIpcArgs args;
+    args.Set( 1, &iPtr1 );
+    
+	SendReceive( IAUpdateClientDefines::EIAUpdateServerShowUpdateQuery, 
+	             args, 
+	             aStatus );    
+	IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::UpdateQuery() begin");    
+    return KErrNone;
     }
-	IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::updateQuery() end");    
-}
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::update
-// 
-// -----------------------------------------------------------------------------
-// 
-void IAUpdateClient::update()
-{
-    mObserver.UpdateComplete(KErrNotSupported,NULL);
-}
-
-// -----------------------------------------------------------------------------
-// IAUpdateClient::broughtToForeground
+// RIAUpdateClient::BroughtToForeground
 // 
 // -----------------------------------------------------------------------------
 //
-void IAUpdateClient::broughtToForeground()
-{
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::broughtToForeground() begin");
-    if (mServiceRequest)
+void RIAUpdateClient::BroughtToForeground()
     {
-        QString message("broughtToForeground(int)");
-        CIAUpdateParameters* nullParameters = NULL;
-        int ret = initRequest(nullParameters, message, false);
-        if (ret == KErrNone)
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::BroughtToForeground() begin");
+    if ( iConnected )
         {
-            if (mServiceRequest->send())
-            {
-                mCurrentRequestType = BroughtToForeground;
-            }
+    	SendReceive( IAUpdateClientDefines::EIAUpdateServerToForeground );
         }
-    } 
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::broughtToForeground() end");
-}
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::BroughtToForeground() end");
+    }
+
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::requestCompleted
+// RIAUpdateClient::CancelAsyncRequest
+// 
+// -----------------------------------------------------------------------------
+//
+void RIAUpdateClient::CancelAsyncRequest()
+    {
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::CancelAsyncRequest() begin");
+    // We suppose that an active object will
+    // wait for the cancellation to complete.
+    // So, let the server know that operation is cancelled.
+    // The server should set the correct status and complete
+    // the request of the active object. So, the cancellation 
+    // can proceed to the end.
+    if ( iConnected )
+        {
+    	SendReceive( IAUpdateClientDefines::EIAUpdateServerCancel ); 
+        }
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::CancelAsyncRequest() end");
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// RIAUpdateClient::ServiceUid()
+// 
+// -----------------------------------------------------------------------------
+//
+TUid RIAUpdateClient::ServiceUid() const
+    {
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::ServiceUid()");
+    return IAUpdateClientDefines::KIAUpdateServiceUid;    
+    }
+
+// -----------------------------------------------------------------------------
+// RIAUpdateClient::SendCheckUpdatesRequest
 // 
 // -----------------------------------------------------------------------------
 //
-void IAUpdateClient::requestCompleted(const QVariant& value)
-{
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestCompleted() begin");
-    RequestType requestType = mCurrentRequestType;
-    IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::requestCompleted()request type: %d", requestType );
-    QList<QVariant> resultlist = value.toList();
-    int errorCode = resultlist.at(0).toInt();
-    CIAUpdateResult* updateResult(NULL);
-            
-    if ( requestType == ShowUpdates )
+TInt RIAUpdateClient::SendCheckUpdatesRequest( TInt aUpdateFunction,
+                                               const CIAUpdateParameters& aUpdateParameters,
+                                               TInt& aCount,
+                                               TRequestStatus& aStatus )
     {
-        // Update result object is required.
-        // Notice that the ownership is transferred later.
-        // So, this function does not need to delete updateResult object.
-        TRAPD( trapError, updateResult = CIAUpdateResult::NewL() );
-        if ( updateResult )
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::SendCheckUpdatesRequest() begin");
+    
+    aStatus = KRequestPending;
+
+    delete iData;
+    iData = NULL;   
+    
+    TInt error( KErrNone );
+    TRAP( error, 
+          IAUpdateTools::ExternalizeParametersL( iData, 
+                                                 aUpdateParameters ) );
+    IAUPDATE_TRACE_1("[IAUPDATE] error code: %d", error );
+
+    // Because this function does not leave,
+    // use error value to check if request can be done.
+    if ( error == KErrNone )
         {
-            updateResult->SetSuccessCount(resultlist.at(1).toInt());
-            updateResult->SetFailCount(resultlist.at(2).toInt());
-            updateResult->SetCancelCount(resultlist.at(3).toInt());
+        TPckg<TInt> count( aCount );
+	    iPtr1.Set( count );
+	            
+        TIpcArgs args;
+        args.Set( 0, iData );
+        args.Set( 1, &iPtr1 );
+              
+        // Start the asynchronous operation in the server side.
+        SendReceive( aUpdateFunction, args, aStatus );        
         }
-        else
-        {
-            // Something went wrong when creating update result object.
-            // Update the error code accordingly.
-            errorCode = trapError;
-        }
-            // Let's assume that connection is not needed anymore
-        if (mServiceRequest)
-        {
-            delete mServiceRequest;
-            mServiceRequest= NULL;
-        }
+
+    // Inform the caller about the success of the request initializing.
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::SendCheckUpdatesRequest() begin");
+    return error;
     }
-        
-    // Inform that no operation is going on anymore.
-    // This is required for busy check.
-    mCurrentRequestType = NoOperation;
-        
-    // Use the request type of the ongoing operation to check what callback
-    // function to call.
-    int countOfUpdates = 0;
-    bool updateNow = false;
-    switch (requestType)
-    {
-        case CheckUpdates:
-        countOfUpdates = resultlist.at(1).toInt();    
-        if (countOfUpdates == 0)
-        {
-            // Let's assume that connection is not needed anymore
-            delete mServiceRequest;  
-            mServiceRequest= NULL;
-        }
-        IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::requestCompleted() count of updates: %d", countOfUpdates );
-        mObserver.CheckUpdatesComplete(errorCode, countOfUpdates);
-        break;
-
-        case ShowUpdates:
-        // Notice that ownership of result object is transferred here.
-        IAUPDATE_TRACE_3("[IAUPDATE] IAUpdateClient::requestCompleted() success count: %d failed count: %d cancelled count: %d", updateResult->SuccessCount(), updateResult->FailCount(), updateResult->CancelCount() );
-        mObserver.UpdateComplete(errorCode, updateResult);
-        break;
-                
-        case UpdateQuery:
-        updateNow = resultlist.at(1).toBool();      
-        if ( !updateNow )
-        {
-            // Let's assume that connection is not needed anymore
-            delete mServiceRequest;
-            mServiceRequest= NULL;
-        }    
-        IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateClient::requestCompleted() update now: %d", updateNow );
-        mObserver.UpdateQueryComplete(errorCode, updateNow);
-        break;
-             
-        default:
-        // Should not ever come here.
-        break;
-    }
-            
-    // Do not anything else than return after callback function is called because 
-    // this instance can be deleted by a client in a callback function
-    // 
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestCompleted() end");
-}
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::requestError
+// RIAUpdateClient::SendUpdateRequest
 // 
 // -----------------------------------------------------------------------------
 //
-void IAUpdateClient::requestError(int /*err*/)
-{
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestError() begin");
-    if ( mServiceRequest)
-        {
-            delete mServiceRequest;
-            mServiceRequest= NULL;
-        }
-    RequestType requestType = mCurrentRequestType;
-    mCurrentRequestType = NoOperation;
-    // because this method is called also when iaupdate is closed normally, error code is not passed to a client   
-    CIAUpdateResult* updateResult(NULL);
-    switch (requestType)
+TInt RIAUpdateClient::SendUpdateRequest( TInt aUpdateFunction,
+                                         const CIAUpdateParameters& aUpdateParameters,
+                                         TInt& aNumberOfSuccessfullUpdates,
+                                         TInt& aNumberOfFailedUpdates,
+                                         TInt& aNumberOfCancelledUpdates,
+                                         TRequestStatus& aStatus )
     {
-        case CheckUpdates:
-        mObserver.CheckUpdatesComplete(0, 0);
-        break;
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::SendUpdateRequest() begin");
+    aStatus = KRequestPending;
+
+    delete iData;
+    iData = NULL;   
+    
+    TInt error( KErrNone );
+    TRAP( error, 
+          IAUpdateTools::ExternalizeParametersL( iData, 
+                                                 aUpdateParameters ) );
+    IAUPDATE_TRACE_1("[IAUPDATE] error code: %d", error );
+    // Because this function does not leave,
+    // use error value to check if request can be done.
+    if ( error == KErrNone )
+        {
+        TPckg<TInt> successCount( aNumberOfSuccessfullUpdates );
+	    iPtr1.Set( successCount );
 
-        case ShowUpdates:
-        // Notice that ownership of result object is transferred here.
-        TRAP_IGNORE( updateResult = CIAUpdateResult::NewL() );    
-        mObserver.UpdateComplete(0, updateResult);
-        break;
-                    
-        case UpdateQuery:
-        mObserver.UpdateQueryComplete(0, false);
-        break;
-                 
-        default:
-        // Should not ever come here.
-        break;
-    }
-    IAUPDATE_TRACE("[IAUPDATE] IAUpdateClient::requestError() end");
-}     
+        TPckg<TInt> failCount( aNumberOfFailedUpdates );
+	    iPtr2.Set( failCount );
+
+        TPckg<TInt> cancelCount( aNumberOfCancelledUpdates );
+	    iPtr3.Set( cancelCount );
+	    	            
+        TIpcArgs args;
+        args.Set( 0, iData );
+        args.Set( 1, &iPtr1 );
+        args.Set( 2, &iPtr2 );
+        args.Set( 3, &iPtr3 );
+      
+        // Start the asynchronous operation in the server side.
+        SendReceive( aUpdateFunction, args, aStatus );        
+        }
+
+    // Inform the caller about the success of the request initializing.
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::SendUpdateRequest() end");
+    return error;
+    }    
 
 // -----------------------------------------------------------------------------
-// IAUpdateClient::qStringFromTDesC16
+// RIAUpdateClient::StartNewAppToBackgroundL
 // 
 // -----------------------------------------------------------------------------
 //
-QString IAUpdateClient::qStringFromTDesC16( const TDesC16& aDes16 )             
-{
-    return QString::fromUtf16( aDes16.Ptr(), aDes16.Length() );
-}
-
-// -----------------------------------------------------------------------------
-// IAUpdateClient::qStringFromTDesC8
-// 
-// -----------------------------------------------------------------------------
-//
-QString IAUpdateClient::qStringFromTDesC8( const TDesC8& aDes8 )                
-{
-    return QString::fromUtf8( reinterpret_cast<const char*>( aDes8.Ptr() ), aDes8.Length() );
-}
-
-// -----------------------------------------------------------------------------
-// IAUpdateClient::qStringFromTDesC
-// 
-// -----------------------------------------------------------------------------
-//
-QString IAUpdateClient::qStringFromTDesC( const TDesC& aDes )                    
-{
-#if defined(_UNICODE)
-    return qStringFromTDesC16( aDes );
-#else
-    return qStringFromTDesC8( aDes );
-#endif
-}
+void RIAUpdateClient::StartNewAppToBackgroundL( TUid aAppUid, TRequestStatus& aStatus )
+    {
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::StartNewAppToBackgroundL() begin");
+    TName notUsed;
+    iDifferentiator = GenerateServerDifferentiatorAndName(notUsed, aAppUid);
+       
+    RApaLsSession apa;
+    User::LeaveIfError(apa.Connect());
+    CleanupClosePushL(apa);
+    
+    TApaAppInfo info;
+    User::LeaveIfError(apa.GetAppInfo(info, aAppUid));
+    
+    CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+    cmdLine->SetExecutableNameL(info.iFullName);
+    cmdLine->SetServerRequiredL( iDifferentiator );
+    cmdLine->SetCommandL(EApaCommandBackground);
+         
+    TThreadId notUsedId;
+    User::LeaveIfError(apa.StartApp(*cmdLine, notUsedId, &aStatus));
+          
+    CleanupStack::PopAndDestroy(2, &apa);   // cmdLine and apa
+    IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::StartNewAppToBackgroundL() end");
+    }
 
 
 
+void RIAUpdateClient::ServerName(TName& aServerName, TUid aAppServerUid, TUint aServerDifferentiator)
+    {
+    _LIT(KServerNameFormat, "%08x_%08x_AppServer");
+    aServerName.Format(KServerNameFormat, aServerDifferentiator, aAppServerUid);
+    }
+    
+TUint RIAUpdateClient::GenerateServerDifferentiatorAndName(TName& aServerName, TUid aAppServerUid)
+    {
+    TUint r;
+    FOREVER
+        {
+        r = Math::Random();
+        if (r==0)
+            continue;
+        ServerName(aServerName, aAppServerUid, r);
+        TFindServer find(aServerName);
+        TFullName fullName;
+        if (find.Next(fullName) == KErrNone)
+            continue;
+        break;
+        }       
+    return r;
+    }