diff -r 000000000000 -r c3e98f10fcf4 localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp Mon Jan 18 21:03:15 2010 +0200 @@ -0,0 +1,398 @@ +/* +* Copyright (c) 2002 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: +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include // for memory and file selection dialogs +#include +#include // for getting drive root path +#include +#include +#include +#include +#include "obexutilslaunchwaiter.h" +#include "obexutilsdebug.h" +#include "obexutilsuilayer.h" // For launching file manager +#include "obexutilsmessagehandler.h" // For updating an entry + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::NewLC +// ----------------------------------------------------------------------------- +CObexUtilsLaunchWaiter* CObexUtilsLaunchWaiter::NewLC( + CMsvSession& aMsvSession, + CMsvEntry* aMessage, + TRequestStatus& aObserverRequestStatus ) + { + CObexUtilsLaunchWaiter* self = new( ELeave )CObexUtilsLaunchWaiter( + aMsvSession, + aMessage, + aObserverRequestStatus ); + CleanupStack::PushL( self ); + self->ConstructL( aMessage ); + return self; + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::NewL +// ----------------------------------------------------------------------------- +CObexUtilsLaunchWaiter* CObexUtilsLaunchWaiter::NewL( + CMsvSession& aMsvSession, + CMsvEntry* aMessage, + TRequestStatus& aObserverRequestStatus ) + { + CObexUtilsLaunchWaiter* self = CObexUtilsLaunchWaiter::NewLC( + aMsvSession, + aMessage, + aObserverRequestStatus ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::ConstructL +// ----------------------------------------------------------------------------- +void CObexUtilsLaunchWaiter::ConstructL( CMsvEntry* aMessage ) + { + if (aMessage->Count() < 1) + { + User::Leave(KErrOverflow); + } + + CMsvEntry* attachEntry = iMsvSession.GetEntryL(((*aMessage)[0]).Id()); + CleanupStack::PushL(attachEntry); // 1st push + CMsvStore* store = attachEntry->ReadStoreL(); + CleanupStack::PushL(store); // 2nd push + + CMsvAttachment* attachInfo = store->AttachmentManagerL().GetAttachmentInfoL(0); + CleanupStack::PushL(attachInfo); // 3rd push + + TDataType dataType = attachInfo->MimeType(); + + TInt error = KErrNone; + TBool isCompleteSelf = EFalse; + + RFile attachFile; + TRAP( error, attachFile = store->AttachmentManagerL().GetAttachmentFileL(0)); + if ( KErrNone == error ) + { + CleanupClosePushL(attachFile); // 4th push + CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(); // 5th push + TAiwGenericParam paramSave(EGenericParamFileSaved, ETrue); + paramList->AppendL( paramSave ); + + if ( CEikonEnv::Static() ) + { + // Launches an application in embedded mode + iDocumentHandler = CDocumentHandler::NewL( CEikonEnv::Static()->Process() ); + iDocumentHandler->SetExitObserver( this ); + TRAP( error, iDocumentHandler->OpenFileEmbeddedL( attachFile, dataType, *paramList )); + } + else + { + // Launches an application in standalone mode + iDocumentHandler = CDocumentHandler::NewL( ); + // We do not observe exit event when file is launched in standalone mode. + iDocumentHandler->SetExitObserver( NULL ); + TRAP( error, iDocumentHandler->OpenFileL( attachFile, dataType)); + } + + if ( error == KErrNotSupported ) + // If file is not supported, we open the file manager at file location. + { + // Launchs file manager at default folder + delete iDocumentHandler; + iDocumentHandler = NULL; + + TInt sortMethod = 2; // 0 = 'By name', 1 = 'By type', + // 2 = 'Most recent first' and 3 = 'Largest first' + TFileName fullName; + attachFile.FullName(fullName); + + TRAP (error, TObexUtilsUiLayer::LaunchFileManagerL( fullName, + sortMethod, + ETrue )); // ETrue -> launch file manager in embedded mode. + isCompleteSelf = ETrue; + } // KErrNotSupported + + // Set message to READ + // + TMsvEntry entry = aMessage->Entry(); + entry.SetUnread( EFalse ); + aMessage->ChangeL( entry ); + CleanupStack::PopAndDestroy(2); // paramList, attachFile + + } // KErrNone + + else // Error != KErrNone, broken link found. + // Lets fix it by selecting the right file. + { + error = KErrNone; + TFileName fileName; + TFileName oldFileName = attachInfo->FilePath(); + // select file + // + if (LocateFileL(fileName, oldFileName)) + { + // Update the entry + TRAP(error, TObexUtilsMessageHandler::UpdateEntryAttachmentL(fileName,aMessage)); + if ( error == KErrNone ) + { + // Show a confirmation note + CAknGlobalNote* note = CAknGlobalNote::NewLC(); + HBufC* stringholder = StringLoader::LoadLC( R_BT_SAVED_LINK_UPDATED ); + note->ShowNoteL(EAknGlobalConfirmationNote, *stringholder); + CleanupStack::PopAndDestroy(2); //note and stringholder + } + } + isCompleteSelf = ETrue; + } // !KErrNone + + User::LeaveIfError ( error ); + CleanupStack::PopAndDestroy(3); // attachInfo, store, attachEntry + + iObserverRequestStatus = KRequestPending; // CMsvOperation (observer) + iStatus = KRequestPending; // CMsvOperation + SetActive(); + + if ( isCompleteSelf ) + { + HandleServerAppExit( error ); + } + } +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CObexUtilsLaunchWaiter::~CObexUtilsLaunchWaiter() + { + Cancel(); + if (iDocumentHandler) + { + delete iDocumentHandler; + iDocumentHandler = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::RunL +// ----------------------------------------------------------------------------- +void CObexUtilsLaunchWaiter::RunL() + { + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::RunL()")); + + TRequestStatus* status = &iObserverRequestStatus; + User::RequestComplete( status, KErrNone ); + + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::RunL() completed")); + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::DoCancel +// ----------------------------------------------------------------------------- +void CObexUtilsLaunchWaiter::DoCancel() + { + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::DoCancel()")); + + if ( iStatus == KRequestPending ) + { + TRequestStatus* pstat = &iStatus; + User::RequestComplete( pstat, KErrCancel ); + } + + if( iObserverRequestStatus == KRequestPending ) + { + TRequestStatus* observerStatus = &iObserverRequestStatus; + User::RequestComplete( observerStatus, KErrCancel ); + } + + + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::DoCancel() completed")); + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::CObexUtilsLaunchWaiter +// ----------------------------------------------------------------------------- +CObexUtilsLaunchWaiter::CObexUtilsLaunchWaiter( + CMsvSession& aMsvSession, + CMsvEntry* /*aMessage*/, + TRequestStatus& aObserverRequestStatus ) + : + CMsvOperation(aMsvSession, EPriorityStandard, aObserverRequestStatus), + iDocumentHandler(NULL) + { + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::CObexUtilsLaunchWaiter()")); + + CActiveScheduler::Add( this ); + + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::CObexUtilsLaunchWaiter() completed")); + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::HandleServerAppExit +// ----------------------------------------------------------------------------- +void CObexUtilsLaunchWaiter::HandleServerAppExit(TInt aReason) + { + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::HandleServerAppExit()")); + + if( iStatus == KRequestPending ) + { + // Complete self + // + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aReason ); + } + + MAknServerAppExitObserver::HandleServerAppExit( aReason ); + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::HandleServerAppExit() completed")); + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::ProgressL +// ----------------------------------------------------------------------------- +const TDesC8& CObexUtilsLaunchWaiter::ProgressL() + { + return KNullDesC8; + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::LocateFile +// ----------------------------------------------------------------------------- +TBool CObexUtilsLaunchWaiter::LocateFileL(TFileName& aFileName, const TFileName& anOldFileName) + { + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::LocateFile()")); + + TBuf<200> buf; + TRequestStatus status = KRequestPending; + + TParse fileParseOld; + fileParseOld.Set(anOldFileName, NULL, NULL); + TFileName oldName = fileParseOld.NameAndExt(); + + // check old link if the file saved in mmc. If so, check if mmc available. + // if unavailable, show "is File not found as memory card is not present" + // + TInt err = CheckIfSaveInMMC( anOldFileName ); + TBool showMMCOut = EFalse; + if( err == EDriveF) + { + if( CheckDriveL(EDriveF) ) + showMMCOut = ETrue; + } + else if( err == EDriveE ) + { + if( CheckDriveL(EDriveE) ) + showMMCOut = ETrue; + } + + TBool answer = EFalse; + if( showMMCOut ) + { + answer = TObexUtilsUiLayer::ShowGlobalConfirmationQueryPlainL(R_BT_SAVED_NO_MEMORY_CARD); + } + else + { + answer = TObexUtilsUiLayer::ShowGlobalConfirmationQueryPlainL(R_BT_SAVED_SEARCH); + } + + TBool updateLink = EFalse; + if ( answer ) + { + updateLink = LaunchFileSelectionDialogL(aFileName, oldName); + } + + FLOG(_L("[OBEXUTILS]\t CObexUtilsLaunchWaiter::LocateFile() completed")); + return updateLink; + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::LaunchFileSelectionDialogL +// ----------------------------------------------------------------------------- +TBool CObexUtilsLaunchWaiter::LaunchFileSelectionDialogL( + TFileName& aFileName, + const TFileName& anOldName) + { + TBuf<200> buf; + TParse fileParseNew; + TFileName nameNew; + TBool updateLink = EFalse; + + while ( !updateLink ) + { + TBool isSelected = AknCommonDialogsDynMem::RunSelectDlgLD( AknCommonDialogsDynMem::EMemoryTypeMMCExternal| + AknCommonDialogsDynMem::EMemoryTypeMMC| + AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage| + AknCommonDialogsDynMem::EMemoryTypePhone, + aFileName, + R_CFD_DEFAULT_SELECT_MEMORY_SELECTION, + R_CFD_DEFAULT_SELECT_FILE_SELECTION ); + + if ( isSelected ) + { + fileParseNew.Set(aFileName, NULL, NULL); + nameNew = fileParseNew.NameAndExt(); + + if ( nameNew.Compare(anOldName)) // names do not match + { + updateLink = TObexUtilsUiLayer::ShowGlobalConfirmationQueryPlainL(R_BT_SAVED_SEARCH_UPDATE); + } + else + { + updateLink = ETrue; + } + } + else + { + break; // Exit from while loop. + } + } + + return updateLink; + } + +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::CheckDriveL +// ----------------------------------------------------------------------------- +TInt CObexUtilsLaunchWaiter::CheckDriveL(TDriveNumber aDriveNumber) + { + RFs rfs; + User::LeaveIfError(rfs.Connect()); + CleanupClosePushL( rfs ) ; + TVolumeInfo volumeInfo; + TInt err = rfs.Volume(volumeInfo, aDriveNumber); + CleanupStack::PopAndDestroy(); // rfs + + return err; + } +// ----------------------------------------------------------------------------- +// CObexUtilsLaunchWaiter::CheckIfSaveInMMC +// ----------------------------------------------------------------------------- +TInt CObexUtilsLaunchWaiter::CheckIfSaveInMMC(const TFileName& aFileName) + { + if(aFileName.Find(_L("F:")) != KErrNotFound) + return EDriveF; + if(aFileName.Find(_L("E:")) != KErrNotFound) + return EDriveE; + + return KErrNotFound; + } +// End of File