appinstaller/AppinstUi/Client/Src/SWInstSilentLauncher.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 14 Sep 2010 21:31:28 +0300
branchRCL_3
changeset 27 e8965914fac7
parent 0 ba25891c3a9e
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* 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 <f32file.h>
#include <apgcli.h>
#include <e32math.h>
#include <eikenv.h>

#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