localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp
changeset 0 c3e98f10fcf4
child 1 388a17646e40
--- /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 <eikenv.h>
+#include <DocumentHandler.h>
+#include <mmsvattachmentmanager.h>
+#include <msvids.h>
+#include <bautils.h>
+#include <AknCommonDialogsDynMem.h>     // for memory and file selection dialogs
+#include <CommonDialogs.rsg>
+#include <pathinfo.h>                   // for getting drive root path
+#include <obexutils.rsg>
+#include <AknGlobalNote.h>
+#include <StringLoader.h>
+#include <AiwGenericParam.h>
+#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