locationcentre/lcutils/src/lcapplauncher.cpp
branchRCL_3
changeset 16 4721bd00d3da
parent 14 3a25f69541ff
child 21 e15b7f06eba6
--- a/locationcentre/lcutils/src/lcapplauncher.cpp	Wed Apr 14 15:50:30 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,600 +0,0 @@
-/*
-* Copyright (c) 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:  Utility class which provides the Application, Service and File
-*                launching services to Location Centre.
-*
-*/
-
-
-// SYSTEM INCLUDES
-#include <apgcli.h>
-#include <apgtask.h>
-#include <eikenv.h>
-#include <lcappexitobserver.h>
-#include <schemehandler.h>
-#include <DocumentHandler.h>
-#include <e32math.h>
-#include <eikappui.h>
-#include <avkon.hrh>
-
-// USER INCLUDES
-#include "lcapplauncher.h"
-#include "lcipcparams.h"
-#include "lcdebug.h"
-
-// CONSTANT DEFINITIONS
-_LIT( KLcFourSpace, "4 " );
-
-// Maximum value that the UID field can take in S60
-const TUint32   KUidMaxValue = 0xFFFFFFFF;
-
-// Application Server Service ID. This is the same valuw which AknAppService classes use
-const TUid KLcLaunchAppServiceUid = { 0x101F887A };
-
-// -------- Member functions of RLcLaunchAppService --------------------------
-
-// ---------------------------------------------------------
-// TUid RLcLaunchAppService::ServiceUid
-// ---------------------------------------------------------
-//
-TUid RLcLaunchAppService::ServiceUid() const
-    {
-    return KLcLaunchAppServiceUid;
-    }
-
-// -------- Member functions of CLcLaunchAppService --------------------------
-
-// ---------------------------------------------------------------------------
-// CLcLaunchAppService* CLcLaunchAppService::NewL
-// ---------------------------------------------------------------------------
-//
-CLcLaunchAppService* CLcLaunchAppService::NewL()
-	{
-	CLcLaunchAppService* self = new ( ELeave ) CLcLaunchAppService();
-	return self;
-	}
-
-// ---------------------------------------------------------------------------
-// CLcLaunchAppService::~CLcLaunchAppService
-// ---------------------------------------------------------------------------
-//		
-CLcLaunchAppService::~CLcLaunchAppService()
-	{
-    delete iMonitor;
-    iService.Close();	
-	}
-
-// ---------------------------------------------------------------------------
-// Tvoid CLcLaunchAppService::ServerName
-// ---------------------------------------------------------------------------
-//
-void CLcLaunchAppService::ServerName( TName& 	aServerName,
-					 				  TUid 		aAppServerUid,
-					 				  TUint 	aServerDifferentiator )
-	{
-	_LIT(KServerNameFormat, "%08x_%08x_AppServer");
-	aServerName.Format( KServerNameFormat, 
-						aServerDifferentiator, 
-						aAppServerUid );
-	}
-
-// ---------------------------------------------------------------------------
-// TUid RLcLaunchAppService::ServiceUid
-// ---------------------------------------------------------------------------
-//	
-TUint CLcLaunchAppService::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;
-	}
-
-// ---------------------------------------------------------------------------
-// void CLcLaunchAppService::LaunchAppL
-// ---------------------------------------------------------------------------
-//		
-void CLcLaunchAppService::LaunchAppL( const TUid& 						aAppUid, 
-    					   				    MAknServerAppExitObserver& 	aObserver, 
-    				 				  const TDesC&               		aCmdLineArg )
-	{	
-	DEBUG("+ CLcLaunchAppService::LaunchAppL")
-		
-	CEikonEnv* eikEnv = CEikonEnv::Static();		
-	RWindowGroup& wg = eikEnv->RootWin();
-	
-	TName notUsed;
-	const TUint differentiator = GenerateServerDifferentiatorAndName( notUsed, aAppUid );
-	TRequestStatus requestStatusForRendezvous;
-	
-	RApaLsSession apa;
-	User::LeaveIfError( apa.Connect());
-	CleanupClosePushL( apa );
-	
-    // Check for the Application capabilities
-    TApaAppCapabilityBuf capabilityBuf;
-    User::LeaveIfError( apa.GetAppCapability( capabilityBuf, aAppUid ));
-    TApaAppCapability& caps = capabilityBuf();
-	
-	// Launch only those applications can be embedded and will not be run the background
-	
-	if( caps.iLaunchInBackground || 
-	    caps.iEmbeddability == TApaAppCapability::ENotEmbeddable )
-		{
-		User::Leave( KErrNotSupported );
-		}
-			
-	TApaAppInfo info;
-	User::LeaveIfError( apa.GetAppInfo( info, aAppUid ));
-
-    // Pack the command line arguments
-	CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
-	cmdLine->SetExecutableNameL(info.iFullName);
-	cmdLine->SetServerRequiredL(differentiator);
-
-    // Set the Command line arguments.
-    if ( aCmdLineArg.Length())
-        {
-        // These arguments would be sent as Tail end arguments to the launched
-        // Application. Its left to the application to handle those
-        HBufC8* tailEnd = HBufC8::NewLC( aCmdLineArg.Length());
-        tailEnd->Des().Copy( aCmdLineArg );
-        
-        // The Tail end buffer is copied to the Command line structure. Hence,
-        // can delete this variable after the set operation succeeds.
-        cmdLine->SetTailEndL( tailEnd->Des());
-        
-        CleanupStack::PopAndDestroy( tailEnd );
-        }
-
-	cmdLine->SetCommandL( EApaCommandRun );
-
-	// Window chain the client with the current application
-	const TInt parentWindowGroupID = wg.Identifier();
-	if ( parentWindowGroupID )
-		{
-		cmdLine->SetParentWindowGroupID( parentWindowGroupID );
-		wg.AllowProcessToCreateChildWindowGroups( aAppUid );
-		}
-
-	// Launch the requested Application
-	TThreadId threadNotUsed;
-	User::LeaveIfError( apa.StartApp( *cmdLine, 
-								      threadNotUsed, 
-								      &requestStatusForRendezvous ));
-
-	CleanupStack::PopAndDestroy(2, &apa);	// cmdLine and apa	
-	
-	CEikAppUi* appUi = eikEnv->EikAppUi();
-	if ( appUi )
-		{
-		appUi->DeactivateActiveViewL();
-		}
-
-	User::WaitForRequest( requestStatusForRendezvous );
-	User::LeaveIfError( requestStatusForRendezvous.Int());
-	
-	// Establish a connection to the running server
-	TName serverName;
-	ServerName( serverName, aAppUid, differentiator );
-	
-	// Though the server had been successfully created the application
-	// has can shutdown before we can establish a connection. There is nothing
-	// that we can do here. Ignore the error.	
-	iService.ConnectExistingByNameL(serverName );
-
-	// Set the observer for receiving notifications of the application exit.
-    iMonitor = CApaServerAppExitMonitor::NewL( iService, 
-    										   aObserver,
-    										   CActive::EPriorityStandard );
-    										   
-    DEBUG("- CLcLaunchAppService::LaunchAppL")    										   
-	}
-    				 
-
-// ----- Member funtions for CLcAppLauncher ----------------------------------
-
-// ---------------------------------------------------------------------------
-// CLcAppLauncher::CLcAppLauncher
-// ---------------------------------------------------------------------------
-//
-CLcAppLauncher::CLcAppLauncher()
-    {
-    // C++ Default constructor. No allocations or functions which can Leave
-    // should be called from here.
-    }
-         
-// ---------------------------------------------------------------------------
-// CLcAppLauncher::~CLcAppLauncher
-// ---------------------------------------------------------------------------
-//
-CLcAppLauncher::~CLcAppLauncher()
-    {
-	
-	// Delete the Broswer launcher.
-	delete iBrowserLauncher;
-	
-	// Delete the document handler.
-	delete iDocHandler;
-	
-	// Delete the Application Service if it exists
-	delete iAppService;    	
-    }
-        
-// ---------------------------------------------------------------------------
-// CLcAppLauncher* CLcAppLauncher::NewL
-// ---------------------------------------------------------------------------
-//
-EXPORT_C CLcAppLauncher* CLcAppLauncher::NewL()
-    {
-    CLcAppLauncher* self = NewLC();
-    CleanupStack::Pop( self );
-    return self;         
-    }
-
-// ---------------------------------------------------------------------------
-// CLcAppLauncher* CLcAppLauncher::NewLC
-// ---------------------------------------------------------------------------
-//
-EXPORT_C CLcAppLauncher* CLcAppLauncher::NewLC()
-    {
-    // Symbian Two phased constructor. Leaves the object on the Clean-up
-    // stack.
-    CLcAppLauncher* self = new ( ELeave ) CLcAppLauncher();
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    return self;         
-    }
-
-// ---------------------------------------------------------------------------
-// void CLcAppLauncher::ConstructL
-// ---------------------------------------------------------------------------
-//
-void CLcAppLauncher::ConstructL()
-    {
-    // Second phase of the two phase constructor.    
-    iEnv = CEikonEnv::Static();
-    }
-
-// ---------------------------------------------------------------------------
-// void LcAppLauncher::LaunchLocationApplicationL
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CLcAppLauncher::LaunchLocationApplicationL(
-                                TInt                 	aAppType,
-                          const TDesC&                  aIdentifer,
-                                TBool                   aStandAlone,
-                          const TDesC&                  aCmdLineArg,
-                                MLcAppExitObserver*     aExitObserver )
-    {  
-    DEBUG("+ CLcLaunchAppService::LaunchLocationApplicationL")
-    
-    // Check for the validity of the request
-    
-    // Check if there is an outstanding Embedded launch request
-    if(( isEmbeddedLaunchOutstanding && !aStandAlone ) ||
-       ( !aStandAlone && !iEnv ))
-    	{
-        User::Leave( KErrNotSupported );    	
-    	}
-    
-    // At any instant of time this class can one outstanding Exit observer.
-    // There is currently no provision of storing a list of observers and
-    // mapping them correspondingly to each of the assciated applications
-    // Hence, Leave if there exists an Exit observer.
-    if (( aExitObserver && iExitObserver ))
-        {
-        User::Leave( KErrAlreadyExists );
-        }
-        
-    // Launch the Applications based on their type and Mode of launching
-    switch ( aAppType )
-        {
-        case ELcNativeApplication:
-            {
-            // Since the request is for a Native S60 application, the Identifer
-            // contains an UID. Obtain it using Lexer
-            TLex lexer( aIdentifer );
-            TUint32 uidValue;
-            
-            User::LeaveIfError( lexer.BoundedVal( uidValue, EHex, KUidMaxValue ));
-            
-            if ( aStandAlone )
-            	{
-	            // Launch the Location based Application based standalone mode
-	            LaunchAppL( TUid::Uid( uidValue ), aCmdLineArg );   	
-            	}
-			else
-				{
-				// Launch Application in the chained mode
-				LaunchAppAsChainedL( TUid::Uid( uidValue ), aCmdLineArg, aExitObserver );
-				}
-                
-            break;
-            }
-        case ELcWebUrl:
-            {
-            LaunchWebBroserL( aIdentifer, aStandAlone, aExitObserver );
-            break;
-            }
-        case ELcDocument:
-            {
-            LaunchContentL( aIdentifer, aStandAlone, aExitObserver );
-            break;
-            }
-        default:
-            {
-            User::Leave( KErrNotSupported );
-            break;
-            }
-        }
-        
-    DEBUG("+ CLcLaunchAppService::LaunchLocationApplicationL")        
-    }
-        
-// ---------------------------------------------------------------------------
-// void LcAppLauncher::LaunchAppL
-// ---------------------------------------------------------------------------
-//
-void CLcAppLauncher::LaunchAppL(
-                                TUid                    aApplicationUid,
-                          const TDesC&                  aCmdLineArg )
-    {  
-    DEBUG("+ CLcAppLauncher::LaunchAppL")
-    
-    // Create the Session handle and connect to the Application architecture
-    // server. This is required to obtain the details of the application from
-    // the Application UID.
-    RApaLsSession lsSession;
-    User::LeaveIfError( lsSession.Connect() );
-    CleanupClosePushL( lsSession );
-        
-    // Get the Application's capability.
-    TApaAppCapabilityBuf capabilityBuf;
-    User::LeaveIfError( lsSession.GetAppCapability( capabilityBuf, aApplicationUid ));
-    TApaAppCapability& caps = capabilityBuf();
-	
-	if ( caps.iEmbeddability == TApaAppCapability::EEmbeddableOnly ||
-	     caps.iEmbeddability == TApaAppCapability::EEmbeddableUiNotStandAlone )
-	    {
-	    User::Leave( KErrNotSupported );
-	    }
-		            
-    // Get the Application Information.
-    TApaAppInfo appInfo;    
-    User::LeaveIfError( lsSession.GetAppInfo( appInfo, aApplicationUid ) );
-    
-    // Fill the command line argument structure
-    CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
-    
-    // Set the Application name.    
-    TFileName appName = appInfo.iFullName;
-    cmdLine->SetExecutableNameL( appName );
-    
-    // Set the Command
-    if ( caps.iLaunchInBackground )
-        {
-        cmdLine->SetCommandL( EApaCommandBackground );
-        }
-    else
-        {
-        cmdLine->SetCommandL( EApaCommandRun );
-        }
-
-    // Set the Command line arguments.
-    if ( aCmdLineArg.Length())
-        {
-        // These arguments would be sent as Tail end arguments to the launched
-        // Application. Its left to the application to handle those
-        HBufC8* tailEnd = HBufC8::NewLC( aCmdLineArg.Length());
-        tailEnd->Des().Copy( aCmdLineArg );
-        
-        // The Tail end buffer is copied to the Command line structure. Hence,
-        // can delete this variable after the set operation succeeds.
-        cmdLine->SetTailEndL( tailEnd->Des());
-        
-        CleanupStack::PopAndDestroy( tailEnd );
-        }
-
-	// Start the Application
-	User::LeaveIfError( lsSession.StartApp( *cmdLine ));
-    
-    // Clean up all the allocated heap variables.
-    CleanupStack::PopAndDestroy( cmdLine );
-    CleanupStack::PopAndDestroy(); //lsSession 		         
-    
-    DEBUG("- CLcAppLauncher::LaunchAppL")
-    }
-
-// ---------------------------------------------------------------------------
-// void LcAppLauncher::LaunchAppAsChainedL
-// ---------------------------------------------------------------------------
-//
-void CLcAppLauncher::LaunchAppAsChainedL( 	  
-							  TUid                    aApplicationUid,                               
-                 		const TDesC&                  aCmdLineArg,
-                 			  MLcAppExitObserver*     aExitObserver )
-	{
-	DEBUG("+ CLcAppLauncher::LaunchAppAsChainedL" )
-	
-	// Createt the App service object and launch the application
-	CLcLaunchAppService* appService = CLcLaunchAppService::NewL();
-	CleanupStack::PushL( appService );
-	appService->LaunchAppL( aApplicationUid, *this, aCmdLineArg );
-	CleanupStack::Pop( appService );
-	
-	// Transfer the ownership to this class.
-	iAppService = appService;	
-	isEmbeddedLaunchOutstanding = ETrue;
-	
-	// Store the Observer for future reference
-	iExitObserver = aExitObserver;
-	
-	DEBUG("- CLcAppLauncher::LaunchAppAsChainedL" )	
-	}
-	
-// ---------------------------------------------------------------------------
-// void LcAppLauncher::LaunchWebBroserL
-// ---------------------------------------------------------------------------
-// 
-void CLcAppLauncher::LaunchWebBroserL( const TDesC&              aUrl,
-                                             TBool               aStandAlone,
-                                             MLcAppExitObserver* aObserver )
-    {
-    // The parameters need to be packed in the order specified by the browser.
-    // Parameters are separated by space
-    // 1st parameter: Type of the second parameter. In this case 4 to indicate
-    //                that the second parameter is a URL.
-    // 2nd parameter: URL that needs to be launched in the browser.
-    // Since we have to pack "4 " before the URL name, the total length of
-    // the parameter string should be Length of the URL + 2.
-    HBufC* param = HBufC::NewLC(( 2 + aUrl.Length()));
-    param->Des().Append( KLcFourSpace );
-    param->Des().Append( aUrl );
-    
-    if ( aStandAlone )
-        {
-        // The URL is launched in the Browser. Set the Browser UID as the UID
-        // of the application which needs to be launched.
-        const TInt KBrowserUid = 0x10008D39;
-        TUid id( TUid::Uid( KBrowserUid ) );
-        
-        // Check if the Browser application is already running. Incase its
-        // running Open this URL in the browser.
-        TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
-        TApaTask task = taskList.FindApp( id );
-        if ( task.Exists() )
-            {
-            // The browser is running. Launch the URL.
-            HBufC8* param8 = HBufC8::NewLC( param->Length() );
-            param8->Des().Append( *param );
-            task.SendMessage( TUid::Uid( 0 ), *param8 ); // UID is not used
-            CleanupStack::PopAndDestroy();
-            }
-        else 
-            {
-            // The browser is not running. Start the browser application with
-            // the specified parameter. This is done by launching the browser with
-            // a document name as the URL.
-            RApaLsSession appArcSession;
-            
-            // Connect to the Application architecture server.
-            User::LeaveIfError( appArcSession.Connect());
-            CleanupClosePushL( appArcSession );
-            TThreadId id;
-            
-            // Start the browser with the URL
-            User::LeaveIfError( appArcSession.StartDocument( *param, 
-                                                             TUid::Uid( KBrowserUid ),
-                                                             id ));
-            CleanupStack::PopAndDestroy( &appArcSession );
-            }        
-        }
-    else
-        {
-        
-        if ( !iBrowserLauncher )
-            {
-            // Create the Browser instance    
-            iBrowserLauncher = CSchemeHandler::NewL( aUrl );
-            }
-            
-        // Launch the Web URL in a browser in the Embedded mode.
-        iBrowserLauncher->HandleUrlEmbeddedL();
-        iBrowserLauncher->Observer( this );
-            
-        // Set the Observer incase we need to notify the termination of the
-        // browser                                              
-        aObserver ? ( iExitObserver = aObserver ) : NULL;
-        
-        isEmbeddedLaunchOutstanding = ETrue;      
-        }
-    CleanupStack::PopAndDestroy( param ); // param
-    
-    }
-
-// ---------------------------------------------------------------------------
-// void LcAppLauncher::LaunchContentL
-// ---------------------------------------------------------------------------
-//    
-void CLcAppLauncher::LaunchContentL( const TDesC&       		aFileName,
-    						   			   TBool                aStandAlone,
-    						   			   MLcAppExitObserver*  aObserver )
-    {
-    if ( !iDocHandler )
-    	{
-    	iDocHandler = CDocumentHandler::NewL();
-    	iDocHandler->SetExitObserver( this );
-    	}
-   
-    TDataType dataType;    
-    if ( aStandAlone )
-    	{
-	   	// The return values are ignored since, the User Cancelling the event doesnt
-	   	// make any difference to the Client Application	
-	    User::LeaveIfError( iDocHandler->OpenFileL( aFileName, dataType ));      	
-    	}
-	else
-		{
-		iExitObserver = aObserver;
-	   	// The return values are ignored since, the User Cancelling the event doesnt
-	   	// make any difference to the Client Application	
-	    User::LeaveIfError( iDocHandler->OpenFileEmbeddedL( aFileName, dataType ));
-	    
-        isEmbeddedLaunchOutstanding = ETrue;	    	
-		}    	
-    }
-
-// ---------------------------------------------------------------------------
-// void LcAppLauncher::HandleServerAppExit
-// ---------------------------------------------------------------------------
-//    
-void CLcAppLauncher::HandleServerAppExit( TInt aReason )
-    {
-    isEmbeddedLaunchOutstanding = EFalse;
-    
-    // Delete the App Service
-  	delete iAppService;
-  	iAppService = NULL;    
-  	
-    MLcAppExitObserver* observer = iExitObserver;        
-    if ( observer )
-    	{
-    	// Once the request has been issued we can NULLify the observer. Nullifying
-	    // it before the actual callback to faciliate the launching of another app
-	    // with an exit observer when the call is executed.
-	    iExitObserver = NULL;
-    
-    	TRAP_IGNORE( observer->HandleChainedLocationAppExitL( aReason ));
-    	}
-    	
-	MAknServerAppExitObserver::HandleServerAppExit( aReason );	  
-    }
-
-// End of File
-