diff -r 95243422089a -r 491b3ed49290 filemanager/aiwprovider/src/filemanageraiwprovider.cpp --- a/filemanager/aiwprovider/src/filemanageraiwprovider.cpp Thu Aug 19 09:42:45 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,443 +0,0 @@ -/* -* Copyright (c) 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 class offers AIW services -* -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include "FileManagerDebug.h" -#include "FileManagerPrivateCRKeys.h" -#include "filemanageraiwprovider.h" -#include "FileManagerUID.h" - -const TImplementationProxy ImplementationTable[] = - { - IMPLEMENTATION_PROXY_ENTRY( 0x200110F9, CFileManagerAiwProvider::NewL ) - }; -const TUid KUidDefaultFileManager = { KFileManagerUID3 }; -const TInt KMaxSortMethodStr = 20; -_LIT( KRootMatch, "?:\\" ); - - -// ======== LOCAL FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// FindStandaloneAppL -// --------------------------------------------------------------------------- -// -static TBool FindStandaloneAppL( - RWsSession& aWs, const TUid& aUid, TInt& aWgId ) - { - FUNC_LOG; - - aWgId = 0; // Used window group id is always greater than zero - RArray< RWsSession::TWindowGroupChainInfo > windowChain; - User::LeaveIfError( aWs.WindowGroupList( &windowChain ) ); - CleanupClosePushL( windowChain ); - TInt count( windowChain.Count() ); - for( TInt i( 0 ); i < count; ++i ) - { - const RWsSession::TWindowGroupChainInfo& entry( windowChain[ i ] ); - CApaWindowGroupName* app = CApaWindowGroupName::NewLC( - aWs, entry.iId ); - TUid appUid( app->AppUid() ); - CleanupStack::PopAndDestroy( app ); - // Match the app's UID and the embedded status. - // The app is standalone when there is no parent window group. - if ( appUid == aUid && entry.iParentId <= 0 ) - { - // Standalone application found - aWgId = entry.iId; - break; - } - } - CleanupStack::PopAndDestroy( &windowChain ); - return aWgId > 0; - } - -// --------------------------------------------------------------------------- -// IsValidFolderToOpenPath -// --------------------------------------------------------------------------- -// -static TBool IsValidFolderToOpenPath( const TDesC& aFullPath ) - { - FUNC_LOG; - - TInt len( aFullPath.Length() ); - if ( !len ) - { - return ETrue; // Allow empty to open main view - } - // Check that at least root folder exists - if ( aFullPath.Left( KRootMatch().Length() ).MatchF( - KRootMatch ) == KErrNotFound ) - { - return EFalse; - } - return ETrue; - } - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::CFileManagerAiwProvider -// --------------------------------------------------------------------------- -// -CFileManagerAiwProvider::CFileManagerAiwProvider() - { - FUNC_LOG; - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::NewL -// --------------------------------------------------------------------------- -// -CFileManagerAiwProvider* CFileManagerAiwProvider::NewL() - { - FUNC_LOG; - - return new ( ELeave ) CFileManagerAiwProvider(); - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::~CFileManagerAiwProvider -// --------------------------------------------------------------------------- -// -CFileManagerAiwProvider::~CFileManagerAiwProvider() - { - FUNC_LOG; - - delete iService; - delete iInParamList; - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::InitialiseL -// --------------------------------------------------------------------------- -// -void CFileManagerAiwProvider::InitialiseL( - MAiwNotifyCallback& /*aFrameworkCallback*/, - const RCriteriaArray& /*aInterest*/ ) - { - FUNC_LOG; - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::HandleServiceCmdL -// --------------------------------------------------------------------------- -// -void CFileManagerAiwProvider::HandleServiceCmdL( - const TInt& aCmdId, - const CAiwGenericParamList& aInParamList, - CAiwGenericParamList& /*aOutParamList*/, - TUint /*aCmdOptions*/, - const MAiwNotifyCallback* aCallback ) - { - FUNC_LOG; - - INFO_LOG2( - "CFileManagerAiwProvider::HandleServiceCmdL-aCmdId=%d,aCallback=0x%x", - aCmdId, aCallback ); - - TInt err( KErrNone ); - switch ( aCmdId ) - { - case KAiwCmdEdit: - { - TRAP( err, CmdEditL( aInParamList, aCallback ) ); - break; - } - default: - { - ERROR_LOG1( - "CFileManagerAiwProvider::HandleServiceCmdL-InvalidCmd=%d", - aCmdId ); - break; - } - } - LOG_IF_ERROR2( - err, - "CFileManagerAiwProvider::HandleServiceCmdL-aCmdId=%d-err=%d", - aCmdId, err ); - User::LeaveIfError( err ); - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::HandleServerAppExit -// --------------------------------------------------------------------------- -// -void CFileManagerAiwProvider::HandleServerAppExit( TInt /*aReason*/ ) - { - FUNC_LOG; - - TRAP_IGNORE( NotifyL( KAiwEventCompleted ) ); - iCallback = NULL; // No notifications are needed after app exit - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::CmdEditL -// --------------------------------------------------------------------------- -// -void CFileManagerAiwProvider::CmdEditL( - const CAiwGenericParamList& aInParamList, - const MAiwNotifyCallback* aCallback ) - { - FUNC_LOG; - - iCmd = KAiwCmdEdit; - if ( IsFolderToOpenPathGiven( aInParamList ) ) - { - if ( IsStandaloneLaunch( aInParamList ) ) - { - LaunchStandaloneL( aInParamList ); - } - else - { - LaunchEmbeddedL( aInParamList, aCallback ); - } - } - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::NotifyL -// --------------------------------------------------------------------------- -// -void CFileManagerAiwProvider::NotifyL( TInt aEvent ) - { - FUNC_LOG; - - if ( iCallback && iInParamList ) - { - CAiwGenericParamList* eventParamList = CAiwGenericParamList::NewL(); - CleanupStack::PushL( eventParamList ); - // Must cast this because of AIW design error - const_cast< MAiwNotifyCallback* >( iCallback )->HandleNotifyL( - iCmd, aEvent, *eventParamList, *iInParamList ); - CleanupStack::PopAndDestroy( eventParamList ); - } - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::GetAppUidL -// --------------------------------------------------------------------------- -// -TUid CFileManagerAiwProvider::GetAppUidL() - { - FUNC_LOG; - - CRepository* cenRep = CRepository::NewLC( KCRUidFileManagerSettings ); - TInt uid( 0 ); - User::LeaveIfError( cenRep->Get( KFileManagerAppUidForAiwService, uid ) ); - CleanupStack::PopAndDestroy( cenRep ); - return TUid::Uid( uid ); - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::GetAppUid -// --------------------------------------------------------------------------- -// -TUid CFileManagerAiwProvider::GetAppUid() - { - FUNC_LOG; - - if ( !iAppUid.iUid ) - { - // Read the application to start from CenRep - TRAPD( err, iAppUid = GetAppUidL() ); - if ( err != KErrNone || !iAppUid.iUid ) - { - // Use the default application - iAppUid = KUidDefaultFileManager; - } - ERROR_LOG1( - "CFileManagerAiwProvider::GetAppUid-Uid=0x%x", iAppUid.iUid ); - } - return iAppUid; - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::LaunchEmbeddedL -// --------------------------------------------------------------------------- -// -void CFileManagerAiwProvider::LaunchEmbeddedL( - const CAiwGenericParamList& aInParamList, - const MAiwNotifyCallback* aCallback ) - { - FUNC_LOG; - - delete iService; - iService = NULL; - delete iInParamList; - iInParamList = NULL; - iCallback = NULL; - - // Copy the input params for the launcher and then do the launch - iInParamList = CAiwGenericParamList::NewL(); - TInt count( aInParamList.Count() ); - for( TInt i( 0 ); i < count; ++i ) - { - iInParamList->AppendL( aInParamList[ i ] ); - } - iService = CAknLaunchAppService::NewL( GetAppUid(), this, iInParamList ); - iCallback = aCallback; - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::IsStandaloneLaunch -// --------------------------------------------------------------------------- -// -TBool CFileManagerAiwProvider::IsStandaloneLaunch( - const CAiwGenericParamList& aInParamList ) - { - FUNC_LOG; - - TBool ret( EFalse ); - TInt i( 0 ); - // Get sort method first - const TAiwGenericParam* param = aInParamList.FindFirst( - i, EGenericParamDir, EVariantTypeTInt32 ); - if ( i != KErrNotFound && param ) - { - // Then, check if standalone is requested - param = aInParamList.FindNext( i, EGenericParamDir, EVariantTypeTInt32 ); - if ( i != KErrNotFound && param ) - { - ret = param->Value().AsTInt32(); - } - } - return ret; - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::LaunchStandaloneL -// --------------------------------------------------------------------------- -// -void CFileManagerAiwProvider::LaunchStandaloneL( - const CAiwGenericParamList& aInParamList ) - { - FUNC_LOG; - - TPtrC folderToOpen( KNullDesC ); - TInt sortMethod( KErrNotFound ); - TInt i( 0 ); - // Get folder path - const TAiwGenericParam* param = aInParamList.FindFirst( - i, EGenericParamDir, EVariantTypeDesC ); - if ( i != KErrNotFound && param ) - { - folderToOpen.Set( param->Value().AsDes() ); - } - // Get sort method - param = aInParamList.FindFirst( i, EGenericParamDir, EVariantTypeTInt32 ); - if ( i != KErrNotFound && param ) - { - sortMethod = param->Value().AsTInt32(); - } - - RWsSession wsSession; - User::LeaveIfError( wsSession.Connect() ); - CleanupClosePushL( wsSession ); - TInt wgId( 0 ); - TUid appUid( GetAppUid() ); - if ( FindStandaloneAppL( wsSession, appUid, wgId ) ) - { - // Bring the existing standalone app to foreground - TApaTask apaTask( wsSession ); - apaTask.SetWgId( wgId ); - apaTask.BringToForeground(); - } - else - { - // Start new standalone app - TApaAppInfo appInfo; - RApaLsSession apaLsSession; - User::LeaveIfError( apaLsSession.Connect() ); - CleanupClosePushL( apaLsSession ); - User::LeaveIfError( apaLsSession.GetAppInfo( appInfo, appUid ) ); - CApaCommandLine* apaCmdLine = CApaCommandLine::NewLC(); - apaCmdLine->SetExecutableNameL( appInfo.iFullName ); - apaCmdLine->SetCommandL( EApaCommandOpen ); - apaCmdLine->SetDocumentNameL( folderToOpen ); - if ( sortMethod != KErrNotFound ) - { - TBuf8< KMaxSortMethodStr > sortMethodStr; - sortMethodStr.AppendNum( sortMethod ); - apaCmdLine->SetTailEndL( sortMethodStr ); - } - TThreadId dummy; - User::LeaveIfError( apaLsSession.StartApp( *apaCmdLine, dummy ) ); - CleanupStack::PopAndDestroy( apaCmdLine ); - CleanupStack::PopAndDestroy( &apaLsSession ); - } - CleanupStack::PopAndDestroy( &wsSession ); - } - -// --------------------------------------------------------------------------- -// CFileManagerAiwProvider::IsFolderToOpenPathGiven -// --------------------------------------------------------------------------- -// -TBool CFileManagerAiwProvider::IsFolderToOpenPathGiven( - const CAiwGenericParamList& aInParamList ) - { - FUNC_LOG; - - TBool ret( EFalse ); - TPtrC folderToOpen( KNullDesC ); - TInt i( 0 ); - // Ensure first that no files are defined, because only folder service - // is offered by this provider - const TAiwGenericParam* param = aInParamList.FindFirst( - i, EGenericParamFile, EVariantTypeAny ); - if ( i == KErrNotFound ) - { - // Get folder path and check it - i = 0; - param = aInParamList.FindFirst( - i, EGenericParamDir, EVariantTypeDesC ); - if ( i != KErrNotFound && param ) - { - folderToOpen.Set( param->Value().AsDes() ); - ret = IsValidFolderToOpenPath( folderToOpen ); - } - } - if ( !ret ) - { - ERROR_LOG2( - "CFileManagerAiwProvider::IsFolderToOpenPathGiven-ret=%d,given=%S", - ret, &folderToOpen ); - } - return ret; - } - -// ======== GLOBAL FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// ImplementationGroupProxy. -// --------------------------------------------------------------------------- -// -EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) - { - FUNC_LOG; - - aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); - return ImplementationTable; - }