diff -r 000000000000 -r ba25891c3a9e appinstaller/AppinstUi/Client/Src/SWInstSilentLauncher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/appinstaller/AppinstUi/Client/Src/SWInstSilentLauncher.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,174 @@ +/* +* Copyright (c) 2002-2007 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 file contains the implementation of RSWInstSilentLauncher +* class member functions. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include + +#include "SWInstApi.h" +#include "SWInstDefs.h" +#include "SWInstCommon.h" + +using namespace SwiUI; + +const TUint KMaxServerPoll = 100; + +#ifdef __WINS__ +const TUint KServertPollTimeout = 1000000; //1sec. Wins needs more time. +#else +const TUint KServertPollTimeout = 100000; +#endif + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// RSWInstSilentLauncher::RSWInstSilentLauncher +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RSWInstSilentLauncher::RSWInstSilentLauncher() + { + } + +// ----------------------------------------------------------------------------- +// RSWInstSilentLauncher::Connect +// Creates connection to the server. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RSWInstSilentLauncher::Connect() + { + TInt result( KErrNone ); + + TUint differentiator = 0; + TRAP( result, differentiator = StartServerL( KUidSWInstSvr ) ); + if ( result == KErrNone ) + { + TName serverName; + ConstructServerName( serverName, KUidSWInstSvr, differentiator ); + TRAP( result, ConnectExistingByNameL( serverName ) ); + if ( result == KErrNone ) + { + iConnected = ETrue; + } + } + // Return the result code + return result; + } + +// ----------------------------------------------------------------------------- +// RSWInstSilentLauncher::ServiceUid +// Returns the UID of the service that this session provides an interface for. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUid RSWInstSilentLauncher::ServiceUid() const + { + return TUid::Uid( KSWInstSilentInstallServiceUid ); + } + +// ----------------------------------------------------------------------------- +// RSWInstSilentLauncher::ServerName +// Constructs the name of the server application. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void RSWInstSilentLauncher::ConstructServerName( TName& aServerName, + TUid aAppServerUid, + TUint aServerDifferentiator ) + { + _LIT(KServerNameFormat, "%08x_%08x_AppServer"); + aServerName.Format( KServerNameFormat, aServerDifferentiator, aAppServerUid ); + } + +// ----------------------------------------------------------------------------- +// RSWInstSilentLauncher::StartServerL +// Starts the server application. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUint RSWInstSilentLauncher::StartServerL( TUid aAppUid ) + { + // Start the server application + TName serverName; + TUint differentiator( 0 ); + while ( ETrue ) + { + differentiator = Math::Random(); + if ( differentiator==0 ) + continue; + ConstructServerName( serverName, aAppUid, differentiator ); + TFindServer find( serverName ); + TFullName fullName; + if ( find.Next( fullName ) == KErrNone ) + continue; + break; + } + + TThreadId serverThreadId; + LaunchAppL( aAppUid, differentiator, serverThreadId ); + + // Poll for the server to be started + for ( TInt ii = 0; ii < KMaxServerPoll; ii++ ) + { + // look for the server name + TFindServer find( serverName ); + TFullName fullName; + if ( find.Next( fullName ) == KErrNone ) + { + return differentiator; // found the server, so return + } + User::After( KServertPollTimeout ); // wait before trying again + } + User::Leave( KErrNotFound ); // failed to find the server, bomb out + + return differentiator; + } + +// ----------------------------------------------------------------------------- +// RSWInstSilentLauncher::LaunchAppL +// Launches the server application. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void RSWInstSilentLauncher::LaunchAppL( TUid aAppUid, TUint aServerDifferentiator, TThreadId& aThreadId ) + { + 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( aServerDifferentiator ); + // Set the command to start the server in background + cmdLine->SetCommandL( EApaCommandBackground ); + + User::LeaveIfError( apa.StartApp( *cmdLine, aThreadId ) ); + + CleanupStack::PopAndDestroy( 2, &apa ); // cmdLine and apa + } + + +// End of File