commonuis/CommonDialogs/src/AknCommonDialogsDynMem.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuis/CommonDialogs/src/AknCommonDialogsDynMem.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,869 @@
+/*
+* Copyright (c) 2002-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:  ?Description
+*
+*/
+
+
+#include <coemain.h>
+#include <featmgr.h>
+#include <driveinfo.h>
+#include <pathinfo.h>
+#include <commondialogs.rsg>
+
+#include "AknCommonDialogsDynMem.h"
+#include "CAknMemorySelectionDialog.h"
+#include "CAknMemorySelectionDialogMultiDrive.h"
+#include "CAknFileSelectionDialog.h"
+#include "CAknFileNamePromptDialog.h"
+#include "AknCFDUtility.h"
+#include "CCFDCustomFilter.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    TInt aMemorySelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    TInt aMemorySelectionResourceId,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        aFilter, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    TInt aMemorySelectionResourceId,
+    const TDesC& aFileSelectionTitle,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        aFileSelectionTitle, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunMoveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunMoveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDirectory,
+    TInt aMemorySelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeMove, aDirectory,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunMoveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunMoveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDirectory,
+    TInt aMemorySelectionResourceId,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeMove, aDirectory,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        aFilter, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunMoveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunMoveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDirectory,
+    TInt aMemorySelectionResourceId,
+    const TDesC& aFileSelectionTitle,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeMove, aDirectory,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        aFileSelectionTitle, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunMoveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunMoveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDirectory,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeMove, aDirectory,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias);
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    TInt aMemorySelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, NULL, aObserver, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    TInt aMemorySelectionResourceId,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        aFilter, NULL, NULL, aObserver, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    TInt aMemorySelectionResourceId,
+    const TDesC& aFileSelectionTitle,
+    const TDesC& aFileNamePromptTitle,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        aFileSelectionTitle, aFileNamePromptTitle,
+        NULL, NULL, NULL, aObserver, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, NULL, aObserver, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    const TDesC& aFileNamePromptTitle,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        KNullDesC, aFileNamePromptTitle,
+        NULL, NULL, NULL, aObserver, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgNoDirectorySelectionLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    TInt aMemorySelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, ETrue, 0, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, NULL, aObserver, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgNoDirectorySelectionLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    TInt aMemorySelectionResourceId,
+    const TDesC& aFileNamePromptTitle,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, ETrue, 0, 0,
+        KNullDesC, aFileNamePromptTitle,
+        NULL, NULL, NULL, aObserver, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunCopyDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunCopyDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDirectory,
+    TInt aMemorySelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeCopy, aDirectory,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunCopyDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunCopyDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDirectory,
+    TInt aMemorySelectionResourceId,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeCopy, aDirectory,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        aFilter, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunCopyDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunCopyDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDirectory,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeCopy, aDirectory,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, KNullDesC,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    const TDesC& aStartFolder,
+    TInt aMemorySelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, aStartFolder,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    const TDesC& aStartFolder,
+    TInt aMemorySelectionResourceId,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        KNullDesC, KNullDesC,
+        aFilter, NULL, aObserver, NULL, aStartFolder,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    const TDesC& aStartFolder,
+    TInt aMemorySelectionResourceId,
+    const TDesC& aFileSelectionTitle,
+    MAknFileSelectionObserver* aObserver )
+    {
+
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, 0, 0,
+        aFileSelectionTitle, KNullDesC,
+        NULL, NULL, aObserver, NULL, aStartFolder,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    const TDesC& aStartFolder,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        KNullDesC, KNullDesC,
+        NULL, NULL, aObserver, NULL, aStartFolder,
+        aIncludedMedias );
+    }
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFileName,
+    const TDesC& aStartFolder,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    const TDesC& aFileSelectionTitle,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSelect, aFileName,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        aFileSelectionTitle, KNullDesC,
+        aFilter, NULL, aObserver, NULL, aStartFolder,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunSaveDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunSaveDlgLD(
+    TInt aIncludedMedias,
+    TDes& aDefaultFileName,
+    const TDesC& aStartFolder,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    const TDesC& aFileSelectionTitle,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeSave, aDefaultFileName,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        aFileSelectionTitle, KNullDesC,
+        aFilter, NULL, aObserver, NULL, aStartFolder,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunFolderSelectDlgLD
+//
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool AknCommonDialogsDynMem::RunFolderSelectDlgLD(
+    TInt aIncludedMedias,
+    TDes& aFolder,
+    const TDesC& aStartFolder,
+    TInt aMemorySelectionResourceId,
+    TInt aFileSelectionResourceId,
+    const TDesC& aFileSelectionTitle,
+    MAknFileFilter* aFilter,
+    MAknFileSelectionObserver* aObserver )
+    {
+    return RunL( ECFDDialogTypeBrowse, aFolder,
+        aMemorySelectionResourceId, EFalse, aFileSelectionResourceId, 0,
+        aFileSelectionTitle, KNullDesC,
+        aFilter, NULL, aObserver, NULL, aStartFolder,
+        aIncludedMedias );
+    }
+
+// -----------------------------------------------------------------------------
+// AknCommonDialogsDynMem::RunL
+//
+//
+// -----------------------------------------------------------------------------
+//
+TBool AknCommonDialogsDynMem::RunL(
+    TCommonDialogType aDialogType,
+    TDes& aFileName,
+    TInt aMemorySelectionResourceId,
+    TBool aNoFileSelectionDialog,
+    TInt aFileSelectionResourceId,
+    TInt aFileNamePromptResourceId,
+    const TDesC& aFileSelectionTitle,
+    const TDesC& aFileNamePromptTitle,
+    MAknFileFilter* aFileFilter,
+    MAknMemorySelectionObserver* /*aMemorySelectionObserver*/,
+    MAknFileSelectionObserver* aFileSelectionObserver,
+    MAknFileSelectionObserver* aFileNamePromptObserver,
+    const TDesC& aStartFolder,
+    TInt aIncludedMedias )
+    {
+
+    FeatureManager::InitializeLibL();
+    TBool mmcSupported( FeatureManager::FeatureSupported( KFeatureIdMmc ) );
+    FeatureManager::UnInitializeLib();
+    CCoeEnv* coeEnv = CCoeEnv::Static();
+
+    // Temp variables
+    HBufC* rootPath         = HBufC::NewLC(KMaxPath);
+    HBufC* defaultFolder    = HBufC::NewLC(KMaxPath);
+    HBufC* cachedRootPath   = HBufC::NewLC(KMaxPath);
+
+    TPtr ptrRootPath = rootPath->Des();
+    TPtr ptrDefaultFolder = defaultFolder->Des();
+    TPtr ptrCachedRootPath = cachedRootPath->Des();
+
+    TDriveNumber defaultDrive;
+    User::LeaveIfError(
+        DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem,
+                                    ( TInt& )defaultDrive ) );
+    TDriveNumber selectedDrive( defaultDrive );
+
+    // Variables for return values from dialogs
+    TBool memoryReturnValue(    EFalse );
+    TBool fileReturnValue(      EFalse );
+    TBool promptReturnValue(    EFalse );
+
+    // These booleans tell what dialogs have been shown
+    TBool usedMemorySelection(  EFalse );
+    TBool usedFileSelection(    EFalse );
+    TBool usedFileNamePrompt(   EFalse );
+
+    // Variable to handle start folder, if client gives a specific folder to
+    // start browsing in file selecting
+    HBufC * startFolder = aStartFolder.AllocLC();
+    TPtr ptrStartFolder = startFolder->Des();
+
+    TDriveNumber defaultMMC;
+    User::LeaveIfError(
+        DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage,
+                                    ( TInt& )defaultMMC ) );
+    TCFDDriveStatus driveStatus( EDriveOK );
+
+    // Start a FOREVER loop in order to show memory selection dialog again if
+    // user hits back in file selection
+    FOREVER
+        {
+        // Reset variables
+        *rootPath = KNullDesC;
+        *defaultFolder = KNullDesC;
+        fileReturnValue = ETrue;
+        promptReturnValue = ETrue;
+        memoryReturnValue = EFalse;
+
+        ptrRootPath = rootPath->Des();
+        ptrDefaultFolder = defaultFolder->Des();
+
+        if ( mmcSupported )
+            {
+            driveStatus = AknCFDUtility::DriveStatusL( defaultMMC );
+            }
+
+        // Start folder is not defined so ask for it. Normal situation, or
+        // second round with user given starting folder.
+        if ( ptrStartFolder == KNullDesC )
+            {
+            // Run MEMORY SELECTION DIALOG
+           CAknMemorySelectionDialogMultiDrive* memoryDialogMD =
+                CAknMemorySelectionDialogMultiDrive::NewL(
+                    aDialogType,
+                    aMemorySelectionResourceId,
+                    EFalse,
+                    aIncludedMedias
+                    ); 
+           CleanupStack::PushL( memoryDialogMD );
+
+            // Check if there ame multiple drives in which case use memory
+            // selection instead of file selection.
+            if( usedMemorySelection ||
+                AknCFDUtility::UserVisibleDriveCountL( aIncludedMedias ) > 1 )
+                {
+                // Multiple drives: Execute memory selection
+                memoryReturnValue = memoryDialogMD->ExecuteL( selectedDrive,
+                    &ptrRootPath, &ptrDefaultFolder );
+                usedMemorySelection = ETrue; // Memory selection was used
+                CleanupStack::PopAndDestroy();// memoryDialog or memoryDialogMD
+                if ( !memoryReturnValue )
+                    {
+                    // User cancels memory selection
+                    CleanupStack::PopAndDestroy(startFolder);
+                    CleanupStack::PopAndDestroy(cachedRootPath);
+                    CleanupStack::PopAndDestroy(defaultFolder);
+                    CleanupStack::PopAndDestroy(rootPath);
+                    return EFalse;
+                    }
+                }
+             else
+                {
+                // Only one drive - get it's paths. EPhoneMemory is legacy.
+                // Functionally it points to index 0 of stored paths array, not
+                // necessarily the drive of the phone memory.
+
+                // The above is only valid for legacy code (even remote drive is
+                // used). For multiple drive support, default system drive
+                // should be more reasonable to be used in this case.
+                memoryDialogMD->GetDrivePaths(
+                    defaultDrive,
+                    &ptrRootPath,
+                    &ptrDefaultFolder
+                    );
+                CleanupStack::PopAndDestroy();// memoryDialog or memoryDialogMD
+                }
+            }
+        else // User gave a specific folder to start browsing
+            {
+            ptrDefaultFolder = ptrStartFolder;
+            AknCFDUtility::AddTrailingBackslash(ptrDefaultFolder);
+            TDriveNumber driveNumber = ( TDriveNumber )
+                AknCFDUtility::DriveNumber( ptrDefaultFolder );
+
+            // Different logic should be used here.
+            // Not only C & E drives need to be checked now. And the new method
+            // PathInfo::GetRootPath could be used to get each drive's root
+            // path. The specific folder user gave should be in drive's root
+            // path. So generic check is launched here.
+            PathInfo::GetRootPath( ptrRootPath, driveNumber );
+
+            if ( ptrDefaultFolder.Length() )
+                {
+                if ( ptrDefaultFolder.Left( ptrRootPath.Length() ).CompareF(
+                     ptrRootPath ) )
+                    {
+                    User::Leave( KErrPathNotFound );
+                    }
+                else
+                    {
+                    ptrDefaultFolder = ptrDefaultFolder.Right(
+                        ptrDefaultFolder.Length() - ptrRootPath.Length() );
+                    }
+                }
+
+            // Use system default drive if current drive is not ready
+            driveStatus = AknCFDUtility::DriveStatusL( driveNumber );
+
+            if ( driveStatus == EDriveNotReady )
+                {
+                PathInfo::GetRootPath( ptrRootPath, defaultDrive );
+                ptrDefaultFolder = KNullDesC;
+                }
+
+            ptrStartFolder = KNullDesC; // we use starting folder only once...
+
+            usedMemorySelection =
+                ( AknCFDUtility::UserVisibleDriveCountL( aIncludedMedias ) > 1 );
+            }
+
+        ptrCachedRootPath = ptrRootPath;
+
+        CAknFileSelectionDialog* fileDialog = NULL;
+        // aNoFileSelectionDialog is ETrue only with save dialog when the
+        // client does not want the file selection dialog to be launched:
+        if( !aNoFileSelectionDialog )
+            {
+            fileDialog = CAknFileSelectionDialog::NewL( aDialogType,
+                         aFileSelectionResourceId );
+            CleanupStack::PushL( fileDialog );
+            fileDialog->SetTitleL( aFileSelectionTitle );
+            fileDialog->SetObserver( aFileSelectionObserver );
+            if ( usedMemorySelection )
+                {
+                HBufC* text = coeEnv->AllocReadResourceLC(
+                              R_CFD_TEXT_SOFTKEY_BACK );
+                fileDialog->SetRightSoftkeyRootFolderL( *text );
+                CleanupStack::PopAndDestroy(); // text
+                }
+            fileDialog->SetDefaultFolderL( ptrDefaultFolder );
+            if( aFileFilter )
+                {
+                CCFDCustomFilter* filter =
+                    new( ELeave ) CCFDCustomFilter( aFileFilter );
+                CleanupStack::PushL( filter );
+                fileDialog->AddFilterL( filter ); // Ownership is transferred
+                CleanupStack::Pop(); // filter
+                }
+            }
+        else
+            {
+            ptrCachedRootPath.Append( ptrDefaultFolder );
+            }
+
+        // Start file selection ExecuteL loop (needed in save case)
+        FOREVER
+            {
+            usedFileSelection = EFalse;
+            usedFileNamePrompt = EFalse;
+
+            // Root path must be always the root path which is read from
+            // resource
+            ptrRootPath = ptrCachedRootPath;
+            if( fileDialog )
+                {
+                TRAPD( endKeyErr, fileReturnValue = fileDialog->ExecuteL( ptrRootPath ) );
+                if ( endKeyErr == KErrAbort )
+                    {
+                    CleanupStack::PopAndDestroy(); // fileDialog
+                    CleanupStack::PopAndDestroy(4); //4 number of HBufC
+                    return EFalse;
+                    }
+
+                // If file selection dialog returns ESelectionKey, it means
+                // that browsing was not used. The directory was empty.
+                if ( fileReturnValue != CAknCommonDialogsBase::ESelectionKey )
+                    {
+                    usedFileSelection = ETrue;
+                    }
+
+                // If the user cancels file selection and memory selection was
+                // not used, exit function
+                if ( ( !usedMemorySelection ) && ( !fileReturnValue ) )
+                    {
+                    CleanupStack::PopAndDestroy(); // fileDialog
+                    CleanupStack::PopAndDestroy(4); //4 number of HBufC
+                    return EFalse;
+                    }
+                }
+
+            // If dialog type is SAVE and user selected something or in the case
+            // of save dialog, if the file selection was not used at all, show
+            // Filename prompt dialog
+            if ( ( ( aDialogType == ECFDDialogTypeSave )
+                   && ( fileReturnValue ) ) || aNoFileSelectionDialog )
+                {
+                CAknFileNamePromptDialog* promptDialog =
+                    CAknFileNamePromptDialog::NewL(
+                    aFileNamePromptResourceId );
+                CleanupStack::PushL( promptDialog );
+                promptDialog->SetTitleL( aFileNamePromptTitle );
+                promptDialog->SetObserver( aFileNamePromptObserver );
+                promptDialog->SetPathL( ptrRootPath );
+
+                promptReturnValue = promptDialog->ExecuteL( aFileName );
+                CleanupStack::PopAndDestroy(); // promptDialog
+                usedFileNamePrompt = ETrue;
+                if ( promptReturnValue )
+                    {
+                    // User approved the filename.
+                    // Exit loop
+                    break;
+                    }
+                else
+                    {
+                    // User cancelled the operation.
+                    if ( fileDialog )
+                        {
+                        CleanupStack::PopAndDestroy(); // fileDialog
+                        }
+                    CleanupStack::PopAndDestroy(4); //4 number of HBufC
+                    return EFalse;
+                    }
+                }
+            // Exit loop if filename prompt wasn't used
+            if ( ( !usedFileNamePrompt ) || 
+                // Exit loop if file selection wasn't used but prompt was
+                ( usedFileNamePrompt && !usedFileSelection ) )
+                {
+                break;
+                }
+            } // FOREVER
+
+        if ( fileDialog )
+            {
+            CleanupStack::PopAndDestroy(); // fileDialog
+            }
+
+        if (  // If neither file selection or filename prompt was used, break
+            ( !usedFileNamePrompt && !usedFileSelection ) ||
+             // If filename prompt was used and selection was made, break
+            ( usedFileNamePrompt && promptReturnValue ) ||
+             // If only file selection was used and selection made, break
+            ( usedFileSelection && !usedFileNamePrompt && fileReturnValue ) )
+            {
+            break;
+            }
+
+        } // FOREVER
+
+    if ( aDialogType == ECFDDialogTypeSave )
+        {
+        // In the save case, append the typed file in the end of path
+        // If not enough space in descriptor, let the system panic because
+        // it's not reasonable to append a partial file name.
+        ptrRootPath.Append( aFileName );
+        }
+
+    aFileName = ptrRootPath;
+
+    CleanupStack::PopAndDestroy(4); //4 number of HBufC
+
+    return ETrue;
+    }
+
+
+//  End of File