browserui/browser/Launcher2/src/BrowserLauncher.cpp
branchRCL_3
changeset 65 8e6fa1719340
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserui/browser/Launcher2/src/BrowserLauncher.cpp	Wed Sep 01 12:31:04 2010 +0100
@@ -0,0 +1,563 @@
+/*
+* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  BrowserLauncher
+*
+*/
+
+// INCLUDE FILES
+#include <browserlauncher.h>
+#include "BrowserLauncherExtension.h"
+#include "logger.h"
+#include "BrowserUiPrivateCRKeys.h"
+#include <browseroverriddensettings.h>
+#include "Browser.hrh"
+
+#include <favouriteslimits.h> // Context Id:s
+#include <eikappui.h>
+#include <eikapp.h>
+#include <eikenv.h>
+#include <centralrepository.h>
+#include <favouritesdb.h>
+#include <SysUtil.h>
+
+// CONSTANTS
+const TInt KBrowserAppUid = 0x10008D39;
+const TInt KBrowserSeamlessParamLength = 20;
+_LIT( KBookmarkStarterString, "1 " );
+const TInt KMinimumCDriveDiskSpace = 512 * 1024;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::CBrowserLauncher
+// -----------------------------------------------------------------------------
+//
+CBrowserLauncher::CBrowserLauncher()
+    {
+    iBrowserUid = TUid::Uid( KBrowserAppUid );
+    }
+    
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncher::ConstructL()
+    {
+    LOG_CREATE;
+    LOG_ENTERFN( "CBrowserLauncher::ConstructL" );
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+CBrowserLauncher* CBrowserLauncher::NewLC()
+    {
+    LOG_ENTERFN( "CBrowserLauncher::NewLC" );
+    CBrowserLauncher* self = new(ELeave) CBrowserLauncher();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+CBrowserLauncher* CBrowserLauncher::NewL()
+    {
+    LOG_ENTERFN( "CBrowserLauncher::NewL" );
+    CBrowserLauncher* self = NewLC();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C 
+CBrowserLauncher* CBrowserLauncher::NewLC( TInt /*aOverrideBrowserUid*/ )
+    {
+    LOG_ENTERFN( "CBrowserLauncher::NewLC(TInt aOverrideBrowserUid) IS DEPRECATED" );
+    CBrowserLauncher* self = new(ELeave) CBrowserLauncher();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;	
+	}
+	
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C
+CBrowserLauncher* CBrowserLauncher::NewL( TInt /*aOverrideBrowserUid*/ )
+    {
+    LOG_ENTERFN( "CBrowserLauncher::NewL(TInt aOverrideBrowserUid) IS DEPRECATED" );
+    CBrowserLauncher* self = NewLC();
+    CleanupStack::Pop();
+    return self;	
+    }
+	
+// Destructor
+EXPORT_C 
+CBrowserLauncher::~CBrowserLauncher()
+    {
+    LOG_ENTERFN( "CBrowserLauncher::~CBrowserLauncher" );
+    Cancel();
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserLauncher::LaunchBrowserEmbeddedL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CBrowserLauncher::LaunchBrowserEmbeddedL
+                      ( const TDesC& aParams, 
+                        MDownloadedContentHandler* aContentHandler, 
+                        MAknServerAppExitObserver* aExitObserver, 
+                        TBrowserOverriddenSettings* aSettings )
+    {
+    LaunchBrowserEmbeddedL
+                      ( aParams, 
+                        /*aContextId*/KErrNotFound, 
+                        aContentHandler, 
+                        aExitObserver, 
+                        aSettings );
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserLauncher::LaunchBrowserEmbeddedL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CBrowserLauncher::LaunchBrowserEmbeddedL
+                      ( TInt aContextId, 
+                        MDownloadedContentHandler* aContentHandler, 
+                        MAknServerAppExitObserver* aExitObserver, 
+                        TBrowserOverriddenSettings* aSettings )
+    {
+    LaunchBrowserEmbeddedL
+                      ( /*aParams*/KNullDesC, 
+                        aContextId, 
+                        aContentHandler, 
+                        aExitObserver, 
+                        aSettings );
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserLauncher::LaunchBrowserSyncEmbeddedL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C 
+TInt CBrowserLauncher::LaunchBrowserSyncEmbeddedL
+                      ( const TDesC& aParams, 
+                        MDownloadedContentHandler* aContentHandler, 
+                        TBrowserOverriddenSettings* aSettings )
+    {
+    LaunchBrowserEmbeddedL
+                      ( aParams, 
+                        /*aContextId*/KErrNotFound, 
+                        aContentHandler, 
+                        /*aExitObserver*/0, 
+                        aSettings );
+
+    return (iExtension->WaitBrowserToFinish());
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserLauncher::LaunchBrowserSyncEmbeddedL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C 
+TInt CBrowserLauncher::LaunchBrowserSyncEmbeddedL
+                      ( TInt aContextId, 
+                        MDownloadedContentHandler* aContentHandler, 
+                        TBrowserOverriddenSettings* aSettings )
+    {
+    LaunchBrowserEmbeddedL
+                      ( /*aParams*/KNullDesC, 
+                        aContextId, 
+                        aContentHandler, 
+                        /*aExitObserver*/0, 
+                        aSettings );
+
+    return (iExtension->WaitBrowserToFinish());
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserLauncher::Cancel
+// ----------------------------------------------------------------------------
+//
+EXPORT_C 
+void CBrowserLauncher::Cancel()
+    {
+    // Terminate the Browser
+    delete iExtension;
+    iExtension = 0;
+    iFavouritesSess.Close();    
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::LaunchBrowserEmbeddedL
+// If aParams is not empty, then it is used, otherwise aContextId is used.
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncher::LaunchBrowserEmbeddedL
+                      ( const TDesC& aParams, 
+                        TInt aContextId, 
+                        MDownloadedContentHandler* aContentHandler, 
+                        MAknServerAppExitObserver* aExitObserver, 
+                        TBrowserOverriddenSettings* aSettings )
+    {
+    LOG_ENTERFN( "CBrowserLauncher::LaunchBrowserEmbeddedL" );
+    
+    LOG_WRITE_FORMAT(" aParams: [%S]", &aParams);
+    LOG_WRITE_FORMAT(" aContextId: %d", aContextId);
+    LOG_WRITE_FORMAT(" aContentHandler: 0x%x", aContentHandler);
+    LOG_WRITE_FORMAT(" aExitObserver: 0x%x", aExitObserver);
+    LOG_WRITE_FORMAT(" aSettings: 0x%x", aSettings);
+
+    // Check for ciritical disk space if starts as embeded
+    RFs fs;
+	User::LeaveIfError(fs.Connect());
+	TInt drive( EDriveC );
+	TBool isSpace( EFalse );
+	TInt err( KErrNone );
+	TRAP( err, isSpace = !SysUtil::DiskSpaceBelowCriticalLevelL(&fs, KMinimumCDriveDiskSpace, drive ));
+	fs.Close();
+	if (!isSpace)
+		User::Leave(KErrDiskFull);
+	
+	
+	TInt folderUid = 0;
+    TInt folderPreferredUid = 0;
+    
+    // keep a local ptr to aSettings
+    TBrowserOverriddenSettings* aOverrideSettings = aSettings;
+    
+    TUid embeddingAppUid = CEikonEnv::Static()->EikAppUi()->Application()->AppDllUid();
+    LOG_WRITE_FORMAT(" embeddingAppUid: 0x%x", embeddingAppUid);
+    
+    iExtension = CBrowserLauncherExtension::NewL( *this );
+    User::LeaveIfError( iFavouritesSess.Connect() );    
+	
+    if ( 0 == aParams.Length() )
+        {       
+        // SPECIAL folder UID handling
+        folderUid = KFavouritesNullUid;
+        TUint specialContextId = EBrowserContextIdNormal;
+        
+        switch(aContextId)
+        	{
+        		case KFavouritesFeedsContextId:
+  					// For feeds, leave uid to Root as it is here.
+  					// Upon launch, browser will then switch into the Feeds view
+        			// upon opening.
+        			specialContextId = EBrowserContextIdFeeds;
+        			folderUid = KFavouritesRootUid;
+        			folderPreferredUid = KFavouritesNullUid;
+        			break;
+        		default:
+        			break;
+        	}
+        	
+        // If we have now just set the folderUid, then
+        // we need to tell browser of the context id if it's not done already
+        if(folderUid != KFavouritesNullUid)
+        	{
+       		// if we're already given override settings and the specialContextId
+       		// is not already given, set it now
+       		if(aOverrideSettings)
+       			{
+       			if(aOverrideSettings->GetBrowserSetting(EBrowserOverSettingsContextId) != EBrowserContextIdUndefined)
+       				{
+       				aOverrideSettings->SetBrowserSetting(EBrowserOverSettingsContextId, specialContextId);
+   					}
+       			}
+   			else
+   				{
+   					aOverrideSettings = new (ELeave) TBrowserOverriddenSettings;
+   					CleanupStack::PushL( aOverrideSettings );
+   					aOverrideSettings->SetBrowserSetting(EBrowserOverSettingsContextId, specialContextId);					
+       			}
+        	}      	
+        if(folderUid == KFavouritesNullUid)
+        	{        
+	        // Resolve folder uid
+	        folderUid = FolderByContextIdL( aContextId );
+	        if ( folderUid == KFavouritesNullUid )
+	            {
+	                folderUid = KFavouritesRootUid;
+	            }
+	        folderPreferredUid = BookmarksIdByFolderIdL( folderUid );
+	        }
+        }
+	LOG_WRITE_FORMAT("folderPreferredUid = 0x%x", folderPreferredUid );
+	
+	// Initialize client and connect to Browser application.
+    iExtension->iLauncherClientService.InitializeL( iBrowserUid, *iExtension );
+    
+  	LOG_WRITE("After iLauncherClientService.InitializeL ");
+    
+    // Start listening to Browser application.
+    iExtension->iLauncherClientService.ListenL( );
+    LOG_WRITE("After iLauncherClientService.ListenL ");
+    
+    // Set handler of finished download.
+    iExtension->iDownloadedContentHandler = aContentHandler;
+    // Set handler of server exit.
+    iExtension->iBrowserLauncherClientExitObserver = aExitObserver;
+
+    HBufC* seamlessParam = 0;
+    if ( !aParams.Length()  && folderPreferredUid  && EnhancedSeamlessLinkLocalFeaturesSupportedL() )
+        {
+        seamlessParam = HBufC::NewLC( KBrowserSeamlessParamLength );
+        seamlessParam->Des().Copy( KBookmarkStarterString );
+        seamlessParam->Des().AppendNum( folderPreferredUid );
+        }
+
+    // Pack aSettings,folderUid,aParams into a descriptor, and send the
+    // data to Browser application.
+    // Note: if seamlessParam is not empty, it must be used instead of aParams!
+    HBufC8* bufferToSend = 0;    
+    if ( seamlessParam )
+        {
+		// Create descriptor with seamless seamlessParam
+        bufferToSend = TLauncherPackageUtils::PackLauncherDataL( embeddingAppUid, aOverrideSettings, folderUid, *seamlessParam, aContentHandler!=0 );
+        }
+    else
+        {
+		// Create descriptor with seamless aParams
+        bufferToSend = TLauncherPackageUtils::PackLauncherDataL( embeddingAppUid, aOverrideSettings, folderUid, aParams, aContentHandler!=0 );
+        }
+    // Remember for this buffer in the Extension, because re-initialization.
+    iExtension->SetPackedLauncherData( bufferToSend );
+    
+    // dbg
+    // iExtension->iLauncherClientService.SendCommand( EServerExit );
+    // iExtension->iLauncherClientService.SendSync( *bufferToSend );
+    // dbg
+    
+    // Send parameters to Browser application.
+    iExtension->iLauncherClientService.SendAsync( *bufferToSend, iExtension->iBufferSizeP );
+    
+    if ( seamlessParam )
+        {
+        CleanupStack::PopAndDestroy( seamlessParam ); // seamlessParam
+        }
+
+	// Cleanup overridden settings. If it was passed in as NULL, and the local
+	// version is not, it means we allocated locally for it. Cleanup
+	if(!aSettings && aOverrideSettings)
+		{
+			CleanupStack::PopAndDestroy(1); //aOverrideSettings
+		}
+    LOG_WRITE("LaunchBrowserEmbeddedL End ");
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::FolderByContextIdL
+// -----------------------------------------------------------------------------
+//
+TInt CBrowserLauncher::FolderByContextIdL( TUint32 aContextId )
+    {
+    LOG_ENTERFN( "CBrowserLauncher::FolderByContextIdL" );
+
+    TInt folder = KFavouritesNullUid;
+    if ( aContextId != (TUint32)KFavouritesNullContextId )
+        {
+        CArrayFix<TInt>* uids = new (ELeave) CArrayFixFlat<TInt>( 1 );
+        CleanupStack::PushL( uids );
+
+        RFavouritesDb db;
+        User::LeaveIfError( db.Open( iFavouritesSess, KBrowserBookmarks ) );
+        CleanupClosePushL<RFavouritesDb>( db );
+        User::LeaveIfError( db.GetUids( *uids, KFavouritesNullUid,
+            CFavouritesItem::EFolder, NULL, aContextId ) );
+
+        if( uids->Count() > 0 )
+            {
+            folder = uids->At( 0 );
+            }
+        CleanupStack::PopAndDestroy( 2 );   // db, uids
+    }
+
+    return folder;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::BookmarksIdByFolderIdL
+// -----------------------------------------------------------------------------
+//
+TInt CBrowserLauncher::BookmarksIdByFolderIdL( TUint32 aFolderId )
+    {
+    TInt bookmarkId = KFavouritesNullUid;
+    if ( aFolderId != (TUint32)NULL )
+        {
+
+        RFavouritesDb db;
+        User::LeaveIfError( db.Open( iFavouritesSess, KBrowserBookmarks ) );
+        CleanupClosePushL<RFavouritesDb>( db );
+        User::LeaveIfError( db.PreferredUid( aFolderId , bookmarkId ) );
+
+        CleanupStack::PopAndDestroy( );   // db
+        }
+    return bookmarkId;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncher::EnhancedSeamlessLinkLocalFeaturesSupportedL
+// -----------------------------------------------------------------------------
+//
+TBool CBrowserLauncher::EnhancedSeamlessLinkLocalFeaturesSupportedL()
+    {
+    TBool supported = EFalse;
+    TInt featureBitmask;
+
+    CRepository* repository = CRepository::NewL( KCRUidBrowserUiLV );
+    //Read local features bitmask
+        if ( repository->Get( KBrowserUiCommonFlags, featureBitmask ) != KErrNone )
+            {
+            featureBitmask = 0;
+            } 
+        if  ( featureBitmask /*& KBrowserUiPreferredBookmarks*/  )
+            {    
+            supported = ETrue;
+            }
+    delete repository;
+
+    return supported;
+    }
+
+// ---------------------------------------------------------
+// TLauncherPackageUtils::PackLauncherDataL()
+// ---------------------------------------------------------
+//
+HBufC8* TLauncherPackageUtils::PackLauncherDataL( const TUid aEmbeddingAppUid, 
+												  const TBrowserOverriddenSettings* aSettings, 
+												  TInt folderUid, 
+												  const TDesC& seamlessParam, 
+												  TBool aIsContentHandlerRegistered )
+    {
+    TBool isOverriddenSettings( EFalse );
+    
+    // Check if the overridden settings was set
+    if ( aSettings )
+    	{
+    	isOverriddenSettings = ETrue;
+    	}
+    	
+	// Create the package
+	TPckgC<TUid> embeddingAppUidPckg( aEmbeddingAppUid );
+    TPckgC<TBool> isOverriddenSettingsPckg( isOverriddenSettings );    
+    TPckgC<TBrowserOverriddenSettings>* pSettingsPckg( 0 );    
+    if ( aSettings )
+    	{
+    	// Put Overridden settings in package if it is not NULL
+    	pSettingsPckg = new (ELeave) TPckgC<TBrowserOverriddenSettings>( *aSettings );
+    	CleanupStack::PushL( pSettingsPckg );
+    	}   
+    TPckgC<TInt> folderUidPckg( folderUid );
+    TPtrC8 seamlessParamPtr( (const TUint8*)seamlessParam.Ptr(), seamlessParam.Size() );
+    TPckgC<TBool> isContentHandlerRegistered( aIsContentHandlerRegistered );
+
+	// Get the size of all packages
+	TInt totalSize;	
+	if ( aSettings )
+		{
+	    totalSize = embeddingAppUidPckg.Size() + 
+	    			isOverriddenSettingsPckg.Size() + 
+	    			(*pSettingsPckg).Size() + 
+	    			folderUidPckg.Size() + 
+	    			seamlessParamPtr.Size() + 
+	    			isContentHandlerRegistered.Size();
+		}
+	else
+		{
+	    totalSize = embeddingAppUidPckg.Size() + 
+	     			isOverriddenSettingsPckg.Size() + 
+	     			folderUidPckg.Size() + 
+	     			seamlessParamPtr.Size() + 
+	     			isContentHandlerRegistered.Size();
+		}
+		
+	// Allocate buffer for packages
+    HBufC8* buff = HBufC8::NewL( totalSize );
+    
+    // Pack the packages to buffer
+    buff->Des().Copy( embeddingAppUidPckg );
+	buff->Des().Append( isOverriddenSettingsPckg );
+	if ( aSettings )
+		{
+		buff->Des().Append( *pSettingsPckg );
+		}    	
+    buff->Des().Append( folderUidPckg );
+    buff->Des().Append( isContentHandlerRegistered );
+    buff->Des().Append( seamlessParamPtr );
+    
+    if ( aSettings )
+    	{
+    	CleanupStack::PopAndDestroy( ); // pSettingsPckg
+    	}    
+    return buff;
+    }
+    
+// ---------------------------------------------------------
+// TLauncherPackageUtils::PackLauncherDataL()
+// ---------------------------------------------------------
+//
+void TLauncherPackageUtils::UnPackLauncherDataL( TUid& aEmbeddingAppUid, TBrowserOverriddenSettings* aSettings, TInt& aFolderUid, TPtrC& aSeamlessParam, const TDesC8& aData, TBool& aIsContentHandlerRegistered, TBool& aIsOverriddenSettings )
+    {
+    TInt pos( 0 );
+
+	// Get the first parameter aEmbeddingAppUid from IPC data
+    TPckg<TUid> embeddingAppUid( aEmbeddingAppUid );
+    embeddingAppUid.Copy( aData.Mid( pos, embeddingAppUid.Size() ) );    
+    pos += embeddingAppUid.Size();
+
+	// Get the parameter isOverriddenSettings from IPC data
+    TPckg<TBool> isOveriddenSettings( aIsOverriddenSettings );
+    isOveriddenSettings.Copy( aData.Mid( pos, isOveriddenSettings.Size() ) );    
+    pos += isOveriddenSettings.Size();
+    
+    if ( aIsOverriddenSettings )
+    	{
+    	// Unpack the overridden settings
+	    TPckg<TBrowserOverriddenSettings> settingsPckg( *aSettings );
+	    settingsPckg.Copy( aData.Mid( pos, settingsPckg.Size() ) );
+	    pos += settingsPckg.Size();    	
+    	}
+	else
+		{
+    	// No overridden setings were put in IPC data
+		aSettings = NULL;
+		}    	
+
+	// Get second parameters from IPC data
+    TPckg<TInt> folderUidPckg( aFolderUid );
+    folderUidPckg.Copy( aData.Mid( pos, folderUidPckg.Size() ) );
+    pos += folderUidPckg.Size();
+
+	// Get third parameters from IPC data
+    TPckg<TBool> isContentHandlerRegistered( aIsContentHandlerRegistered );
+    isContentHandlerRegistered.Copy( aData.Mid( pos, isContentHandlerRegistered.Size() ) );    
+    pos += isContentHandlerRegistered.Size();
+
+    TPtrC8 remaining = aData.Mid( pos );
+    aSeamlessParam.Set( (const TUint16*)remaining.Ptr(), remaining.Size()/2 );
+    }
+// End of file