phonebookui/Phonebook2/MMCExtension/src/CPmuCopyFromDriveCmd.cpp
changeset 0 e686773b3f54
child 57 2666d9724c76
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 /*
       
     2 * Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Phonebook 2 MMC UI extension copy from MMC command.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "CPmuCopyFromMmcCmd.h"
       
    20 
       
    21 // Phonebook2
       
    22 #include <MPbk2ContactUiControl.h>
       
    23 #include <MPbk2CommandObserver.h>
       
    24 #include <Pbk2ProcessDecoratorFactory.h>
       
    25 #include <MPbk2ProcessDecorator.h>
       
    26 #include <CPbk2StoreConfiguration.h>
       
    27 #include <TPbk2CopyContactsResults.h>
       
    28 #include <MPbk2ContactNameFormatter.h>
       
    29 #include <CPbk2StoreProperty.h>
       
    30 #include <CPbk2StorePropertyArray.h>
       
    31 #include <MPbk2StoreValidityInformer.h>
       
    32 #include <MPbk2AppUi.h>
       
    33 #include <MPbk2ApplicationServices.h>
       
    34 #include <Pbk2MmcUIRes.rsg>
       
    35 
       
    36 // Virtual Phonebook
       
    37 #include <MVPbkContactOperationBase.h>
       
    38 #include <MVPbkStoreContact.h>
       
    39 #include <MVPbkContactStoreList.h>
       
    40 #include <CVPbkVCardEng.h>
       
    41 #include <CVPbkContactManager.h>
       
    42 #include <TVPbkContactStoreUriPtr.h>
       
    43 #include <MVPbkContactStore.h>
       
    44 #include <MVPbkContactLinkArray.h>
       
    45 #include <VPbkContactStoreUris.h>
       
    46 #include <MVPbkContactStoreProperties.h>
       
    47 #include <CVPbkContactStoreUriArray.h>
       
    48 
       
    49 // System includes
       
    50 #include <pathinfo.h>
       
    51 #include <StringLoader.h>
       
    52 #include <aknnotewrappers.h>
       
    53 
       
    54 #include <AknCommonDialogsDynMem.h>
       
    55 #include <CAknMemorySelectionDialogMultiDrive.h>
       
    56 #include <driveinfo.h>
       
    57 
       
    58 /// Unnamed namespace for local definitions
       
    59 namespace {
       
    60 
       
    61 const TInt KZero = 0;
       
    62 const TInt KOneContact = 1;
       
    63 
       
    64 enum TPmuCopyToMmcCmdState
       
    65     {
       
    66     EPmuCopyFromMmcCmdPrepare,
       
    67     EPmuCopyFromMmcCmdRun,
       
    68     EPmuCopyFromMmcCmdComplete
       
    69     };
       
    70 
       
    71 #ifdef _DEBUG
       
    72 
       
    73 enum TPanicCode
       
    74     {
       
    75     EExecuteLD_PreCond = 1,
       
    76     EPanic_CopyNextL_OOB,
       
    77     EPanic_Wrong_State
       
    78     };
       
    79 
       
    80 void Panic(TInt aReason)
       
    81     {
       
    82     _LIT(KPanicText, "CPmuCopyFromMmcCmd");
       
    83     User::Panic(KPanicText, aReason);
       
    84     }
       
    85 #endif // _DEBUG
       
    86 
       
    87 
       
    88 /**
       
    89  * Shows store not available note.
       
    90  *
       
    91  * @param aStoreProperties      Store properties.
       
    92  */
       
    93 void ShowStoreNotAvailableNoteL( CPbk2StorePropertyArray& aStoreProperties )
       
    94     {
       
    95     CPbk2StoreConfiguration* storeConfig = CPbk2StoreConfiguration::NewL();
       
    96     CleanupStack::PushL( storeConfig );
       
    97     const TDesC& uri = storeConfig->DefaultSavingStoreL().UriDes();
       
    98 
       
    99     // Get the property of the default saving store
       
   100     const CPbk2StoreProperty* prop =
       
   101         aStoreProperties.FindProperty( uri );
       
   102     if ( prop && prop->StoreName().Length() > 0 )
       
   103         {
       
   104         HBufC* text = StringLoader::LoadLC( R_QTN_PHOB_STORE_NOT_AVAILABLE,
       
   105             prop->StoreName() );
       
   106         CAknInformationNote* note = new(ELeave) CAknInformationNote;
       
   107         // Show "not available" note
       
   108         note->ExecuteLD( *text );
       
   109         CleanupStack::PopAndDestroy( text );
       
   110         }
       
   111 
       
   112     CleanupStack::PopAndDestroy( storeConfig );
       
   113     }
       
   114 
       
   115 /**
       
   116  * Inspects is the store valid.
       
   117  *
       
   118  * @param aInformer     Store validity informer.
       
   119  * @param aStore        Store to inspect.
       
   120  * @return  ETrue if the store is valid.s
       
   121  */
       
   122 TBool IsValidStoreL
       
   123         ( MPbk2StoreValidityInformer& aInformer, MVPbkContactStore* aStore )
       
   124     {
       
   125     TBool isValid = EFalse;
       
   126 
       
   127     if ( aStore )
       
   128         {
       
   129         CVPbkContactStoreUriArray* currentlyValidStores =
       
   130             aInformer.CurrentlyValidStoresL();
       
   131         TVPbkContactStoreUriPtr uri =
       
   132             aStore->StoreProperties().Uri();
       
   133         isValid = currentlyValidStores->IsIncluded( uri );
       
   134         delete currentlyValidStores;
       
   135         }
       
   136     return isValid;
       
   137     }
       
   138 
       
   139 } /// namespace
       
   140 
       
   141 
       
   142 // --------------------------------------------------------------------------
       
   143 // CPmuCopyFromMmcCmd::CPmuCopyFromMmcCmd
       
   144 // --------------------------------------------------------------------------
       
   145 //
       
   146 CPmuCopyFromMmcCmd::CPmuCopyFromMmcCmd( MPbk2ContactUiControl& aUiControl ) :
       
   147         CActive( EPriorityStandard ),
       
   148         iUiControl( &aUiControl )
       
   149     {
       
   150     CActiveScheduler::Add( this );
       
   151     }
       
   152 
       
   153 // --------------------------------------------------------------------------
       
   154 // CPmuCopyFromMmcCmd::~CPmuCopyFromMmcCmd
       
   155 // --------------------------------------------------------------------------
       
   156 //
       
   157 CPmuCopyFromMmcCmd::~CPmuCopyFromMmcCmd()
       
   158     {
       
   159     Cancel();
       
   160 
       
   161     iReadStream.Close();
       
   162     delete iDir;
       
   163     delete iDecorator;
       
   164     delete iImportOperation;
       
   165     delete iVCardEngine;
       
   166     }
       
   167 
       
   168 // --------------------------------------------------------------------------
       
   169 // CPmuCopyFromMmcCmd::NewL
       
   170 // --------------------------------------------------------------------------
       
   171 //
       
   172 CPmuCopyFromMmcCmd* CPmuCopyFromMmcCmd::NewL
       
   173         ( MPbk2ContactUiControl& aUiControl )
       
   174     {
       
   175     CPmuCopyFromMmcCmd* self =
       
   176         new ( ELeave ) CPmuCopyFromMmcCmd( aUiControl );
       
   177     CleanupStack::PushL( self );
       
   178     self->ConstructL();
       
   179     CleanupStack::Pop( self );
       
   180     return self;
       
   181     }
       
   182 
       
   183 // --------------------------------------------------------------------------
       
   184 // CPmuCopyFromMmcCmd::ConstructL
       
   185 // --------------------------------------------------------------------------
       
   186 //
       
   187 inline void CPmuCopyFromMmcCmd::ConstructL()
       
   188     {
       
   189     iVCardEngine = CVPbkVCardEng::NewL
       
   190         ( Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager() );
       
   191     iDecorator = Pbk2ProcessDecoratorFactory::CreateProgressDialogDecoratorL
       
   192         ( R_PMU_COPY_PROGRESS_NOTE, EFalse );
       
   193 
       
   194     CPbk2StoreConfiguration* storeConfig = CPbk2StoreConfiguration::NewL();
       
   195     CleanupStack::PushL( storeConfig );
       
   196     iTargetStore = Phonebook2::Pbk2AppUi()->ApplicationServices().
       
   197         ContactManager().ContactStoresL().Find(
       
   198             storeConfig->DefaultSavingStoreL() );
       
   199 
       
   200     CleanupStack::PopAndDestroy( storeConfig );
       
   201 
       
   202     // set the default contacts path
       
   203     iContactsPath = PathInfo::MemoryCardContactsPath();
       
   204     }
       
   205 
       
   206 // --------------------------------------------------------------------------
       
   207 // CPmuCopyFromMmcCmd::RunL
       
   208 // --------------------------------------------------------------------------
       
   209 //
       
   210 void CPmuCopyFromMmcCmd::RunL()
       
   211     {
       
   212     switch ( iState )
       
   213         {
       
   214         case EPmuCopyFromMmcCmdPrepare:
       
   215             {
       
   216             if ( iUiControl )
       
   217                 {
       
   218                 // Blank UI control to get performance improvement
       
   219                 iUiControl->SetBlank( ETrue );
       
   220                 }
       
   221 
       
   222             iState = EPmuCopyFromMmcCmdRun;
       
   223             IssueRequest();
       
   224             break;
       
   225             }
       
   226 
       
   227         case EPmuCopyFromMmcCmdRun:
       
   228             {
       
   229             if ( iDir && iCurrentContactIndex < iDir->Count() )
       
   230                 {
       
   231                 CopyNextL();
       
   232                 }
       
   233             else
       
   234                 {
       
   235                 // decorator calls processdismissed
       
   236                 iDecorator->ProcessStopped();
       
   237                 }
       
   238             break;
       
   239             }
       
   240         case EPmuCopyFromMmcCmdComplete:
       
   241             {
       
   242             CommandCompletedL();
       
   243             break;
       
   244             }
       
   245         default:
       
   246             {
       
   247             __ASSERT_DEBUG( EFalse, Panic( EPanic_Wrong_State ) );
       
   248             break;
       
   249             }
       
   250         };
       
   251 
       
   252     }
       
   253 
       
   254 // --------------------------------------------------------------------------
       
   255 // CPmuCopyFromMmcCmd::DoCancel
       
   256 // --------------------------------------------------------------------------
       
   257 //
       
   258 void CPmuCopyFromMmcCmd::DoCancel()
       
   259     {
       
   260     delete iImportOperation;
       
   261     iImportOperation = NULL;
       
   262     }
       
   263 
       
   264 // --------------------------------------------------------------------------
       
   265 // CPmuCopyFromMmcCmd::RunError
       
   266 // --------------------------------------------------------------------------
       
   267 //
       
   268 TInt CPmuCopyFromMmcCmd::RunError( TInt /*aError*/ )
       
   269     {
       
   270     delete iImportOperation;
       
   271     iImportOperation = NULL;
       
   272     
       
   273     // decorator calls processdismissed
       
   274     iDecorator->ProcessStopped();
       
   275     
       
   276     return KErrNone;
       
   277     }
       
   278 
       
   279 // --------------------------------------------------------------------------
       
   280 // CPmuCopyFromMmcCmd::ExecuteLD
       
   281 // --------------------------------------------------------------------------
       
   282 //
       
   283 void CPmuCopyFromMmcCmd::ExecuteLD()
       
   284     {
       
   285     __ASSERT_DEBUG( iCommandObserver, Panic( EExecuteLD_PreCond ) );
       
   286 
       
   287     CleanupStack::PushL( this );
       
   288 
       
   289     if ( !iTargetStore ||
       
   290           !IsValidStoreL( Phonebook2::Pbk2AppUi()->ApplicationServices().
       
   291             StoreValidityInformer(), iTargetStore ) )
       
   292         {
       
   293         // if target store not available finish command
       
   294         ShowStoreNotAvailableNoteL
       
   295             ( Phonebook2::Pbk2AppUi()->ApplicationServices().
       
   296                 StoreProperties() );
       
   297         iCommandObserver->CommandFinished(*this);
       
   298         }
       
   299     else
       
   300         {
       
   301         if ( !ShowMemorySelectionDialogL() )
       
   302             {
       
   303             iCommandObserver->CommandFinished(*this);
       
   304             }
       
   305         else
       
   306             {
       
   307             Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager().
       
   308                 FsSession().GetDir(
       
   309                     iContactsPath,
       
   310                     KEntryAttNormal | KEntryAttMatchMask,
       
   311                     ESortNone,
       
   312                     iDir );
       
   313 
       
   314             if ( iDir )
       
   315                 {
       
   316                 iDecorator->ProcessStartedL( iDir->Count() );
       
   317                 iDecorator->SetObserver( *this );
       
   318                 iCurrentContactIndex = 0;
       
   319                 iCountOfContacts = 0;
       
   320                 iState = EPmuCopyFromMmcCmdPrepare;
       
   321                 IssueRequest();
       
   322                 }
       
   323             else
       
   324                 {
       
   325                 ShowResultsL();
       
   326                 iCommandObserver->CommandFinished( *this );
       
   327                 }
       
   328             }
       
   329         }
       
   330 
       
   331     CleanupStack::Pop(this);
       
   332     }
       
   333 
       
   334 // --------------------------------------------------------------------------
       
   335 // CPmuCopyFromMmcCmd::AddObserver
       
   336 // --------------------------------------------------------------------------
       
   337 //
       
   338 void CPmuCopyFromMmcCmd::AddObserver( MPbk2CommandObserver& aObserver )
       
   339     {
       
   340     iCommandObserver = &aObserver;
       
   341     }
       
   342 
       
   343 // --------------------------------------------------------------------------
       
   344 // CPmuCopyFromMmcCmd::ResetUiControl
       
   345 // --------------------------------------------------------------------------
       
   346 //
       
   347 void CPmuCopyFromMmcCmd::ResetUiControl( MPbk2ContactUiControl& aUiControl )
       
   348     {
       
   349     if ( iUiControl == &aUiControl )
       
   350         {
       
   351         iUiControl->SetBlank( EFalse );
       
   352         iUiControl = NULL;
       
   353         }
       
   354     }
       
   355 
       
   356 // --------------------------------------------------------------------------
       
   357 // CPmuCopyFromMmcCmd::FieldAddedToContact
       
   358 // --------------------------------------------------------------------------
       
   359 //
       
   360 void CPmuCopyFromMmcCmd::FieldAddedToContact
       
   361         ( MVPbkContactOperationBase& /*aOperation*/ )
       
   362     {
       
   363     // This command does not operate on contact field level
       
   364     }
       
   365 
       
   366 // --------------------------------------------------------------------------
       
   367 // CPmuCopyFromMmcCmd::FieldAddingFailed
       
   368 // --------------------------------------------------------------------------
       
   369 //
       
   370 void CPmuCopyFromMmcCmd::FieldAddingFailed
       
   371         ( MVPbkContactOperationBase& /*aOperation*/, TInt /*aError*/ )
       
   372     {
       
   373     // This command does not operate on contact field level
       
   374     }
       
   375 
       
   376 // --------------------------------------------------------------------------
       
   377 // CPmuCopyFromMmcCmd::ContactsSaved
       
   378 // --------------------------------------------------------------------------
       
   379 //
       
   380 void CPmuCopyFromMmcCmd::ContactsSaved
       
   381         ( MVPbkContactOperationBase& aOperation,
       
   382           MVPbkContactLinkArray* aResults )
       
   383     {
       
   384     if ( &aOperation == iImportOperation )
       
   385         {
       
   386         ++iCountOfContacts;
       
   387         
       
   388         delete iImportOperation;
       
   389         iImportOperation = NULL;
       
   390         iReadStream.Close();
       
   391         IssueRequest();
       
   392         delete aResults;
       
   393         }
       
   394     }
       
   395 
       
   396 // --------------------------------------------------------------------------
       
   397 // CPmuCopyFromMmcCmd::ContactsSavingFailed
       
   398 // --------------------------------------------------------------------------
       
   399 //
       
   400 void CPmuCopyFromMmcCmd::ContactsSavingFailed
       
   401         ( MVPbkContactOperationBase& aOperation, TInt /*aError*/ )
       
   402     {
       
   403     if ( &aOperation == iImportOperation )
       
   404         {
       
   405         delete iImportOperation;
       
   406         iImportOperation = NULL;
       
   407         iReadStream.Close();
       
   408         IssueRequest();
       
   409         }
       
   410     }
       
   411 
       
   412 // --------------------------------------------------------------------------
       
   413 // CPmuCopyFromMmcCmd::ProcessDismissed
       
   414 // --------------------------------------------------------------------------
       
   415 //
       
   416 void CPmuCopyFromMmcCmd::ProcessDismissed( TInt /*aCancelCode*/ )
       
   417     {
       
   418     Cancel();
       
   419 
       
   420     iState = EPmuCopyFromMmcCmdComplete;
       
   421     IssueRequest();
       
   422     }
       
   423 
       
   424 
       
   425 // --------------------------------------------------------------------------
       
   426 // CPmuCopyFromMmcCmd::CopyNextL
       
   427 // --------------------------------------------------------------------------
       
   428 //
       
   429 void CPmuCopyFromMmcCmd::CopyNextL()
       
   430     {
       
   431     __ASSERT_DEBUG( iDir->Count() > iCurrentContactIndex,
       
   432         Panic( EPanic_CopyNextL_OOB ) );
       
   433 
       
   434     TParse parse;
       
   435     parse.Set(( *iDir )[iCurrentContactIndex].iName,
       
   436         &iContactsPath,
       
   437         NULL );
       
   438 
       
   439     User::LeaveIfError( 
       
   440         iReadStream.Open( Phonebook2::Pbk2AppUi()->ApplicationServices().
       
   441             ContactManager().FsSession(),
       
   442                 parse.FullName(), EFileRead ) );
       
   443     iImportOperation =
       
   444         iVCardEngine->ImportVCardL( *iTargetStore, iReadStream, *this );
       
   445     ++iCurrentContactIndex;
       
   446     iDecorator->ProcessAdvance( 1 );
       
   447     }
       
   448 
       
   449 // --------------------------------------------------------------------------
       
   450 // CPmuCopyFromMmcCmd::IssueRequest
       
   451 // --------------------------------------------------------------------------
       
   452 //
       
   453 void CPmuCopyFromMmcCmd::IssueRequest()
       
   454     {
       
   455     if ( !IsActive() )
       
   456         {
       
   457         TRequestStatus* status = &iStatus;
       
   458         User::RequestComplete( status, KErrNone );
       
   459         SetActive();
       
   460         }
       
   461     }
       
   462 
       
   463 // --------------------------------------------------------------------------
       
   464 // CPmuCopyFromMmcCmd::ShowResultsL
       
   465 // --------------------------------------------------------------------------
       
   466 //
       
   467 void CPmuCopyFromMmcCmd::ShowResultsL()
       
   468     {
       
   469     if ( iDir )
       
   470         {
       
   471         const TInt contactCount = iDir->Count();
       
   472         if ( contactCount == KOneContact )
       
   473             {
       
   474             TParse parse;
       
   475             parse.Set( ( *iDir )[0].iName,
       
   476                 &iContactsPath,
       
   477                 NULL );
       
   478 
       
   479             TPbk2CopyContactsResults results
       
   480                 ( iCountOfContacts, parse.Name() );
       
   481             // If default saving store is not phone memory, show different
       
   482             // after copy note
       
   483             if ( !IsDefaultStorePhoneMemoryL() )
       
   484                 {
       
   485                 results.SetOneContactCopiedTextRes
       
   486                     ( R_QTN_PBCOP_NOTE_CONTACT_COPIED_PB2 );
       
   487                 }
       
   488             results.ShowNoteL();
       
   489             }
       
   490         else
       
   491             {
       
   492             TPbk2CopyContactsResults results(
       
   493                 iCountOfContacts, iDir->Count() );
       
   494             // If default saving store is not phone memory, show different
       
   495             // after copy note
       
   496             if ( !IsDefaultStorePhoneMemoryL() )
       
   497                 {
       
   498                 results.SetMultipleContactsCopiedTextRes
       
   499                     ( R_QTN_PBCOP_NOTE_N_ENTRY_COPY_PB );
       
   500                 }
       
   501             results.ShowNoteL();
       
   502             }
       
   503         }
       
   504     else
       
   505         {
       
   506         // The directory did not found, so the card migth be formatted.
       
   507         // Show "0 copied" note
       
   508         TPbk2CopyContactsResults results(
       
   509             iCountOfContacts, KZero );
       
   510         // If default saving store is not phone memory, show different
       
   511         // after copy note
       
   512         if ( !IsDefaultStorePhoneMemoryL() )
       
   513             {
       
   514             results.SetMultipleContactsCopiedTextRes
       
   515                 ( R_QTN_PBCOP_NOTE_N_ENTRY_COPY_PB );
       
   516             }
       
   517         results.ShowNoteL();
       
   518         }
       
   519     }
       
   520 
       
   521 // --------------------------------------------------------------------------
       
   522 // CPmuCopyFromMmcCmd::IsDefaultStorePhoneMemoryL
       
   523 // --------------------------------------------------------------------------
       
   524 //
       
   525 TBool CPmuCopyFromMmcCmd::IsDefaultStorePhoneMemoryL() const
       
   526     {
       
   527     TBool ret = EFalse;
       
   528 
       
   529     const TVPbkContactStoreUriPtr uri =
       
   530         Phonebook2::Pbk2AppUi()->ApplicationServices().
       
   531             StoreConfiguration().DefaultSavingStoreL();
       
   532 
       
   533     TVPbkContactStoreUriPtr phoneMemoryUri
       
   534         ( VPbkContactStoreUris::DefaultCntDbUri() );
       
   535 
       
   536     if ( uri.Compare( phoneMemoryUri,
       
   537         TVPbkContactStoreUriPtr::EContactStoreUriStoreType ) == 0 )
       
   538         {
       
   539         ret = ETrue;
       
   540         }
       
   541 
       
   542     return ret;
       
   543     }
       
   544 
       
   545 // --------------------------------------------------------------------------
       
   546 // CPmuCopyFromMmcCmd::CommandCompletedL
       
   547 // --------------------------------------------------------------------------
       
   548 //
       
   549 void CPmuCopyFromMmcCmd::CommandCompletedL()
       
   550     {
       
   551     if (iUiControl)
       
   552         {
       
   553         iUiControl->SetBlank( EFalse );
       
   554         }
       
   555 
       
   556     ShowResultsL();
       
   557 
       
   558     if (iUiControl)
       
   559         {
       
   560         iUiControl->UpdateAfterCommandExecution();
       
   561         }
       
   562 
       
   563     if ( iCommandObserver )
       
   564         {
       
   565         iCommandObserver->CommandFinished( *this );
       
   566         }
       
   567     }
       
   568 
       
   569 // --------------------------------------------------------------------------
       
   570 // CPmuCopyFromMmcCmd::ShowMemorySelectionDialogL
       
   571 // --------------------------------------------------------------------------
       
   572 //
       
   573 TBool CPmuCopyFromMmcCmd::ShowMemorySelectionDialogL()
       
   574     {
       
   575     TBool driveSelected( EFalse );
       
   576 
       
   577     TDriveNumber selectedMem;
       
   578     CAknMemorySelectionDialogMultiDrive* dlg =
       
   579         CAknMemorySelectionDialogMultiDrive::NewL(
       
   580             ECFDDialogTypeSelect,
       
   581             R_PHONEBOOK2_MEMORY_SELECTION_DIALOG,
       
   582             EFalse,
       
   583             AknCommonDialogsDynMem::EMemoryTypeMMCExternal |
       
   584             AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage );
       
   585     CleanupStack::PushL( dlg );
       
   586     driveSelected = dlg->ExecuteL( selectedMem );
       
   587     CleanupStack::PopAndDestroy(); // dlg
       
   588 
       
   589     // If user didn't cancel the selection
       
   590     if ( driveSelected )
       
   591         {
       
   592         TInt err = PathInfo::GetFullPath
       
   593             ( iContactsPath, selectedMem,
       
   594               PathInfo::EMemoryCardContactsPath );
       
   595         User::LeaveIfError( err );
       
   596         }
       
   597 
       
   598     return driveSelected;
       
   599 }
       
   600 // End of File