diff -r 000000000000 -r ba25891c3a9e iaupdate/IAD/api/client/src/iaupdateclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/api/client/src/iaupdateclient.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,366 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This module contains the implementation of RIAUpdateClient +* class member functions. +* +*/ + + + +//INCLUDES +#include +#include +#include +#include "iaupdateclient.h" +#include "iaupdateclientdefines.h" +#include "iaupdatetools.h" +#include "iaupdatedebug.h" + + +// ----------------------------------------------------------------------------- +// RIAUpdateClient::RIAUpdateClient +// +// ----------------------------------------------------------------------------- +// +RIAUpdateClient::RIAUpdateClient() +: iPtr1( NULL, 0 ), + iPtr2( NULL, 0 ), + iPtr3( NULL, 0 ) + { + } + + +// ----------------------------------------------------------------------------- +// RIAUpdateClient::Open +// +// ----------------------------------------------------------------------------- +// +TInt RIAUpdateClient::Open( TBool aToBackground ) + { + IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::Open() begin"); + TInt error( KErrNone ); + + if ( !iConnected ) + { + if ( aToBackground ) + { + TRAP( error, ConnectNewAppToBackgroundL( ServiceUid() ) ); + } + else + { + TRAP( error, ConnectNewAppL( ServiceUid() ) ); + } + if ( error == KErrNone ) + { + iConnected = ETrue; + CEikonEnv* eikEnv = CEikonEnv::Static(); + if ( eikEnv ) + { + RWindowGroup owngroup; + iOwnWgId = eikEnv->RootWin().Identifier(); + + TPckg 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] error code: %d", error ); + IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::Open() begin"); + 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"); + } + +// ----------------------------------------------------------------------------- +// RIAUpdateClient::CheckUpdates +// +// ----------------------------------------------------------------------------- +// +TInt RIAUpdateClient::CheckUpdates( const CIAUpdateParameters& aUpdateParameters, + TInt& aAvailableUpdates, + TRequestStatus& aStatus ) + { + 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 ); + } + + +// ----------------------------------------------------------------------------- +// RIAUpdateClient::UpdateQuery +// +// ----------------------------------------------------------------------------- +// +TInt RIAUpdateClient::UpdateQuery( TBool& aUpdateNow, TRequestStatus& aStatus ) + { + IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::UpdateQuery() begin"); + TPckg updateNow( aUpdateNow ); + iPtr1.Set( updateNow ); + + TIpcArgs args; + args.Set( 1, &iPtr1 ); + + SendReceive( IAUpdateClientDefines::EIAUpdateServerShowUpdateQuery, + args, + aStatus ); + IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::UpdateQuery() begin"); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// RIAUpdateClient::BroughtToForeground +// +// ----------------------------------------------------------------------------- +// +void RIAUpdateClient::BroughtToForeground() + { + IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::BroughtToForeground() begin"); + if ( iConnected ) + { + SendReceive( IAUpdateClientDefines::EIAUpdateServerToForeground ); + } + IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::BroughtToForeground() end"); + } + + +// ----------------------------------------------------------------------------- +// 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 +// +// ----------------------------------------------------------------------------- +// +TInt RIAUpdateClient::SendCheckUpdatesRequest( TInt aUpdateFunction, + const CIAUpdateParameters& aUpdateParameters, + TInt& aCount, + TRequestStatus& aStatus ) + { + 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 ) + { + TPckg 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 ); + } + + // Inform the caller about the success of the request initializing. + IAUPDATE_TRACE("[IAUPDATE] RIAUpdateClient::SendCheckUpdatesRequest() begin"); + return error; + } + +// ----------------------------------------------------------------------------- +// RIAUpdateClient::SendUpdateRequest +// +// ----------------------------------------------------------------------------- +// +TInt RIAUpdateClient::SendUpdateRequest( TInt aUpdateFunction, + const CIAUpdateParameters& aUpdateParameters, + TInt& aNumberOfSuccessfullUpdates, + TInt& aNumberOfFailedUpdates, + TInt& aNumberOfCancelledUpdates, + TRequestStatus& aStatus ) + { + 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 successCount( aNumberOfSuccessfullUpdates ); + iPtr1.Set( successCount ); + + TPckg failCount( aNumberOfFailedUpdates ); + iPtr2.Set( failCount ); + + TPckg 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; + } + +void RIAUpdateClient::ConnectNewAppToBackgroundL( TUid aAppUid ) + { + TName notUsed; + const TUint differentiator = GenerateServerDifferentiatorAndName(notUsed, aAppUid); + TRequestStatus requestStatusForRendezvous; + + 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( differentiator ); + cmdLine->SetCommandL(EApaCommandBackground); + + TThreadId notUsedId; + User::LeaveIfError(apa.StartApp(*cmdLine, notUsedId, &requestStatusForRendezvous)); + + CleanupStack::PopAndDestroy(2, &apa); // cmdLine and apa + + User::WaitForRequest(requestStatusForRendezvous); + User::LeaveIfError(requestStatusForRendezvous.Int()); + + TName serverName; + ServerName(serverName, aAppUid, differentiator); + ConnectExistingByNameL(serverName); + } + + + + +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; + }