filemanager/Engine/src/CFileManagerEngine.cpp
changeset 0 6a9f87576119
child 12 60626d494346
equal deleted inserted replaced
-1:000000000000 0:6a9f87576119
       
     1 /*
       
     2 * Copyright (c) 2002-2008 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:  Main class of the filemanagerengine
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <StringLoader.h>
       
    22 #include <barsread.h>
       
    23 #include <sysutil.h>
       
    24 #include <bautils.h>
       
    25 //#include <cmgxfilemanager.h>
       
    26 //#include <mgxfilemanagerfactory.h>
       
    27 //#include <cmgalbummanager.h>
       
    28 #include <pathinfo.h>
       
    29 #include <AknServerApp.h>
       
    30 #include <FileManagerEngine.rsg>
       
    31 #ifdef RD_MULTIPLE_DRIVE
       
    32 #include <driveinfo.h>
       
    33 #endif // RD_MULTIPLE_DRIVE
       
    34 #include "CFileManagerEngine.h"
       
    35 #include "CGflmNavigatorModel.h"
       
    36 #include "CGflmGroupItem.h"
       
    37 #include "CGflmFileSystemItem.h"
       
    38 #include "CGflmDriveItem.h"
       
    39 #include "CGflmGlobalActionItem.h"
       
    40 #include "MGflmItemGroup.h"
       
    41 #include "Cfilemanagerfolderarray.h"
       
    42 #include "CFilemanagerMimeIconArray.h"
       
    43 #include "CFileManagerActiveExecute.h"
       
    44 #include "CFileManagerRefresher.h"
       
    45 #include "Cfilemanagerfilesystemevent.h"
       
    46 #include "Cfilemanageractivesize.h"
       
    47 #include "Cfilemanageractivedelete.h"
       
    48 #include "FileManagerEngine.hrh"
       
    49 #include "CFileManagerCommonDefinitions.h"
       
    50 #include "CFileManagerUtils.h"
       
    51 #include "CFileManagerItemFilter.h"
       
    52 #include "CFileManagerDocHandler.h"
       
    53 #include "FileManagerDebug.h"
       
    54 #include "CFileManagerItemProperties.h"
       
    55 #include "CFileManagerRemovableDriveHandler.h"
       
    56 #include "CFileManagerRemoteDriveHandler.h"
       
    57 #include "CFileManagerBackupSettings.h"
       
    58 #include "CFileManagerRestoreSettings.h"
       
    59 #include "CFileManagerActiveRename.h"
       
    60 #include "CFileManagerFeatureManager.h"
       
    61 
       
    62 // CONSTANTS
       
    63 const TUint16 KIllegalChars[] = {
       
    64     '<', '>', '"', '/', '\\', '|', ':', '*', '?',
       
    65     0xFF02, // Full width quote
       
    66     0xFF0A, // Full width asterisk
       
    67     0xFF0F, // Full width slash
       
    68     0xFF1A, // Full width colon
       
    69     0xFF1C, // Full width left arrow
       
    70     0xFF1E, // Full width right arrow
       
    71     0xFF1F, // Full width question mark
       
    72     0xFF3C, // Full width back slash
       
    73     0xFF5C, // Full width pipe
       
    74     0x201C, // Left quote
       
    75     0x201D, // Right quote
       
    76     0x201F, // Reversed quote
       
    77     0x21B2, // Downwards arrow with tip leftwards
       
    78     0, // Array terminator
       
    79 };
       
    80 
       
    81 //const TInt KMGFileArrayGranularity = 32;
       
    82 
       
    83 
       
    84 // ============================ LOCAL FUNCTIONS ================================
       
    85 // -----------------------------------------------------------------------------
       
    86 // SearchMGAlbumIdL
       
    87 // -----------------------------------------------------------------------------
       
    88 //
       
    89 /*static TInt SearchMGAlbumIdL(
       
    90         CMGAlbumManager& aAlbumManager, const TDesC& aFilename )
       
    91     {
       
    92     CDesCArray* fileArray =
       
    93         new ( ELeave ) CDesCArraySeg( KMGFileArrayGranularity );
       
    94     CleanupStack::PushL( fileArray );
       
    95     TInt albumCount( aAlbumManager.AlbumCount() );
       
    96     TInt ret( KErrNotFound );
       
    97     for( TInt i( 0 ); i < albumCount; ++i )
       
    98         {
       
    99         CMGAlbumInfo* albumInfo = aAlbumManager.AlbumInfoLC( i );
       
   100         TInt albumId( albumInfo->Id() );
       
   101         CleanupStack::PopAndDestroy( albumInfo );
       
   102         fileArray->Reset();
       
   103         aAlbumManager.GetAlbumFileArrayL( albumId, *fileArray );
       
   104         TInt pos( 0 );
       
   105         if( !fileArray->Find( aFilename, pos ) )
       
   106             {
       
   107             ret = albumId;
       
   108             break;
       
   109             }
       
   110         }
       
   111     CleanupStack::PopAndDestroy( fileArray );
       
   112     return ret;
       
   113     }
       
   114 */
       
   115 
       
   116 // ============================ MEMBER FUNCTIONS ===============================
       
   117 
       
   118 // -----------------------------------------------------------------------------
       
   119 // CFileManagerEngine::CFileManagerEngine
       
   120 // C++ default constructor can NOT contain any code, that
       
   121 // might leave.
       
   122 // -----------------------------------------------------------------------------
       
   123 //
       
   124 CFileManagerEngine::CFileManagerEngine( RFs& aFs ) :
       
   125 		iFs( aFs ), iObserver( NULL ), iSisFile( EFalse )
       
   126     {
       
   127     FUNC_LOG
       
   128     }
       
   129 
       
   130 // -----------------------------------------------------------------------------
       
   131 // CFileManagerEngine::NewL
       
   132 // Two-phased constructor.
       
   133 // -----------------------------------------------------------------------------
       
   134 //
       
   135 EXPORT_C CFileManagerEngine* CFileManagerEngine::NewL( RFs& aFs )
       
   136     {
       
   137     CFileManagerEngine* self = new ( ELeave ) CFileManagerEngine( aFs );
       
   138 
       
   139     CleanupStack::PushL( self );
       
   140     self->ConstructL();
       
   141     CleanupStack::Pop( self );
       
   142 
       
   143     return self;
       
   144     }
       
   145 
       
   146 // -----------------------------------------------------------------------------
       
   147 // CFileManagerEngine::ConstructL
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 void CFileManagerEngine::ConstructL()
       
   151     {
       
   152     FUNC_LOG
       
   153 
       
   154     INFO_LOG( "CFileManagerEngine::ConstructL()-Create Feature Manager" )
       
   155     iFeatureManager = CFileManagerFeatureManager::NewL();
       
   156 
       
   157     iState = ENavigation;
       
   158 
       
   159     INFO_LOG( "CFileManagerEngine::ConstructL()-Create navigator" )
       
   160     iNavigator = CGflmNavigatorModel::NewL( iFs );
       
   161 
       
   162     // Create drives group
       
   163     MGflmItemGroup* newGroup = iNavigator->CreateGroupL(
       
   164         EFileManagerDrivesGroup, EDrives );
       
   165 #ifdef RD_FILE_MANAGER_BACKUP
       
   166     // Set backup action
       
   167     HBufC* actionCaption = StringLoader::LoadLC( R_QTN_FMGR_MAIN_BACKUP );
       
   168     newGroup->AddActionItemL( EFileManagerBackupAction, *actionCaption );
       
   169     CleanupStack::PopAndDestroy( actionCaption );
       
   170 #endif // RD_FILE_MANAGER_BACKUP
       
   171 
       
   172     // Create files and folders groups
       
   173     iNavigator->CreateGroupL( EFileManagerFilesGroup, EDirectories | EFiles );
       
   174 
       
   175     INFO_LOG( "CFileManagerEngine::ConstructL()-Create refresher" )
       
   176     iRefresher = CFileManagerRefresher::NewL( *iNavigator );
       
   177 
       
   178     INFO_LOG( "CFileManagerEngine::ConstructL()-Create utils" )
       
   179     iUtils = CFileManagerUtils::NewL( iFs, *iNavigator, *iFeatureManager );
       
   180 
       
   181     INFO_LOG( "CFileManagerEngine::ConstructL()-Create disk event" )
       
   182     iDiskEvent = CFileManagerFileSystemEvent::NewL( iFs, *this, ENotifyDisk );
       
   183 
       
   184     INFO_LOG( "CFileManagerEngine::ConstructL()-Create removable drive handler" )
       
   185     iRemovableDrvHandler = CFileManagerRemovableDriveHandler::NewL(
       
   186         iFs, *iUtils, *this );
       
   187     INFO_LOG( "CFileManagerEngine::ConstructL()-Create remote drive handler" )
       
   188     iRemoteDrvHandler = CFileManagerRemoteDriveHandler::NewL(
       
   189         *this, *iUtils );
       
   190 
       
   191     INFO_LOG( "CFileManagerEngine::ConstructL()-Create item filter" )
       
   192     iItemFilter = CFileManagerItemFilter::NewL( *this );
       
   193     iNavigator->SetCustomFilter( iItemFilter );
       
   194 
       
   195     // Store new starting index
       
   196     iNavigationIndices.AppendL( KErrNotFound );
       
   197     }
       
   198 
       
   199 // -----------------------------------------------------------------------------
       
   200 // CFileManagerEngine::~CFileManagerEngine
       
   201 // Destructor
       
   202 // -----------------------------------------------------------------------------
       
   203 // 
       
   204 EXPORT_C CFileManagerEngine::~CFileManagerEngine()
       
   205     {
       
   206     delete iActiveRename;
       
   207     iNavigationIndices.Reset();
       
   208     delete iRemoteDrvHandler;
       
   209     delete iBackupSettings;
       
   210     delete iRestoreSettings;
       
   211     delete iRemovableDrvHandler;
       
   212     delete iDocHandler;
       
   213     //delete iMgxFileManager;
       
   214     delete iFileSystemEvent;
       
   215     delete iRefresher;
       
   216     delete iNavigator;
       
   217     delete iItemFilter;
       
   218     delete iSearchString;
       
   219     delete iSearchFolder;
       
   220     delete iActiveSize;
       
   221     delete iDiskEvent;
       
   222     delete iUtils;
       
   223     delete iDriveName;
       
   224     delete iFeatureManager;
       
   225     }
       
   226 
       
   227 // -----------------------------------------------------------------------------
       
   228 // CFileManagerEngine::SetFileSystemEventL
       
   229 // -----------------------------------------------------------------------------
       
   230 //
       
   231 void CFileManagerEngine::SetFileSystemEventL( const TDesC& aFullPath )
       
   232     {
       
   233     delete iFileSystemEvent;
       
   234     iFileSystemEvent = NULL;
       
   235     if ( aFullPath != KNullDesC )
       
   236         {
       
   237         iFileSystemEvent = CFileManagerFileSystemEvent::NewL(
       
   238             iFs, *this, ENotifyEntry, aFullPath );
       
   239         }
       
   240     else
       
   241         {
       
   242         iFileSystemEvent = CFileManagerFileSystemEvent::NewL(
       
   243             iFs, *this, ENotifyEntry );
       
   244         }
       
   245     }
       
   246 
       
   247 // -----------------------------------------------------------------------------
       
   248 // CFileManagerEngine::IndexToFullPathL
       
   249 // -----------------------------------------------------------------------------
       
   250 //
       
   251 EXPORT_C HBufC* CFileManagerEngine::IndexToFullPathL(
       
   252         const TInt aIndex ) const
       
   253     {
       
   254     if ( aIndex < 0 || aIndex >= iNavigator->MdcaCount() )
       
   255         {
       
   256         User::Leave( KErrNotFound );
       
   257         }
       
   258     CGflmGroupItem* item = iNavigator->Item( aIndex );
       
   259     HBufC* fullPath = NULL;
       
   260     switch ( item->Type() )
       
   261         {
       
   262         case CGflmGroupItem::EFile: // Fall through
       
   263         case CGflmGroupItem::EDirectory:
       
   264             {
       
   265             CGflmFileSystemItem* fsItem =
       
   266                 static_cast< CGflmFileSystemItem* >( item );
       
   267             fullPath = fsItem->FullPathL();
       
   268             break;
       
   269             }
       
   270         case CGflmGroupItem::EDrive:
       
   271             {
       
   272             CGflmDriveItem* drvItem =
       
   273                 static_cast< CGflmDriveItem* >( item );
       
   274             fullPath = drvItem->RootDirectory().AllocL();
       
   275             break;
       
   276             }
       
   277         default:
       
   278             {
       
   279             User::Leave( KErrNotFound );
       
   280             break;
       
   281             }
       
   282         }
       
   283     return fullPath;
       
   284     }
       
   285 
       
   286 // -----------------------------------------------------------------------------
       
   287 // CFileManagerEngine::IndexToFullPathLC
       
   288 // -----------------------------------------------------------------------------
       
   289 //
       
   290 EXPORT_C HBufC* CFileManagerEngine::IndexToFullPathLC(
       
   291         const TInt aIndex ) const
       
   292     {
       
   293     HBufC* fullPath = IndexToFullPathL( aIndex );
       
   294     CleanupStack::PushL( fullPath );
       
   295     return fullPath;
       
   296     }
       
   297 
       
   298 // -----------------------------------------------------------------------------
       
   299 // CFileManagerEngine::AddFullPathLC
       
   300 // -----------------------------------------------------------------------------
       
   301 //
       
   302 HBufC* CFileManagerEngine::AddFullPathLC(
       
   303         const TDesC& aName, const TBool aIsFolder )
       
   304     {
       
   305     TPtrC dir( iNavigator->CurrentDirectory() );
       
   306     TInt len( dir.Length() + aName.Length() );
       
   307     if ( aIsFolder )
       
   308         {
       
   309         ++len; // Ensure space for backslash
       
   310         }
       
   311     HBufC* fullPath = HBufC::NewLC( len );
       
   312     TPtr ptr( fullPath->Des() );
       
   313     ptr.Append( dir );
       
   314     ptr.Append( aName );
       
   315     if ( aIsFolder )
       
   316         {
       
   317         CFileManagerUtils::EnsureFinalBackslash( ptr );
       
   318         }
       
   319     return fullPath;
       
   320     }
       
   321 
       
   322 // -----------------------------------------------------------------------------
       
   323 // CFileManagerEngine::SetMemoryL
       
   324 // -----------------------------------------------------------------------------
       
   325 //
       
   326 EXPORT_C TInt CFileManagerEngine::SetMemoryL( TFileManagerMemory /*aMemory*/ )
       
   327     {
       
   328     // Just check current drive avaibility, no matter what memory is set
       
   329     iLastDriveAvailable = CurrentDriveAvailable();
       
   330     return KErrNone;
       
   331     }
       
   332 
       
   333 // -----------------------------------------------------------------------------
       
   334 // CFileManagerEngine::Memory
       
   335 // -----------------------------------------------------------------------------
       
   336 //
       
   337 EXPORT_C TFileManagerMemory CFileManagerEngine::Memory() const
       
   338     {
       
   339 #ifdef RD_MULTIPLE_DRIVE
       
   340     CGflmDriveItem* drvItem = iNavigator->CurrentDrive();
       
   341     if ( drvItem )
       
   342         {
       
   343         TUint driveStatus( drvItem->DriveStatus() );
       
   344         if ( driveStatus & DriveInfo::EDriveInternal )
       
   345             {
       
   346             if ( driveStatus & DriveInfo::EDriveExternallyMountable )
       
   347                 {
       
   348                 return EFmMassStorage;
       
   349                 }
       
   350             return EFmPhoneMemory;
       
   351             }
       
   352         else if ( driveStatus & DriveInfo::EDriveUsbMemory )
       
   353             {
       
   354             return EFmUsbMemory;
       
   355             }
       
   356         else if ( driveStatus & DriveInfo::EDriveRemovable )
       
   357             {
       
   358             return EFmMemoryCard;
       
   359             }
       
   360         else if ( driveStatus & DriveInfo::EDriveRemote )
       
   361             {
       
   362             return EFmRemoteDrive;
       
   363             }
       
   364         }
       
   365     return EFmPhoneMemory;
       
   366 #else // RD_MULTIPLE_DRIVE
       
   367     CGflmDriveItem* drvItem = iNavigator->CurrentDrive();
       
   368     if ( drvItem )
       
   369         {
       
   370         const TVolumeInfo vol( drvItem->VolumeInfo() );
       
   371         if ( vol.iDrive.iDriveAtt & KDriveAttInternal )
       
   372             {
       
   373             return EFmPhoneMemory;
       
   374             }
       
   375         else if ( vol.iDrive.iDriveAtt & KDriveAttRemovable )
       
   376             {
       
   377             return EFmMemoryCard;
       
   378             }
       
   379         else if ( vol.iDrive.iDriveAtt & KDriveAttRemote )
       
   380             {
       
   381             return EFmRemoteDrive;
       
   382             }
       
   383         }
       
   384     return EFmPhoneMemory;
       
   385 #endif // RD_MULTIPLE_DRIVE
       
   386     }
       
   387 
       
   388 // -----------------------------------------------------------------------------
       
   389 // CFileManagerEngine::FileList
       
   390 // -----------------------------------------------------------------------------
       
   391 //
       
   392 EXPORT_C MDesCArray* CFileManagerEngine::FileList() const
       
   393     {
       
   394     return iNavigator;
       
   395     }
       
   396 
       
   397 // -----------------------------------------------------------------------------
       
   398 // CFileManagerEngine::OpenL
       
   399 // -----------------------------------------------------------------------------
       
   400 //
       
   401 EXPORT_C void CFileManagerEngine::OpenL( const TInt aIndex )
       
   402     {
       
   403     // Store drive letter for current drive changed checking
       
   404     TChar prevDrive( 0 );
       
   405     TPtrC prevDir( iNavigator->CurrentDirectory() );
       
   406     if ( prevDir.Length() )
       
   407         {
       
   408         prevDrive = prevDir[ 0 ];
       
   409         }   
       
   410 
       
   411     if ( aIndex < 0 || aIndex >= iNavigator->MdcaCount() )
       
   412         {
       
   413         User::Leave( KErrNotFound );
       
   414         }
       
   415     CGflmGroupItem* item = iNavigator->Item( aIndex );
       
   416     switch ( item->Type() )
       
   417         {
       
   418         case CGflmGroupItem::EFile: // Fall through
       
   419         case CGflmGroupItem::EDirectory: // Fall through
       
   420         case CGflmGroupItem::EDrive:
       
   421             {
       
   422 
       
   423 #ifdef RD_MULTIPLE_DRIVE
       
   424             // Ensure that default folders exist
       
   425             if ( item->Type() == CGflmGroupItem::EDrive )
       
   426                 {
       
   427                 CGflmDriveItem* drvItem =
       
   428                     static_cast< CGflmDriveItem* >( item );
       
   429                 iUtils->CreateDefaultFolders(
       
   430                     drvItem->Drive(), EFalse );
       
   431                 }
       
   432 #endif // RD_MULTIPLE_DRIVE
       
   433 
       
   434             // Store navigation position
       
   435             SetCurrentIndex( aIndex );
       
   436 
       
   437             HBufC* fullPath = IndexToFullPathLC( aIndex );
       
   438             if ( item->Type() == CGflmGroupItem::EFile )
       
   439                 {
       
   440                 OpenFileL( *fullPath );
       
   441                 }
       
   442             else
       
   443                 {
       
   444                 OpenDirectoryL( *fullPath );
       
   445 
       
   446                 // Setup new navigation position
       
   447                 iNavigationIndices.AppendL( 0 );
       
   448                 }
       
   449             CleanupStack::PopAndDestroy( fullPath );
       
   450             break;
       
   451             }
       
   452         case CGflmGroupItem::EGlobalActionItem:
       
   453             {
       
   454             CGflmGlobalActionItem* actItem = 
       
   455                 static_cast< CGflmGlobalActionItem* >( item );
       
   456             if ( iProcessObserver )
       
   457                 {
       
   458                 iProcessObserver->NotifyL(
       
   459                     MFileManagerProcessObserver::ENotifyActionSelected,
       
   460                     actItem->Id() );
       
   461                 }
       
   462             break;
       
   463             }
       
   464         default:
       
   465             {
       
   466             break;
       
   467             }
       
   468         }
       
   469  
       
   470     // Ensure that cached current drive info gets updated if drive was changed
       
   471     TPtrC dir( iNavigator->CurrentDirectory() );
       
   472     if ( dir.Length() )
       
   473         {
       
   474         if ( dir[ 0 ] != prevDrive )
       
   475             {
       
   476             iCurrentDriveInfoRefreshed = EFalse;
       
   477             }
       
   478         }
       
   479     }
       
   480 
       
   481 // -----------------------------------------------------------------------------
       
   482 // CFileManagerEngine::SetObserver
       
   483 // -----------------------------------------------------------------------------
       
   484 //
       
   485 EXPORT_C void CFileManagerEngine::SetObserver(
       
   486         MFileManagerProcessObserver* aObserver )
       
   487     {
       
   488     iProcessObserver = aObserver;
       
   489     iRefresher->SetObserver( aObserver );
       
   490     iRemovableDrvHandler->SetObserver( aObserver );
       
   491     }
       
   492 
       
   493 // -----------------------------------------------------------------------------
       
   494 // CFileManagerEngine::CurrentDirectory
       
   495 // -----------------------------------------------------------------------------
       
   496 //
       
   497 EXPORT_C TPtrC CFileManagerEngine::CurrentDirectory() const
       
   498     {
       
   499     return iNavigator->CurrentDirectory();
       
   500     }
       
   501 
       
   502 // -----------------------------------------------------------------------------
       
   503 // CFileManagerEngine::CurrentDirectory
       
   504 // -----------------------------------------------------------------------------
       
   505 //
       
   506 EXPORT_C TPtrC CFileManagerEngine::LocalizedNameOfCurrentDirectory() const
       
   507     {
       
   508     return iNavigator->LocalizedNameOfCurrentDirectory();
       
   509     }
       
   510 
       
   511 // -----------------------------------------------------------------------------
       
   512 // CFileManagerEngine::BackstepL
       
   513 // -----------------------------------------------------------------------------
       
   514 //
       
   515 EXPORT_C void CFileManagerEngine::BackstepL()
       
   516     {
       
   517     // Store drive letter for current drive changed checking
       
   518     TChar prevDrive( 0 );
       
   519     // Note that prevDir gets invalid after BackstepL
       
   520     TPtrC prevDir( iNavigator->CurrentDirectory() );
       
   521     if ( prevDir.Length() )
       
   522         {
       
   523         prevDrive = prevDir[ 0 ];
       
   524         }
       
   525 
       
   526     // Setup backstep navigation index
       
   527     if ( !iNavigator->NavigationLevel() )
       
   528         {
       
   529         // Always first for initial root level
       
   530         iCurrentItemName.Zero();
       
   531         }
       
   532     else if( !iCurrentItemName.Length() )
       
   533         {
       
   534         // Otherwise previously opened folder
       
   535         iCurrentItemName.Copy(
       
   536             iNavigator->LocalizedNameOfCurrentDirectory() );
       
   537         }
       
   538     TInt pos( iNavigationIndices.Count() - 1 );
       
   539     if ( pos >= 0 )
       
   540         {
       
   541         iNavigationIndices.Remove( pos );
       
   542         }
       
   543 
       
   544     iNavigator->BackstepL();
       
   545 
       
   546     // Ensure that cached current drive info gets updated if drive was changed
       
   547     TPtrC dir( iNavigator->CurrentDirectory() );
       
   548     if ( dir.Length() )
       
   549         {
       
   550         if ( dir[ 0 ] != prevDrive )
       
   551             {
       
   552             iCurrentDriveInfoRefreshed = EFalse;
       
   553             }
       
   554         }
       
   555     else
       
   556         {
       
   557         // Make sure that drive info is refreshed
       
   558         ClearDriveInfo();
       
   559         }
       
   560     }
       
   561 
       
   562 // -----------------------------------------------------------------------------
       
   563 // CFileManagerEngine::FileTypeL
       
   564 // -----------------------------------------------------------------------------
       
   565 //
       
   566 EXPORT_C TUint32 CFileManagerEngine::FileTypeL( const TInt aIndex ) const
       
   567     {
       
   568     TUint32 fileType( CFileManagerItemProperties::ENotDefined );
       
   569     if ( aIndex >= 0 )
       
   570         {
       
   571         HBufC* fullPath = IndexToFullPathLC( aIndex );
       
   572         fileType = FileTypeL( *fullPath );
       
   573         CleanupStack::PopAndDestroy( fullPath ); 
       
   574         }
       
   575     return fileType;
       
   576     }
       
   577 
       
   578 // -----------------------------------------------------------------------------
       
   579 // CFileManagerEngine::FileTypeL
       
   580 // -----------------------------------------------------------------------------
       
   581 //
       
   582 EXPORT_C TUint32 CFileManagerEngine::FileTypeL( const TDesC& aFullPath ) const
       
   583     {
       
   584     return iUtils->FileTypeL( aFullPath );
       
   585     }
       
   586 
       
   587 // -----------------------------------------------------------------------------
       
   588 // CFileManagerEngine::DeleteL
       
   589 // -----------------------------------------------------------------------------
       
   590 //
       
   591 EXPORT_C CFileManagerActiveDelete* CFileManagerEngine::CreateActiveDeleteL( 
       
   592                                               CArrayFixFlat< TInt >& aIndexList )
       
   593     {
       
   594 
       
   595     CFileManagerActiveDelete* activeDelete = 
       
   596         CFileManagerActiveDelete::NewL( aIndexList, *this, *iUtils );
       
   597     return activeDelete;
       
   598     }
       
   599 
       
   600 // -----------------------------------------------------------------------------
       
   601 // CFileManagerEngine::NewFolder
       
   602 // -----------------------------------------------------------------------------
       
   603 //
       
   604 EXPORT_C void CFileManagerEngine::NewFolderL( const TDesC& aFolderName )
       
   605     {   
       
   606     // Add backslash to end so that MkDir realizes that it is directory
       
   607     HBufC* fullPath = AddFullPathLC( aFolderName, ETrue );
       
   608     TPtr ptr( fullPath->Des() );
       
   609 
       
   610     if ( ptr.Length() <= KMaxFileName )
       
   611         {
       
   612         iCurrentItemName.Copy( aFolderName );
       
   613 
       
   614         // Remove white spaces from end, file server also ignores those
       
   615         iCurrentItemName.TrimRight();
       
   616 
       
   617         User::LeaveIfError( iFs.MkDir( ptr ) );
       
   618         }
       
   619     else
       
   620         {
       
   621         User::Leave( KErrBadName );
       
   622         }
       
   623 
       
   624     CleanupStack::PopAndDestroy( fullPath ); 
       
   625     }
       
   626 
       
   627 // -----------------------------------------------------------------------------
       
   628 // CFileManagerEngine::SetCurrentItemName
       
   629 // -----------------------------------------------------------------------------
       
   630 //
       
   631 EXPORT_C void CFileManagerEngine::SetCurrentItemName( const TDesC& aFileName )
       
   632     { 
       
   633 
       
   634     iCurrentItemName.Copy( aFileName );
       
   635 
       
   636     // Remove white spaces from end, file server also ignores those
       
   637     iCurrentItemName.TrimRight();
       
   638 
       
   639     }
       
   640 // -----------------------------------------------------------------------------
       
   641 // CFileManagerEngine::RenameL
       
   642 // -----------------------------------------------------------------------------
       
   643 //
       
   644 EXPORT_C void CFileManagerEngine::RenameL(
       
   645         const TInt aIndex,
       
   646         const TDesC& aNewFileName )
       
   647     {
       
   648     FUNC_LOG
       
   649 
       
   650     // Make those given names as full paths
       
   651     TBool isFolder( IsFolder( aIndex ) );
       
   652     HBufC* fullPathOld = IndexToFullPathLC( aIndex );
       
   653     HBufC* fullPathNew = AddFullPathLC( aNewFileName, isFolder );
       
   654 
       
   655     if ( !fullPathOld->Compare( *fullPathNew ) )
       
   656         {
       
   657         // The name has not changed, rename is not required
       
   658         CleanupStack::PopAndDestroy( fullPathNew );
       
   659         CleanupStack::PopAndDestroy( fullPathOld );
       
   660         return;
       
   661         }
       
   662 
       
   663     // Gallery notification is relevant only for local drives
       
   664     TBool isRemoteDrive( iUtils->IsRemoteDrive( *fullPathOld ) );
       
   665 
       
   666     // Media Gallery albums get easily messed up when files are renamed.
       
   667     // Direct album editing seems a trick but it is seems to only way 
       
   668     // to update Gallery properly.
       
   669     /*CMGAlbumManager* albumManager = MGAlbumManagerFactory::NewAlbumManagerL();
       
   670     CleanupStack:: PushL( albumManager );
       
   671     TInt albumId( KErrNotFound );
       
   672     if ( !isFolder && !isRemoteDrive )
       
   673         {
       
   674         // Do album search for files only
       
   675         TRAPD( err, albumId = SearchMGAlbumIdL( *albumManager, *fullPathOld ) );
       
   676         if( err != KErrNone )
       
   677             {
       
   678             albumId = KErrNotFound;
       
   679             }
       
   680         }
       
   681 */
       
   682     // Handle rename
       
   683     delete iActiveRename;
       
   684     iActiveRename = NULL;
       
   685     iActiveRename = CFileManagerActiveRename::NewL(
       
   686         *this, *iUtils, *fullPathOld, *fullPathNew );
       
   687     ShowWaitDialogL( *iActiveRename );
       
   688     User::LeaveIfError( iActiveRename->Result() );
       
   689 
       
   690     // Update Media Gallery album if file exist in album
       
   691     /*if( albumId != KErrNotFound )
       
   692         {
       
   693         TRAP_IGNORE( { albumManager->RemoveFromAlbumL( *fullPathOld, albumId );
       
   694             albumManager->AddToAlbumL( *fullPathNew, albumId ); } );
       
   695         }
       
   696     CleanupStack::PopAndDestroy( albumManager );*/
       
   697 
       
   698     iCurrentItemName.Copy( aNewFileName );
       
   699 
       
   700     /*if ( !isRemoteDrive )
       
   701         {
       
   702         // Notify Media Gallery again
       
   703         TRAP_IGNORE( MGXFileManagerL().UpdateL( *fullPathOld, *fullPathNew ) );
       
   704         }*/
       
   705 
       
   706     CleanupStack::PopAndDestroy( fullPathNew );
       
   707     CleanupStack::PopAndDestroy( fullPathOld );
       
   708     }
       
   709 
       
   710 // -----------------------------------------------------------------------------
       
   711 // CFileManagerEngine::FolderLevel
       
   712 // -----------------------------------------------------------------------------
       
   713 //
       
   714 EXPORT_C TInt CFileManagerEngine::FolderLevel()
       
   715     {
       
   716     CGflmDriveItem* drvItem = iNavigator->CurrentDrive();
       
   717     if ( !drvItem )
       
   718         {
       
   719         return KErrNotFound;  // Main level
       
   720         }
       
   721     TPtrC dir( iNavigator->CurrentDirectory() );
       
   722     TInt count( dir.Length() );
       
   723     if ( !count )
       
   724         {
       
   725         return KErrNotFound; // Main level
       
   726         }
       
   727     // Count how many backslashes is in string to figure out the deepness
       
   728     TInt min( drvItem->RootDirectory().Length() );
       
   729 	TInt bsCount( 0 );
       
   730 	while( count > min )
       
   731 		{
       
   732         --count;
       
   733 		if ( dir[ count ] == KFmgrBackslash()[ 0 ] )
       
   734 			{
       
   735 			++bsCount;
       
   736 			}
       
   737 		}
       
   738 	return bsCount;
       
   739     }
       
   740 
       
   741 // -----------------------------------------------------------------------------
       
   742 // CFileManagerEngine::IsNameFoundL
       
   743 // -----------------------------------------------------------------------------
       
   744 //
       
   745 EXPORT_C TBool CFileManagerEngine::IsNameFoundL( const TDesC& aName )
       
   746     {
       
   747     return iUtils->IsNameFoundL( aName );
       
   748     }
       
   749 
       
   750 // -----------------------------------------------------------------------------
       
   751 // CFileManagerEngine::CurrentDrive
       
   752 // -----------------------------------------------------------------------------
       
   753 //
       
   754 EXPORT_C TInt CFileManagerEngine::CurrentDrive()
       
   755     {
       
   756     TInt ret( KErrNotFound );
       
   757     TPtrC ptr( iNavigator->CurrentDirectory() );
       
   758     if ( ptr.Length() )
       
   759         {
       
   760         if( RFs::CharToDrive( ptr[ 0 ], ret ) != KErrNone )
       
   761             {
       
   762             ret = KErrNotFound;
       
   763             }
       
   764         }
       
   765     return ret;
       
   766     }
       
   767 
       
   768 // -----------------------------------------------------------------------------
       
   769 // CFileManagerEngine::GetItemInfoL
       
   770 // -----------------------------------------------------------------------------
       
   771 //
       
   772 EXPORT_C CFileManagerItemProperties* CFileManagerEngine::GetItemInfoL( 
       
   773                                                 const TInt aIndex )
       
   774     {
       
   775     if ( aIndex < 0 || aIndex >= iNavigator->MdcaCount() )
       
   776         {
       
   777         User::Leave( KErrNotFound );
       
   778         }
       
   779     CGflmGroupItem* item = iNavigator->Item( aIndex );
       
   780     return CFileManagerItemProperties::NewL( *item, *iUtils, *this );
       
   781     }
       
   782 
       
   783 // -----------------------------------------------------------------------------
       
   784 // CFileManagerEngine::SetState
       
   785 // -----------------------------------------------------------------------------
       
   786 //
       
   787 EXPORT_C void CFileManagerEngine::SetState( TState aState )
       
   788     {
       
   789     iState = aState;
       
   790     iNavigator->EnableSearchMode( iState == ESearch );
       
   791     }
       
   792 
       
   793 // -----------------------------------------------------------------------------
       
   794 // CFileManagerEngine::SetState
       
   795 // -----------------------------------------------------------------------------
       
   796 //
       
   797 EXPORT_C CFileManagerEngine::TState CFileManagerEngine::State() const
       
   798     {
       
   799     return iState;
       
   800     }
       
   801 
       
   802 // -----------------------------------------------------------------------------
       
   803 // CFileManagerEngine::RefreshDirectory
       
   804 // -----------------------------------------------------------------------------
       
   805 //
       
   806 EXPORT_C void CFileManagerEngine::RefreshDirectory()
       
   807     {
       
   808     FUNC_LOG
       
   809 
       
   810 #ifdef FILE_MANAGER_INFO_LOG_ENABLED
       
   811     if ( iState == ENavigation )
       
   812         {
       
   813         TPtrC dir( iNavigator->CurrentDirectory() );
       
   814         INFO_LOG1( "CFileManagerEngine::RefreshDirectory-dir=%S", &dir );
       
   815         }
       
   816 #endif // FILE_MANAGER_INFO_LOG_ENABLED
       
   817 
       
   818     iRefresher->Refresh();
       
   819     }
       
   820 
       
   821 // -----------------------------------------------------------------------------
       
   822 // CFileManagerEngine::GetMMCInfoL
       
   823 // -----------------------------------------------------------------------------
       
   824 //
       
   825 EXPORT_C TFileManagerDriveInfo CFileManagerEngine::GetMMCInfoL() const
       
   826     {
       
   827     TFileManagerDriveInfo drvInfo;
       
   828     GetDriveInfoL(
       
   829         PathInfo::MemoryCardRootPath(), drvInfo );
       
   830     return drvInfo;
       
   831     }
       
   832 
       
   833 // -----------------------------------------------------------------------------
       
   834 // CFileManagerEngine::SearchString
       
   835 // -----------------------------------------------------------------------------
       
   836 //
       
   837 EXPORT_C TPtrC CFileManagerEngine::SearchString() const
       
   838     {
       
   839     if ( iSearchString )
       
   840         {
       
   841         return iSearchString->Des();
       
   842         }
       
   843     return TPtrC( KNullDesC );
       
   844     }
       
   845 
       
   846 // -----------------------------------------------------------------------------
       
   847 // CFileManagerEngine::IsValidName
       
   848 // -----------------------------------------------------------------------------
       
   849 //
       
   850 EXPORT_C TBool CFileManagerEngine::IsValidName(
       
   851         const TDesC& aDriveAndPath, const TDesC& aName, TBool aIsFolder ) const
       
   852     {
       
   853     // Check name for bad chars
       
   854     const TUint16 KMinAllowedChar = 0x0020;
       
   855     const TUint16 KParagraphSeparator = 0x2029;
       
   856     const TUint16 KDot = '.';
       
   857     TInt nameLen( aName.Length() );
       
   858     if ( !nameLen )
       
   859         {
       
   860         return EFalse;
       
   861         }
       
   862     for ( TInt i( 0 ); i < nameLen; i++ )
       
   863         {
       
   864         TUint16 ch( aName[ i ] );
       
   865         if ( ch < KMinAllowedChar || ch == KParagraphSeparator )
       
   866             {
       
   867             return EFalse;
       
   868             }
       
   869         }
       
   870     // File system ignores totally dot in the end of name, so 
       
   871     // we set here as not valid name, so that user gets correctly informed
       
   872     if ( aName[ nameLen - 1 ] == KDot || IllegalChars( aName ) )
       
   873         {
       
   874         return EFalse;
       
   875         }
       
   876     // Get full path length
       
   877     TPtrC pathPtr( aDriveAndPath.Length() ?
       
   878         TPtrC( aDriveAndPath ) : TPtrC( iNavigator->CurrentDirectory() ) );
       
   879     TInt pathLen( pathPtr.Length() );
       
   880     if ( !pathLen )
       
   881         {
       
   882         return EFalse;
       
   883         }
       
   884     TInt fullPathLen( pathLen );
       
   885     if ( !CFileManagerUtils::HasFinalBackslash( pathPtr ) )
       
   886         {
       
   887         ++fullPathLen; // Add backslash before name
       
   888         }
       
   889     fullPathLen += nameLen;
       
   890     if ( aIsFolder )
       
   891         {
       
   892         ++fullPathLen; // Add folder final backslash
       
   893         }
       
   894 
       
   895     TBool ret( EFalse );
       
   896     if ( fullPathLen <= KMaxFileName )
       
   897         {
       
   898         // Check full path
       
   899         HBufC* fullPath = HBufC::New( KMaxFileName );
       
   900         if ( fullPath )
       
   901             {
       
   902             TPtr ptr( fullPath->Des() );
       
   903             ptr.Copy( pathPtr );
       
   904             CFileManagerUtils::EnsureFinalBackslash( ptr ); // Add backslash before name
       
   905             ptr.Append( aName );
       
   906             ret = iFs.IsValidName( ptr );
       
   907             delete fullPath;
       
   908             }
       
   909         }
       
   910     return ret;
       
   911     }
       
   912 
       
   913 // -----------------------------------------------------------------------------
       
   914 // CFileManagerEngine::IllegalChars
       
   915 // -----------------------------------------------------------------------------
       
   916 //
       
   917 EXPORT_C TBool CFileManagerEngine::IllegalChars( const TDesC& aName ) const
       
   918     {
       
   919     for ( TInt i( 0 ); KIllegalChars[ i ]; i++ )
       
   920         {
       
   921         if ( aName.Locate( KIllegalChars[ i ] ) != KErrNotFound )
       
   922             {
       
   923             return ETrue;
       
   924             }
       
   925         }
       
   926     return EFalse;
       
   927     }
       
   928 
       
   929 // -----------------------------------------------------------------------------
       
   930 // CFileManagerEngine::EnoughSpaceL
       
   931 // -----------------------------------------------------------------------------
       
   932 //
       
   933 EXPORT_C TBool CFileManagerEngine::EnoughSpaceL(
       
   934         const TDesC& aToFolder, 
       
   935         TInt64 aSize, 
       
   936         MFileManagerProcessObserver::TFileManagerProcess aOperation ) const
       
   937     {
       
   938     TPtrC src( iNavigator->CurrentDirectory() );
       
   939     TInt srcDrv( KErrNotFound );
       
   940     if ( src.Length() )
       
   941         {
       
   942         User::LeaveIfError( RFs::CharToDrive( src[ 0 ], srcDrv ) );
       
   943         }
       
   944     TInt dstDrv( KErrNotFound );
       
   945     if ( aToFolder.Length() )
       
   946         {
       
   947         User::LeaveIfError( RFs::CharToDrive( aToFolder[ 0 ], dstDrv ) );
       
   948         }
       
   949     else
       
   950         {
       
   951         return ETrue; // Invalid destination
       
   952         }
       
   953 
       
   954     TBool ret( EFalse );
       
   955 
       
   956     // if operation is move and drive is same so there is always enough memory
       
   957     if ( srcDrv == dstDrv &&
       
   958         aOperation == MFileManagerProcessObserver::EMoveProcess )
       
   959         {
       
   960         ret = ETrue;
       
   961         }
       
   962     else
       
   963         {
       
   964         ret = !SysUtil::DiskSpaceBelowCriticalLevelL(
       
   965             &iFs,  aSize , dstDrv );
       
   966         }
       
   967 
       
   968     return ret;
       
   969     }
       
   970 
       
   971 // -----------------------------------------------------------------------------
       
   972 // CFileManagerEngine::FileSystemEvent
       
   973 // -----------------------------------------------------------------------------
       
   974 //
       
   975 EXPORT_C void CFileManagerEngine::FileSystemEvent( TBool aEventOn )
       
   976     {
       
   977     INFO_LOG2(
       
   978         "CFileManagerEngine::FileSystemEvent-aEventOn=%d,iFileSystemEventEnabled=%d",
       
   979         aEventOn, iFileSystemEventEnabled )
       
   980 
       
   981     INFO_LOG2(
       
   982         "CFileManagerEngine::FileSystemEvent-iDriveAddedOrChangedPostponed=%d,iEmbeddedApplicationOn=%d ",
       
   983         iDriveAddedOrChangedPostponed, iEmbeddedApplicationOn )
       
   984 
       
   985     if ( !iFileSystemEventEnabled && aEventOn )
       
   986         {
       
   987         iDriveAddedOrChangedPostponed = EFalse;
       
   988         iFileSystemEventEnabled = ETrue;
       
   989         }
       
   990     else if ( iFileSystemEventEnabled && !aEventOn )
       
   991         {
       
   992         iFileSystemEventEnabled = EFalse;
       
   993         if ( iDriveAddedOrChangedPostponed )
       
   994             {
       
   995             iDriveAddedOrChangedPostponed = EFalse;
       
   996             TRAP_IGNORE( DriveAddedOrChangedL() );
       
   997             }
       
   998         }
       
   999 
       
  1000     if ( iUtils->IsRemoteDrive( iNavigator->CurrentDirectory() ) )
       
  1001         {
       
  1002          // At the moment no use to have event for remote drives
       
  1003         delete iFileSystemEvent;
       
  1004         iFileSystemEvent = NULL;
       
  1005         return;
       
  1006         }
       
  1007 
       
  1008     // Set event on when there is no embedded app with event
       
  1009     if ( aEventOn &&
       
  1010          !( iEmbeddedApplicationOn && iFileSystemEvent ) )
       
  1011         {
       
  1012         TInt err( KErrNone );
       
  1013         switch ( iState )
       
  1014             {
       
  1015             case ENavigation:
       
  1016                 {
       
  1017                 TRAP( err, SetFileSystemEventL( iNavigator->CurrentDirectory() ) );
       
  1018                 break;
       
  1019                 }
       
  1020             case ESearch:
       
  1021                 {
       
  1022                 TRAP( err, SetFileSystemEventL() );
       
  1023                 break;
       
  1024                 }
       
  1025             default:
       
  1026                 {
       
  1027                 break;
       
  1028                 }
       
  1029             }
       
  1030         if ( err != KErrNone && iProcessObserver )
       
  1031             {
       
  1032             iProcessObserver->Error( err );
       
  1033             }
       
  1034         }
       
  1035     // Check event and set it off when there is no embedded app
       
  1036     else if( !iEmbeddedApplicationOn && iFileSystemEvent )
       
  1037         {
       
  1038         iFileSystemEvent->CheckFileSystemEvent();
       
  1039         delete iFileSystemEvent;
       
  1040         iFileSystemEvent = NULL;
       
  1041         }
       
  1042     }
       
  1043 
       
  1044 // ------------------------------------------------------------------------------
       
  1045 // CFileManagerEngine::CurrentIndex
       
  1046 //
       
  1047 // ------------------------------------------------------------------------------
       
  1048 //
       
  1049 EXPORT_C TInt CFileManagerEngine::CurrentIndex()
       
  1050     {
       
  1051     if ( iCurrentItemName.Length() )
       
  1052         {
       
  1053         TInt count( iNavigator->MdcaCount() );
       
  1054         for( TInt i( 0 ); i < count; ++i )
       
  1055             {
       
  1056             CGflmGroupItem* item = iNavigator->Item( i );
       
  1057             if ( !item->Name().CompareF( iCurrentItemName ) )
       
  1058                 {
       
  1059                 iCurrentItemName.Zero();
       
  1060                 return i;
       
  1061                 }
       
  1062             }
       
  1063         iCurrentItemName.Zero();
       
  1064         }
       
  1065 
       
  1066     // Top navigation index
       
  1067     TInt pos( iNavigationIndices.Count() - 1 );
       
  1068     if ( pos >= 0 )
       
  1069         {
       
  1070         return iNavigationIndices[ pos ];
       
  1071         }
       
  1072     return KErrNotFound;
       
  1073     }
       
  1074 
       
  1075 // ------------------------------------------------------------------------------
       
  1076 // CFileManagerEngine::CanDelete
       
  1077 //
       
  1078 // ------------------------------------------------------------------------------
       
  1079 //
       
  1080 TBool CFileManagerEngine::CanDelete( const TDesC& aFileName ) const
       
  1081     {
       
  1082     return iUtils->CanDelete( aFileName );
       
  1083     }
       
  1084 
       
  1085 // ------------------------------------------------------------------------------
       
  1086 // CFileManagerEngine::LocalizedName
       
  1087 //
       
  1088 // ------------------------------------------------------------------------------
       
  1089 //
       
  1090 EXPORT_C TPtrC CFileManagerEngine::LocalizedName(
       
  1091         const TDesC& aFullPath ) const
       
  1092     {
       
  1093     return iUtils->LocalizedName( aFullPath );
       
  1094     }
       
  1095 
       
  1096 // ------------------------------------------------------------------------------
       
  1097 // CFileManagerEngine::FilesInFolderL
       
  1098 //
       
  1099 // ------------------------------------------------------------------------------
       
  1100 //
       
  1101 EXPORT_C TInt CFileManagerEngine::FilesInFolderL()
       
  1102     {
       
  1103     TInt ret( 0 );
       
  1104     switch ( iState )
       
  1105         {
       
  1106         case ENavigation: // Fall through
       
  1107         case ESearch:
       
  1108             {
       
  1109             TInt count( iNavigator->MdcaCount() );
       
  1110             for( TInt i( 0 ); i < count; ++i )
       
  1111                 {
       
  1112                 CGflmGroupItem* item = iNavigator->Item( i );
       
  1113                 if ( item->Type() == CGflmGroupItem::EFile )
       
  1114                     {
       
  1115                     ++ret;
       
  1116                     }
       
  1117                 }
       
  1118             break;
       
  1119             }
       
  1120         default:
       
  1121             {
       
  1122             break;
       
  1123             }
       
  1124         }
       
  1125     return ret;
       
  1126     }
       
  1127 
       
  1128 // ------------------------------------------------------------------------------
       
  1129 // CFileManagerEngine::CancelRefresh
       
  1130 //
       
  1131 // ------------------------------------------------------------------------------
       
  1132 //
       
  1133 EXPORT_C TBool CFileManagerEngine::CancelRefresh()
       
  1134     {
       
  1135     switch ( iState )
       
  1136         {
       
  1137         case ENavigation:
       
  1138             {
       
  1139             CancelTransfer( iNavigator->CurrentDirectory() );
       
  1140             break;
       
  1141             }
       
  1142         case ESearch:
       
  1143             {
       
  1144             if ( iSearchFolder )
       
  1145                 {
       
  1146                 CancelTransfer( *iSearchFolder );
       
  1147                 }
       
  1148             break;
       
  1149             }
       
  1150         default:
       
  1151             {
       
  1152             break;
       
  1153             }
       
  1154         }
       
  1155     return iRefresher->CancelRefresh();
       
  1156     }
       
  1157 
       
  1158 // ------------------------------------------------------------------------------
       
  1159 // CFileManagerEngine::DriveAddedOrChangedL
       
  1160 //
       
  1161 // ------------------------------------------------------------------------------
       
  1162 //
       
  1163 void CFileManagerEngine::DriveAddedOrChangedL()
       
  1164     {
       
  1165     FUNC_LOG
       
  1166     
       
  1167     if( iDiskEvent )
       
  1168         {
       
  1169         iDiskEvent->Setup();
       
  1170         }
       
  1171         
       
  1172     TBool processOngoing( iRemovableDrvHandler->IsProcessOngoing() );
       
  1173 
       
  1174     INFO_LOG3( "CFileManagerEngine::DriveAddedOrChangedL-event=%d,process=%d,postponed=%d ",
       
  1175         iFileSystemEventEnabled, processOngoing, iDriveAddedOrChangedPostponed )
       
  1176 
       
  1177     if ( iFileSystemEventEnabled || processOngoing )
       
  1178         {
       
  1179         iDriveAddedOrChangedPostponed = ETrue;
       
  1180         }
       
  1181     else
       
  1182         {
       
  1183         iDriveAddedOrChangedPostponed = EFalse;
       
  1184         ClearDriveInfo();
       
  1185         if ( iProcessObserver &&
       
  1186              !iEmbeddedApplicationOn &&
       
  1187              !iWaitDialogOn &&
       
  1188              !iRefresher->IsActive() )
       
  1189             {
       
  1190             TPtrC dir( iNavigator->CurrentDirectory() );
       
  1191             if ( dir.Length() )
       
  1192                 {
       
  1193                 TBool isAvailable( CurrentDriveAvailable() );
       
  1194 
       
  1195                 if ( iUtils->IsRemoteDrive( dir ) )
       
  1196                     {
       
  1197                     // Notify whether remote drive has become available
       
  1198                     // So when receiving remote drive connection event,
       
  1199                     // View will be refreshed
       
  1200                     //if ( !iLastDriveAvailable && isAvailable )
       
  1201                     //    {
       
  1202                         iProcessObserver->NotifyL(
       
  1203                             MFileManagerProcessObserver::ENotifyDisksChanged, 0 );
       
  1204                     //    }
       
  1205                     }
       
  1206                 else
       
  1207                     {
       
  1208                     // Notify if drive has become unavailable or
       
  1209                     // avaibility has changed
       
  1210                     if ( !isAvailable ||
       
  1211                         isAvailable != iLastDriveAvailable )
       
  1212                         {
       
  1213                         iProcessObserver->NotifyL(
       
  1214                             MFileManagerProcessObserver::ENotifyDisksChanged, 0 );
       
  1215                         }
       
  1216                     }
       
  1217                 }
       
  1218             else
       
  1219                 {
       
  1220                 // Notify always when no folder is opened
       
  1221                 iProcessObserver->NotifyL(
       
  1222                     MFileManagerProcessObserver::ENotifyDisksChanged, 0 );
       
  1223                 }
       
  1224             }
       
  1225         }
       
  1226     }
       
  1227 
       
  1228 // ------------------------------------------------------------------------------
       
  1229 // CFileManagerEngine::FolderContentChangedL
       
  1230 //
       
  1231 // ------------------------------------------------------------------------------
       
  1232 //
       
  1233 void CFileManagerEngine::FolderContentChangedL()
       
  1234     {
       
  1235     if( iProcessObserver )
       
  1236         {
       
  1237         iProcessObserver->NotifyL(
       
  1238             MFileManagerProcessObserver::ENotifyDisksChanged, 0 );
       
  1239         }
       
  1240     else
       
  1241         {
       
  1242         RefreshDirectory();
       
  1243         }
       
  1244     }
       
  1245 
       
  1246 // ------------------------------------------------------------------------------
       
  1247 // CFileManagerEngine::IsFolder
       
  1248 //
       
  1249 // ------------------------------------------------------------------------------
       
  1250 //
       
  1251 EXPORT_C TBool CFileManagerEngine::IsFolder( const TInt aIndex ) const
       
  1252     {
       
  1253     if ( aIndex < 0 || aIndex >= iNavigator->MdcaCount() )
       
  1254         {
       
  1255         return EFalse;
       
  1256         }
       
  1257     CGflmGroupItem* item = iNavigator->Item( aIndex );
       
  1258     TBool ret( EFalse );
       
  1259     switch ( item->Type() )
       
  1260         {
       
  1261         case CGflmGroupItem::EDirectory: // Fallthrough
       
  1262         case CGflmGroupItem::EDrive: // Fallthrough
       
  1263         case CGflmGroupItem::EGlobalActionItem:
       
  1264             {
       
  1265             ret = ETrue;
       
  1266             break;
       
  1267             }
       
  1268         default:
       
  1269             {
       
  1270             break;
       
  1271             }
       
  1272         }
       
  1273     return ret;
       
  1274     }
       
  1275 
       
  1276 // ------------------------------------------------------------------------------
       
  1277 // CFileManagerEngine::IconIdL
       
  1278 //
       
  1279 // ------------------------------------------------------------------------------
       
  1280 //
       
  1281 EXPORT_C TInt CFileManagerEngine::IconIdL( const TInt aIndex ) const
       
  1282     {
       
  1283     if ( aIndex < 0 || aIndex >= iNavigator->MdcaCount() )
       
  1284         {
       
  1285         User::Leave( KErrNotFound );
       
  1286         }
       
  1287     CGflmGroupItem* item = iNavigator->Item( aIndex );
       
  1288     return iUtils->ResolveIconL( *item );
       
  1289     }
       
  1290 
       
  1291 // -----------------------------------------------------------------------------
       
  1292 // CFileManagerEngine::ShowWaitDialogL( MAknBackgroundProcess& aProcess )
       
  1293 //
       
  1294 // -----------------------------------------------------------------------------
       
  1295 //
       
  1296 void CFileManagerEngine::ShowWaitDialogL( MAknBackgroundProcess& aProcess )
       
  1297     {
       
  1298     iWaitDialogOn = ETrue;
       
  1299     TRAPD( err, iProcessObserver->ShowWaitDialogL( aProcess ) );
       
  1300     iWaitDialogOn = EFalse;
       
  1301     User::LeaveIfError( err );
       
  1302     }
       
  1303 
       
  1304 // -----------------------------------------------------------------------------
       
  1305 // CFileManagerEngine::EmbeddedAppStatus( TBool aStatus )
       
  1306 //
       
  1307 // -----------------------------------------------------------------------------
       
  1308 //
       
  1309 void CFileManagerEngine::EmbeddedAppStatus( TBool aStatus )
       
  1310     {
       
  1311     iEmbeddedApplicationOn = aStatus;
       
  1312     FileSystemEvent( aStatus );
       
  1313     }
       
  1314 
       
  1315 // -----------------------------------------------------------------------------
       
  1316 // CFileManagerEngine::IsSystemFolder
       
  1317 //
       
  1318 // -----------------------------------------------------------------------------
       
  1319 //
       
  1320 EXPORT_C TBool CFileManagerEngine::IsSystemFolder( const TDesC& aFullPath ) const
       
  1321     {
       
  1322     _LIT( KSystemFolder, "?:\\system\\*" );
       
  1323     _LIT( KSysFolder, "?:\\sys\\*" );
       
  1324     _LIT( KPrivateFolder, "?:\\private\\*" );
       
  1325     _LIT( KResourceFolder, "?:\\resource\\*" );
       
  1326 
       
  1327     if ( aFullPath.MatchF( KSystemFolder ) != KErrNotFound ||
       
  1328         aFullPath.MatchF( KSysFolder ) != KErrNotFound ||
       
  1329         aFullPath.MatchF( KResourceFolder ) != KErrNotFound ||
       
  1330         aFullPath.MatchF( KPrivateFolder ) != KErrNotFound )
       
  1331         {
       
  1332         return ETrue;
       
  1333         }
       
  1334     return EFalse;
       
  1335     }
       
  1336 
       
  1337 // -----------------------------------------------------------------------------
       
  1338 // CFileManagerEngine::CurrentDriveName()
       
  1339 //
       
  1340 // -----------------------------------------------------------------------------
       
  1341 //
       
  1342 EXPORT_C TPtrC CFileManagerEngine::CurrentDriveName()
       
  1343     {
       
  1344 #ifdef RD_MULTIPLE_DRIVE
       
  1345     TPtrC dir( iNavigator->CurrentDirectory() );
       
  1346     if ( dir.Length() )
       
  1347         {
       
  1348         TInt drive = TDriveUnit( dir );
       
  1349         return DriveName( drive );
       
  1350         }
       
  1351 #else // RD_MULTIPLE_DRIVE
       
  1352     CGflmDriveItem* drvItem = iNavigator->CurrentDrive();
       
  1353     if ( drvItem )
       
  1354         {
       
  1355         return drvItem->Name();
       
  1356         }
       
  1357 #endif // RD_MULTIPLE_DRIVE
       
  1358     return TPtrC( KNullDesC );
       
  1359     }
       
  1360 
       
  1361 // -----------------------------------------------------------------------------
       
  1362 // CFileManagerEngine::GetDriveInfoL()
       
  1363 //
       
  1364 // -----------------------------------------------------------------------------
       
  1365 //
       
  1366 EXPORT_C void CFileManagerEngine::GetDriveInfoL(
       
  1367         TFileManagerDriveInfo& aInfo )
       
  1368     {
       
  1369     if ( iCurrentDriveInfoRefreshed )
       
  1370         {
       
  1371         // Use cached info
       
  1372         aInfo = iCurrentDriveInfo;
       
  1373         return;
       
  1374         }
       
  1375 
       
  1376     CGflmDriveItem* drvItem = iNavigator->CurrentDrive();
       
  1377     if ( drvItem )
       
  1378         {
       
  1379         GetDriveInfoL( drvItem->Drive(), aInfo );
       
  1380 
       
  1381         // Store info for later use
       
  1382         iCurrentDriveInfo = aInfo;
       
  1383         iCurrentDriveInfoRefreshed = ETrue;
       
  1384         }
       
  1385     else
       
  1386         {
       
  1387         User::Leave( KErrNotFound );
       
  1388         }
       
  1389     }
       
  1390 
       
  1391 // -----------------------------------------------------------------------------
       
  1392 // CFileManagerEngine::IsDistributableFile()
       
  1393 //
       
  1394 // -----------------------------------------------------------------------------
       
  1395 //
       
  1396 EXPORT_C TInt CFileManagerEngine::IsDistributableFile(
       
  1397         const TDesC& aFullPath, TBool& aIsProtected ) const
       
  1398     {
       
  1399     return iUtils->IsDistributableFile( aFullPath, aIsProtected );
       
  1400     }
       
  1401 
       
  1402 // -----------------------------------------------------------------------------
       
  1403 // CFileManagerEngine::RenameDrive()
       
  1404 //
       
  1405 // -----------------------------------------------------------------------------
       
  1406 //
       
  1407 EXPORT_C TInt CFileManagerEngine::RenameDrive(
       
  1408         const TInt aDrive,
       
  1409         const TDesC& aName )
       
  1410     {
       
  1411     TInt len( aName.Length( ) );
       
  1412     for( TInt i( 0 ); i < len; i++ )
       
  1413         {
       
  1414         TChar ch( aName[ i ] );
       
  1415         // If not alphadigit or space, return error
       
  1416         if( !ch.IsAlphaDigit() && !ch.IsSpace() )
       
  1417             {
       
  1418             return KErrBadName;
       
  1419             }
       
  1420         }
       
  1421     TInt err( iFs.SetVolumeLabel( aName, aDrive ) );
       
  1422     if ( err == KErrNone )
       
  1423         {
       
  1424         // Refresh drive info after rename
       
  1425         ClearDriveInfo();
       
  1426         }
       
  1427     return err;
       
  1428     }
       
  1429 
       
  1430 // -----------------------------------------------------------------------------
       
  1431 // CFileManagerEngine::SetDrivePassword()
       
  1432 //
       
  1433 // -----------------------------------------------------------------------------
       
  1434 //
       
  1435 EXPORT_C TInt CFileManagerEngine::SetDrivePassword(
       
  1436         const TInt aDrive,
       
  1437         const TMediaPassword& aOld,
       
  1438         const TMediaPassword& aNew )
       
  1439     {
       
  1440     ClearDriveInfo();
       
  1441     TInt err( iFs.LockDrive( aDrive, aOld, aNew, ETrue ) );
       
  1442     INFO_LOG1( "CFileManagerEngine::SetDrivePassword err %d", err );
       
  1443     return err;
       
  1444     }
       
  1445 
       
  1446 // -----------------------------------------------------------------------------
       
  1447 // CFileManagerEngine::RemoveDrivePassword()
       
  1448 //
       
  1449 // -----------------------------------------------------------------------------
       
  1450 //
       
  1451 EXPORT_C TInt CFileManagerEngine::RemoveDrivePassword(
       
  1452         const TInt aDrive,
       
  1453         const TMediaPassword& aPwd )
       
  1454     {
       
  1455     ClearDriveInfo();
       
  1456     TInt err( iFs.ClearPassword( aDrive, aPwd ) );
       
  1457     INFO_LOG1( "CFileManagerEngine::RemoveDrivePassword err %d", err );
       
  1458     return err;
       
  1459     }
       
  1460 
       
  1461 // -----------------------------------------------------------------------------
       
  1462 // CFileManagerEngine::UnlockDrive()
       
  1463 //
       
  1464 // -----------------------------------------------------------------------------
       
  1465 //    
       
  1466 EXPORT_C TInt CFileManagerEngine::UnlockDrive(
       
  1467         const TInt aDrive,
       
  1468         const TMediaPassword& aPwd )
       
  1469     {
       
  1470     ClearDriveInfo();
       
  1471     TInt err( iFs.UnlockDrive( aDrive, aPwd, ETrue ) );
       
  1472     INFO_LOG1( "CFileManagerEngine::UnlockDrive err %d", err );
       
  1473     return err;
       
  1474     }
       
  1475 
       
  1476 // -----------------------------------------------------------------------------
       
  1477 // CFileManagerEngine::StartFormatProcessL()
       
  1478 //
       
  1479 // -----------------------------------------------------------------------------
       
  1480 //  
       
  1481 EXPORT_C void CFileManagerEngine::StartFormatProcessL(
       
  1482         const TInt aDrive )
       
  1483     {
       
  1484     ClearDriveInfo();
       
  1485     iRemovableDrvHandler->StartFormatL( aDrive );
       
  1486     }
       
  1487 
       
  1488 // -----------------------------------------------------------------------------
       
  1489 // CFileManagerEngine::StartEjectProcessL()
       
  1490 //
       
  1491 // -----------------------------------------------------------------------------
       
  1492 //  
       
  1493 EXPORT_C void CFileManagerEngine::StartEjectProcessL( const TInt /*aDrive*/ )
       
  1494     {
       
  1495     ClearDriveInfo();
       
  1496     iRemovableDrvHandler->StartEjectL();
       
  1497     }
       
  1498 
       
  1499 // -----------------------------------------------------------------------------
       
  1500 // CFileManagerEngine::StartBackupProcessL()
       
  1501 //
       
  1502 // -----------------------------------------------------------------------------
       
  1503 //  
       
  1504 EXPORT_C void CFileManagerEngine::StartBackupProcessL(
       
  1505         MFileManagerProcessObserver::TFileManagerProcess aProcess )
       
  1506     {
       
  1507     switch( aProcess )
       
  1508         {
       
  1509         case MFileManagerProcessObserver::EBackupProcess: // FALLTHROUGH
       
  1510         case MFileManagerProcessObserver::ESchBackupProcess:
       
  1511             {
       
  1512             // Make sure that there is no embedded apps open
       
  1513             delete iDocHandler;
       
  1514             iDocHandler = NULL;
       
  1515 
       
  1516             ClearDriveInfo();
       
  1517             iRemovableDrvHandler->StartBackupL( aProcess );
       
  1518             break;
       
  1519             }
       
  1520         case MFileManagerProcessObserver::ERestoreProcess:
       
  1521             {
       
  1522             ClearDriveInfo();
       
  1523             iRemovableDrvHandler->StartRestoreL();
       
  1524             break;
       
  1525             }
       
  1526         default:
       
  1527             {
       
  1528             User::Leave( KErrNotSupported );
       
  1529             break;
       
  1530             }
       
  1531         }
       
  1532     }
       
  1533 
       
  1534 // -----------------------------------------------------------------------------
       
  1535 // CFileManagerEngine::CancelProcess()
       
  1536 //
       
  1537 // -----------------------------------------------------------------------------
       
  1538 //  
       
  1539 EXPORT_C void CFileManagerEngine::CancelProcess(
       
  1540         MFileManagerProcessObserver::TFileManagerProcess aProcess )
       
  1541     {
       
  1542     switch( aProcess )
       
  1543         {
       
  1544         case MFileManagerProcessObserver::EFormatProcess:
       
  1545         case MFileManagerProcessObserver::EBackupProcess: // FALLTHROUGH
       
  1546         case MFileManagerProcessObserver::ERestoreProcess: // FALLTHROUGH
       
  1547         case MFileManagerProcessObserver::ESchBackupProcess: // FALLTHROUGH
       
  1548             {
       
  1549             iRemovableDrvHandler->CancelProcess();
       
  1550             break;
       
  1551             }
       
  1552         case MFileManagerProcessObserver::EFileOpenProcess:
       
  1553             {
       
  1554             if ( iDocHandler )
       
  1555                 {
       
  1556                 iDocHandler->CancelFileOpen();
       
  1557                 }
       
  1558             break;
       
  1559             }
       
  1560         default:
       
  1561             {
       
  1562             break;
       
  1563             }
       
  1564         }
       
  1565     }
       
  1566 
       
  1567 // -----------------------------------------------------------------------------
       
  1568 // CFileManagerEngine::GetDriveInfoL()
       
  1569 //
       
  1570 // -----------------------------------------------------------------------------
       
  1571 // 
       
  1572 void CFileManagerEngine::GetDriveInfoL(
       
  1573         const TDesC& aPath,
       
  1574         TFileManagerDriveInfo& aInfo ) const
       
  1575     {
       
  1576     if ( !aPath.Length() )
       
  1577         {
       
  1578         User::Leave( KErrNotFound );
       
  1579         }
       
  1580     TInt drv( 0 );
       
  1581     User::LeaveIfError( RFs::CharToDrive( aPath[ 0 ], drv ) );
       
  1582     GetDriveInfoL( drv, aInfo );
       
  1583     }
       
  1584 
       
  1585 // -----------------------------------------------------------------------------
       
  1586 // CFileManagerEngine::DriveState()
       
  1587 //
       
  1588 // -----------------------------------------------------------------------------
       
  1589 // 
       
  1590 EXPORT_C TInt CFileManagerEngine::DriveState(
       
  1591         TUint32& aState, const TDesC& aPath ) const
       
  1592     {
       
  1593     TFileManagerDriveInfo info;
       
  1594     TRAPD( err, GetDriveInfoL( aPath, info ) );
       
  1595     if ( err == KErrNone )
       
  1596         {
       
  1597         aState = info.iState;
       
  1598         }
       
  1599     else
       
  1600         {
       
  1601         aState = 0;
       
  1602         }
       
  1603     return err;
       
  1604     }
       
  1605 
       
  1606 // -----------------------------------------------------------------------------
       
  1607 // CFileManagerEngine::DriveState()
       
  1608 //
       
  1609 // -----------------------------------------------------------------------------
       
  1610 // 
       
  1611 EXPORT_C TInt CFileManagerEngine::DriveState(
       
  1612         TUint32& aState, const TInt aDrive ) const
       
  1613     {
       
  1614     TFileManagerDriveInfo info;
       
  1615     TRAPD( err, GetDriveInfoL( aDrive, info ) );
       
  1616     if ( err == KErrNone )
       
  1617         {
       
  1618         aState = info.iState;
       
  1619         }
       
  1620     else
       
  1621         {
       
  1622         aState = 0;
       
  1623         }
       
  1624     return err;
       
  1625     }
       
  1626 
       
  1627 // -----------------------------------------------------------------------------
       
  1628 // CFileManagerEngine::MGXFileManagerL()
       
  1629 //
       
  1630 // -----------------------------------------------------------------------------
       
  1631 // 
       
  1632 /*CMGXFileManager& CFileManagerEngine::MGXFileManagerL()
       
  1633     {
       
  1634     // MG2 notification object
       
  1635     if ( !iMgxFileManager )
       
  1636         {
       
  1637         INFO_LOG( "CFileManagerEngine::MGXFileManagerL()-Create" )
       
  1638         iMgxFileManager = MGXFileManagerFactory::NewFileManagerL( iFs );
       
  1639         }
       
  1640     return *iMgxFileManager;
       
  1641     }*/
       
  1642 
       
  1643 // -----------------------------------------------------------------------------
       
  1644 // CFileManagerEngine::Fs()
       
  1645 //
       
  1646 // -----------------------------------------------------------------------------
       
  1647 // 
       
  1648 RFs& CFileManagerEngine::Fs() const
       
  1649     {
       
  1650     return iFs;
       
  1651     }
       
  1652 
       
  1653 // -----------------------------------------------------------------------------
       
  1654 // CFileManagerEngine::IsRemoteDriveConnected()
       
  1655 //
       
  1656 // -----------------------------------------------------------------------------
       
  1657 // 
       
  1658 TBool CFileManagerEngine::IsRemoteDriveConnected( const TInt aDrive  ) const
       
  1659     {
       
  1660     return iRemoteDrvHandler->IsConnected( aDrive );
       
  1661     }
       
  1662 
       
  1663 // -----------------------------------------------------------------------------
       
  1664 // CFileManagerEngine::SetRemoteDriveConnection()
       
  1665 //
       
  1666 // -----------------------------------------------------------------------------
       
  1667 // 
       
  1668 EXPORT_C TInt CFileManagerEngine::SetRemoteDriveConnection(
       
  1669         const TInt aDrive, TBool aConnect )
       
  1670     {
       
  1671     return iRemoteDrvHandler->SetConnection( aDrive, aConnect );
       
  1672     }
       
  1673 
       
  1674 // -----------------------------------------------------------------------------
       
  1675 // CFileManagerEngine::DeleteRemoteDrive()
       
  1676 //
       
  1677 // -----------------------------------------------------------------------------
       
  1678 // 
       
  1679 EXPORT_C TInt CFileManagerEngine::DeleteRemoteDrive( const TInt aDrive )
       
  1680     {
       
  1681     return iRemoteDrvHandler->DeleteSettings( aDrive );
       
  1682     }
       
  1683 
       
  1684 // -----------------------------------------------------------------------------
       
  1685 // CFileManagerEngine::BackupFileExistsL()
       
  1686 //
       
  1687 // -----------------------------------------------------------------------------
       
  1688 // 
       
  1689 #ifndef RD_FILE_MANAGER_BACKUP
       
  1690 
       
  1691 TBool CFileManagerEngine::BackupFileExistsL( const TInt aDrive ) const
       
  1692     {
       
  1693     return iRemovableDrvHandler->BackupFileExistsL( aDrive );
       
  1694     }
       
  1695 
       
  1696 #endif // RD_FILE_MANAGER_BACKUP
       
  1697 
       
  1698 // -----------------------------------------------------------------------------
       
  1699 // CFileManagerEngine::OpenFileL()
       
  1700 //
       
  1701 // -----------------------------------------------------------------------------
       
  1702 // 
       
  1703 void CFileManagerEngine::OpenFileL( const TDesC& aFullPath )
       
  1704     {
       
  1705     if ( !iDocHandler )
       
  1706         {
       
  1707         iDocHandler = CFileManagerDocHandler::NewL( *this, *iUtils );
       
  1708         }
       
  1709     iDocHandler->OpenFileL( aFullPath, iProcessObserver );
       
  1710     }
       
  1711 
       
  1712 // -----------------------------------------------------------------------------
       
  1713 // CFileManagerEngine::OpenDirectoryL()
       
  1714 //
       
  1715 // -----------------------------------------------------------------------------
       
  1716 // 
       
  1717 void CFileManagerEngine::OpenDirectoryL( const TDesC& aFullPath )
       
  1718     {
       
  1719     iNavigator->GoToDirectoryL( aFullPath, ETrue );
       
  1720     }
       
  1721 
       
  1722 // -----------------------------------------------------------------------------
       
  1723 // CFileManagerEngine::DriveRootDirectory()
       
  1724 //
       
  1725 // -----------------------------------------------------------------------------
       
  1726 //
       
  1727 EXPORT_C TPtrC CFileManagerEngine::DriveRootDirectory( TInt aDrive ) const
       
  1728     {
       
  1729     CGflmDriveItem* drvItem = iNavigator->DriveFromId( aDrive );
       
  1730     if ( drvItem )
       
  1731         {
       
  1732         return drvItem->RootDirectory();
       
  1733         }
       
  1734     return TPtrC( KNullDesC );
       
  1735     }
       
  1736 
       
  1737 // -----------------------------------------------------------------------------
       
  1738 // CFileManagerEngine::BackupSettingsL()
       
  1739 //
       
  1740 // -----------------------------------------------------------------------------
       
  1741 //
       
  1742 EXPORT_C CFileManagerBackupSettings& CFileManagerEngine::BackupSettingsL()
       
  1743     {
       
  1744     if ( !iBackupSettings )
       
  1745         {
       
  1746         INFO_LOG( "CFileManagerEngine::BackupSettingsL()-Create" )
       
  1747         iBackupSettings = CFileManagerBackupSettings::NewL( *this );
       
  1748         }
       
  1749     return *iBackupSettings;
       
  1750     }
       
  1751 
       
  1752 // -----------------------------------------------------------------------------
       
  1753 // CFileManagerEngine::RestoreSettingsL()
       
  1754 //
       
  1755 // -----------------------------------------------------------------------------
       
  1756 //
       
  1757 EXPORT_C CFileManagerRestoreSettings& CFileManagerEngine::RestoreSettingsL()
       
  1758     {
       
  1759     if ( !iRestoreSettings )
       
  1760         {
       
  1761         INFO_LOG( "CFileManagerEngine::RestoreSettingsL()-Create" )
       
  1762         iRestoreSettings = CFileManagerRestoreSettings::NewL( *this );
       
  1763         }
       
  1764     return *iRestoreSettings;
       
  1765     }
       
  1766 
       
  1767 // -----------------------------------------------------------------------------
       
  1768 // CFileManagerEngine::GetRestoreInfoArrayL()
       
  1769 //
       
  1770 // -----------------------------------------------------------------------------
       
  1771 //
       
  1772 EXPORT_C void CFileManagerEngine::GetRestoreInfoArrayL(
       
  1773         RArray< CFileManagerRestoreSettings::TInfo >& aArray,
       
  1774         const TInt aDrive ) const
       
  1775     {
       
  1776     return iRemovableDrvHandler->GetRestoreInfoArrayL( aArray, aDrive );
       
  1777     }
       
  1778 
       
  1779 // -----------------------------------------------------------------------------
       
  1780 // CFileManagerEngine::DriveName()
       
  1781 //
       
  1782 // -----------------------------------------------------------------------------
       
  1783 //
       
  1784 EXPORT_C TPtrC CFileManagerEngine::DriveName( const TInt aDrive )
       
  1785     {
       
  1786     CGflmDriveItem* drvItem = iNavigator->DriveFromId( aDrive );
       
  1787     if ( drvItem )
       
  1788         {
       
  1789 #ifdef RD_MULTIPLE_DRIVE
       
  1790         delete iDriveName;
       
  1791         iDriveName = NULL;
       
  1792 
       
  1793         TRAPD( err, iDriveName = iUtils->GetDriveNameL(
       
  1794             drvItem->Drive(), CFileManagerUtils::ETitleLayout ) );
       
  1795         if ( err == KErrNone )
       
  1796             {
       
  1797             return iDriveName->Des();
       
  1798             }
       
  1799 #else // RD_MULTIPLE_DRIVE
       
  1800         return drvItem->Name();
       
  1801 #endif // RD_MULTIPLE_DRIVE
       
  1802         }
       
  1803     return TPtrC( KNullDesC );
       
  1804     }
       
  1805 
       
  1806 // -----------------------------------------------------------------------------
       
  1807 // CFileManagerEngine::GetDriveInfoL()
       
  1808 //
       
  1809 // -----------------------------------------------------------------------------
       
  1810 //
       
  1811 EXPORT_C void CFileManagerEngine::GetDriveInfoL(
       
  1812             const TInt aDrive, TFileManagerDriveInfo& aInfo ) const
       
  1813     {
       
  1814     aInfo.GetInfoL( *this, aDrive );
       
  1815     }
       
  1816 
       
  1817 // -----------------------------------------------------------------------------
       
  1818 // CFileManagerEngine::CurrentDriveAvailable()
       
  1819 //
       
  1820 // -----------------------------------------------------------------------------
       
  1821 //
       
  1822 TBool CFileManagerEngine::CurrentDriveAvailable()
       
  1823     {
       
  1824     TFileManagerDriveInfo info;
       
  1825     TRAPD( err, GetDriveInfoL( info ) );
       
  1826     if ( err != KErrNone )
       
  1827         {
       
  1828         return EFalse;
       
  1829         }
       
  1830 
       
  1831     TInt ret( ETrue );
       
  1832     if ( info.iState & (
       
  1833             TFileManagerDriveInfo::EDriveCorrupted |
       
  1834             TFileManagerDriveInfo::EDriveLocked ) )
       
  1835         {
       
  1836         ret = EFalse;
       
  1837         }
       
  1838     else if ( !( info.iState & TFileManagerDriveInfo::EDrivePresent ) )
       
  1839         {
       
  1840         ret = EFalse;
       
  1841         }
       
  1842 
       
  1843     if ( ( info.iState & TFileManagerDriveInfo::EDriveRemote ) &&
       
  1844          !( info.iState & TFileManagerDriveInfo::EDriveConnected ) )
       
  1845         {
       
  1846         ret = EFalse;
       
  1847         }
       
  1848     return ret;
       
  1849     }
       
  1850 
       
  1851 // -----------------------------------------------------------------------------
       
  1852 // CFileManagerEngine::ClearDriveInfo()
       
  1853 //
       
  1854 // -----------------------------------------------------------------------------
       
  1855 //
       
  1856 void CFileManagerEngine::ClearDriveInfo()
       
  1857     {
       
  1858     iCurrentDriveInfoRefreshed = EFalse;
       
  1859     iNavigator->ClearDriveInfo();
       
  1860     }
       
  1861 
       
  1862 // -----------------------------------------------------------------------------
       
  1863 // CFileManagerEngine::AnyEjectableDrivePresent()
       
  1864 //
       
  1865 // -----------------------------------------------------------------------------
       
  1866 //
       
  1867 EXPORT_C TBool CFileManagerEngine::AnyEjectableDrivePresent() const
       
  1868     {
       
  1869     RArray< TInt > drives;
       
  1870     iUtils->DriveList( drives, KDriveAttRemovable );
       
  1871     TInt ret( EFalse );
       
  1872     TInt count( drives.Count() );
       
  1873     const TInt KPresentBits(
       
  1874         TFileManagerDriveInfo::EDriveEjectable |
       
  1875         TFileManagerDriveInfo::EDrivePresent );
       
  1876     for( TInt i( 0 ); i < count; ++i )
       
  1877         {
       
  1878         TUint32 state( 0 );
       
  1879         if ( DriveState( state, drives[ i ] ) == KErrNone )
       
  1880             {
       
  1881             if ( ( state & KPresentBits ) == KPresentBits )
       
  1882                 {
       
  1883                 ret = ETrue;
       
  1884                 break;
       
  1885                 }
       
  1886             }
       
  1887         }
       
  1888     drives.Close();
       
  1889     return ret;
       
  1890     }
       
  1891 
       
  1892 // -----------------------------------------------------------------------------
       
  1893 // CFileManagerEngine::ForcedRefreshDirectory()
       
  1894 //
       
  1895 // -----------------------------------------------------------------------------
       
  1896 //
       
  1897 EXPORT_C void CFileManagerEngine::ForcedRefreshDirectory()
       
  1898     {
       
  1899     TPtrC ptr( iNavigator->CurrentDirectory() );
       
  1900     if ( ptr.Length() && iUtils->IsRemoteDrive( ptr ) )
       
  1901         {
       
  1902         // Ensure that remote directory is reloaded
       
  1903         iRemoteDrvHandler->RefreshDirectory( ptr );
       
  1904         }
       
  1905     RefreshDirectory();
       
  1906     }
       
  1907 
       
  1908 // -----------------------------------------------------------------------------
       
  1909 // CFileManagerEngine::HasAppRemoteDriveSupport()
       
  1910 //
       
  1911 // -----------------------------------------------------------------------------
       
  1912 //
       
  1913 TBool CFileManagerEngine::HasAppRemoteDriveSupport( TUid aUid )
       
  1914     {
       
  1915     return iRemoteDrvHandler->HasAppRemoteDriveSupport( aUid );
       
  1916     }
       
  1917 
       
  1918 // -----------------------------------------------------------------------------
       
  1919 // CFileManagerEngine::GetFileSizesL()
       
  1920 //
       
  1921 // -----------------------------------------------------------------------------
       
  1922 //
       
  1923 EXPORT_C TInt64 CFileManagerEngine::GetFileSizesL(
       
  1924         const CArrayFixFlat<TInt>& aIndexList )
       
  1925     {
       
  1926     FUNC_LOG
       
  1927 
       
  1928     TBool isCanceled( EFalse );
       
  1929     TInt64 size( 0 );
       
  1930     TInt count( aIndexList.Count() );
       
  1931 
       
  1932     for( TInt i( 0 ); i < count; ++i )
       
  1933         {
       
  1934         CGflmGroupItem* item = iNavigator->Item( aIndexList.At( i ) );
       
  1935         switch ( item->Type() )
       
  1936             {
       
  1937             case CGflmGroupItem::EFile:
       
  1938                 {
       
  1939                 CGflmFileSystemItem* fsItem =
       
  1940                     static_cast< CGflmFileSystemItem* >( item );
       
  1941                 size += static_cast<TUint>(fsItem->Entry().iSize);
       
  1942                 break;
       
  1943                 }
       
  1944             case CGflmGroupItem::EDirectory:
       
  1945                 {                        
       
  1946                 CGflmFileSystemItem* fsItem =
       
  1947                     static_cast< CGflmFileSystemItem* >( item );
       
  1948                 HBufC* fullPath = fsItem->FullPathLC();
       
  1949 
       
  1950                 delete iActiveSize;
       
  1951                 iActiveSize = NULL;
       
  1952 
       
  1953                 iActiveSize = CFileManagerActiveSize::NewL(
       
  1954                     iFs, *fullPath );
       
  1955 
       
  1956                 ShowWaitDialogL( *iActiveSize );
       
  1957 
       
  1958                 TInt64 folderSize( iActiveSize->GetFolderSize() );
       
  1959                 if ( folderSize == KErrNotFound )
       
  1960                     {
       
  1961                     // Calculation was canceled by the user
       
  1962                     isCanceled = ETrue;
       
  1963                     }
       
  1964                 else
       
  1965                     {
       
  1966                     size += folderSize;
       
  1967                     }
       
  1968 
       
  1969                 CleanupStack::PopAndDestroy( fullPath );
       
  1970                 break;
       
  1971                 }
       
  1972             default:
       
  1973                 {
       
  1974                 break;
       
  1975                 }
       
  1976             }
       
  1977 
       
  1978         if ( isCanceled )
       
  1979             {
       
  1980             break;
       
  1981             }
       
  1982         }
       
  1983 
       
  1984     if ( isCanceled )
       
  1985         {
       
  1986         return KErrNotFound;
       
  1987         }
       
  1988     return size;
       
  1989     }
       
  1990 
       
  1991 // -----------------------------------------------------------------------------
       
  1992 // CFileManagerEngine::CancelTransfer()
       
  1993 //
       
  1994 // -----------------------------------------------------------------------------
       
  1995 //
       
  1996 void CFileManagerEngine::CancelTransfer( const TDesC& aFullPath )
       
  1997     {
       
  1998     if ( iUtils->IsRemoteDrive( aFullPath ) )
       
  1999         {
       
  2000         iRemoteDrvHandler->CancelTransfer( aFullPath );
       
  2001         }
       
  2002     }
       
  2003 
       
  2004 // -----------------------------------------------------------------------------
       
  2005 // CFileManagerEngine::NavigationLevel
       
  2006 // -----------------------------------------------------------------------------
       
  2007 //
       
  2008 EXPORT_C TInt CFileManagerEngine::NavigationLevel() const
       
  2009     {
       
  2010     return iNavigator->NavigationLevel();
       
  2011     }
       
  2012 
       
  2013 #ifdef RD_MULTIPLE_DRIVE
       
  2014 // -----------------------------------------------------------------------------
       
  2015 // CFileManagerEngine::GetFormattedDriveNameLC
       
  2016 // -----------------------------------------------------------------------------
       
  2017 //
       
  2018 EXPORT_C HBufC* CFileManagerEngine::GetFormattedDriveNameLC(
       
  2019         const TInt aDrive,
       
  2020         const TInt aTextIdForDefaultName,
       
  2021         const TInt aTextIdForName ) const
       
  2022     {
       
  2023     return iUtils->GetFormattedDriveNameLC(
       
  2024         aDrive, aTextIdForDefaultName, aTextIdForName );
       
  2025     }
       
  2026 #else // RD_MULTIPLE_DRIVE
       
  2027 EXPORT_C HBufC* CFileManagerEngine::GetFormattedDriveNameLC(
       
  2028         const TInt /*aDrive*/,
       
  2029         const TInt /*aTextIdForDefaultName*/,
       
  2030         const TInt /*aTextIdForName*/  ) const
       
  2031     {
       
  2032     User::Leave( KErrNotSupported );
       
  2033     return NULL;
       
  2034     }
       
  2035 #endif // RD_MULTIPLE_DRIVE
       
  2036 
       
  2037 // -----------------------------------------------------------------------------
       
  2038 // CFileManagerEngine::GetItemInfoLC
       
  2039 // -----------------------------------------------------------------------------
       
  2040 //
       
  2041 EXPORT_C CFileManagerItemProperties* CFileManagerEngine::GetItemInfoLC(
       
  2042         const TInt aIndex )
       
  2043     {
       
  2044     CFileManagerItemProperties* ret = GetItemInfoL( aIndex );
       
  2045     CleanupStack::PushL( ret );
       
  2046     return ret;
       
  2047     }
       
  2048 
       
  2049 // -----------------------------------------------------------------------------
       
  2050 // CFileManagerEngine::SetSearchStringL
       
  2051 // -----------------------------------------------------------------------------
       
  2052 //
       
  2053 EXPORT_C void CFileManagerEngine::SetSearchStringL( const TDesC& aSearchString )
       
  2054     {
       
  2055     delete iSearchString;
       
  2056     iSearchString = NULL;
       
  2057     iSearchString = aSearchString.AllocL();
       
  2058     iNavigator->SetSearchStringL( aSearchString );
       
  2059     }
       
  2060 
       
  2061 // -----------------------------------------------------------------------------
       
  2062 // CFileManagerEngine::SetSearchFolderL
       
  2063 // -----------------------------------------------------------------------------
       
  2064 //
       
  2065 EXPORT_C void CFileManagerEngine::SetSearchFolderL( const TDesC& aSearchFolder )
       
  2066     {
       
  2067     delete iSearchFolder;
       
  2068     iSearchFolder = NULL;
       
  2069     iSearchFolder = aSearchFolder.AllocL();
       
  2070     iNavigator->SetSearchFolderL( aSearchFolder );
       
  2071     }
       
  2072 
       
  2073 // -----------------------------------------------------------------------------
       
  2074 // CFileManagerEngine::SetDirectoryWithBackstepsL
       
  2075 // -----------------------------------------------------------------------------
       
  2076 //
       
  2077 EXPORT_C void CFileManagerEngine::SetDirectoryWithBackstepsL(
       
  2078         const TDesC& aDirectory )
       
  2079     {
       
  2080     CGflmDriveItem* drvItem = iNavigator->DriveFromPath( aDirectory );
       
  2081     if ( !drvItem )
       
  2082         {
       
  2083         return;
       
  2084         }
       
  2085     // Build backsteps
       
  2086     iNavigator->GoToDirectoryL( drvItem->RootDirectory(), aDirectory );
       
  2087 
       
  2088     // Build navigation indices
       
  2089     iNavigationIndices.Reset();
       
  2090     iNavigationIndices.AppendL( KErrNotFound ); // Set initial
       
  2091     TInt count( iNavigator->NavigationLevel() ); // Set backsteps
       
  2092     for( TInt i( 0 ); i < count; ++i )
       
  2093         {
       
  2094         iNavigationIndices.AppendL( KErrNotFound );
       
  2095         }
       
  2096     iNavigationIndices.AppendL( KErrNotFound ); // Set current
       
  2097     }
       
  2098 
       
  2099 // -----------------------------------------------------------------------------
       
  2100 // CFileManagerEngine::SetCurrentIndex
       
  2101 // -----------------------------------------------------------------------------
       
  2102 //
       
  2103 EXPORT_C void CFileManagerEngine::SetCurrentIndex( const TInt aIndex )
       
  2104     {
       
  2105     TInt pos( iNavigationIndices.Count() - 1 );
       
  2106     if ( pos >= 0 )
       
  2107         {
       
  2108         iNavigationIndices[ pos ] = aIndex;
       
  2109         }
       
  2110     }
       
  2111 
       
  2112 // -----------------------------------------------------------------------------
       
  2113 // CFileManagerEngine::SetSortMethod
       
  2114 // -----------------------------------------------------------------------------
       
  2115 //
       
  2116 EXPORT_C void CFileManagerEngine::SetSortMethod( TSortMethod aSortMethod )
       
  2117     {
       
  2118     switch ( aSortMethod )
       
  2119         {
       
  2120         case EByName:          // Fallthrough
       
  2121         case EByType:          // Fallthrough
       
  2122         case EMostRecentFirst: // Fallthrough
       
  2123         case ELargestFirst:    // Fallthrough
       
  2124         case EByMatch:
       
  2125             {
       
  2126             // Make sure that the enums do match
       
  2127             iNavigator->SetSortMethod(
       
  2128                 static_cast< TGflmSortMethod >( aSortMethod ) );
       
  2129             break;
       
  2130             }
       
  2131         default:
       
  2132             {
       
  2133             ERROR_LOG1(
       
  2134                 "CFileManagerEngine::SetSortMethod-InvalidMethod=%d",
       
  2135                 aSortMethod )
       
  2136             break;
       
  2137             }
       
  2138         }
       
  2139     }
       
  2140 
       
  2141 // -----------------------------------------------------------------------------
       
  2142 // CFileManagerEngine::SortMethod
       
  2143 // -----------------------------------------------------------------------------
       
  2144 //
       
  2145 EXPORT_C CFileManagerEngine::TSortMethod CFileManagerEngine::SortMethod() const
       
  2146     {
       
  2147     // Make sure that the enums do match
       
  2148     return static_cast< TSortMethod >( iNavigator->SortMethod() );
       
  2149     }
       
  2150 
       
  2151 // -----------------------------------------------------------------------------
       
  2152 // CFileManagerEngine::RefreshSort
       
  2153 // -----------------------------------------------------------------------------
       
  2154 //
       
  2155 EXPORT_C void CFileManagerEngine::RefreshSort()
       
  2156     {
       
  2157     iRefresher->Refresh( ERefreshSort );
       
  2158     }
       
  2159 
       
  2160 // -----------------------------------------------------------------------------
       
  2161 // CFileManagerEngine::FeatureManager
       
  2162 // -----------------------------------------------------------------------------
       
  2163 //
       
  2164 EXPORT_C CFileManagerFeatureManager& CFileManagerEngine::FeatureManager() const
       
  2165     {
       
  2166     return *iFeatureManager;
       
  2167     }
       
  2168 
       
  2169 // -----------------------------------------------------------------------------
       
  2170 // CFileManagerEngine::SetAppExitOb
       
  2171 // -----------------------------------------------------------------------------
       
  2172 //
       
  2173 EXPORT_C void CFileManagerEngine::SetAppExitOb( MAknServerAppExitObserver* aObserver )
       
  2174     {
       
  2175     iObserver = aObserver;
       
  2176     }
       
  2177 
       
  2178 // -----------------------------------------------------------------------------
       
  2179 // CFileManagerEngine::NoticeServerAppExit
       
  2180 // -----------------------------------------------------------------------------
       
  2181 //
       
  2182 void CFileManagerEngine::NoticeServerAppExit( TInt aReason )
       
  2183     {
       
  2184     if ( iObserver && iSisFile )
       
  2185         {
       
  2186         iUtils->FlushCache();
       
  2187         iObserver->HandleServerAppExit( aReason );
       
  2188         iSisFile = EFalse;
       
  2189         }
       
  2190     }
       
  2191 
       
  2192 // -----------------------------------------------------------------------------
       
  2193 // CFileManagerEngine::SetSisFile
       
  2194 // -----------------------------------------------------------------------------
       
  2195 //
       
  2196 void CFileManagerEngine::SetSisFile( TBool aSisFile )
       
  2197     {
       
  2198     iSisFile = aSisFile;
       
  2199     }
       
  2200 
       
  2201 // ---------------------------------------------------------------------------
       
  2202 // CFileManagerEngine::LatestBackupTimeL()
       
  2203 // ---------------------------------------------------------------------------
       
  2204 //
       
  2205 TInt CFileManagerEngine::LatestBackupTime( TTime& aBackupTime )
       
  2206     {
       
  2207     TRAPD( err, iRemovableDrvHandler->LatestBackupTimeL( aBackupTime ) );
       
  2208     return err;
       
  2209     }
       
  2210 
       
  2211 // ---------------------------------------------------------------------------
       
  2212 // CFileManagerEngine::DeleteBackupsL()
       
  2213 // ---------------------------------------------------------------------------
       
  2214 //
       
  2215 EXPORT_C void CFileManagerEngine::DeleteBackupsL()
       
  2216     {
       
  2217     iRemovableDrvHandler->DeleteBackupsL();
       
  2218     }
       
  2219 
       
  2220 
       
  2221 //  End of File