filemanager/bkupengine/src/CMMCScBkupFileListCollection.cpp
branchRCL_3
changeset 39 65326cf895ed
parent 0 6a9f87576119
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/bkupengine/src/CMMCScBkupFileListCollection.cpp	Wed Sep 01 12:31:07 2010 +0100
@@ -0,0 +1,233 @@
+/*
+* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: CMMCScBkupFileListCollection implementation
+*
+*
+*/
+
+#include "CMMCScBkupFileListCollection.h"
+
+#include <bldvariant.hrh>
+#include <pathinfo.h>
+
+// User includes
+#include "MMCScBkupLogger.h"
+#include "CMMCScBkupDataOwnerInfo.h"
+#ifdef RD_FILE_MANAGER_BACKUP
+#include <driveinfo.h>
+#include "BkupEngine.hrh"
+#include "pathconfiguration.hrh"
+#endif 
+
+// Constants
+const TInt KMMCScBkupDataOwnerGranularity = 50;
+
+
+
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::CMMCScBkupFileListCollection()
+// 
+// C++ constructor.
+// ---------------------------------------------------------------------------
+CMMCScBkupFileListCollection::CMMCScBkupFileListCollection( TBitFlags aCategory, 
+    RFs& aFsSession )
+    :iEntries(KMMCScBkupDataOwnerGranularity), 
+    iCategory( aCategory ),
+    iFsSession( aFsSession )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::~CMMCScBkupFileListCollection()
+// 
+// Destructor.
+// ---------------------------------------------------------------------------
+CMMCScBkupFileListCollection::~CMMCScBkupFileListCollection()
+    {
+    Reset();
+    iEntries.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::ConstructL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupFileListCollection::ConstructL()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::NewL()
+// 
+// 
+// ---------------------------------------------------------------------------
+CMMCScBkupFileListCollection* CMMCScBkupFileListCollection::NewL( TBitFlags aCategory,
+    RFs& aFsSession )
+    {
+    CMMCScBkupFileListCollection* self = new(ELeave) CMMCScBkupFileListCollection( aCategory, aFsSession );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::AppendL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupFileListCollection::AppendL( const RArray<TEntry>& aArray, RArray< const CMMCScBkupFileInfo* >& aAddedItems, TSecureId aAssociatedSID )
+    {
+    const TInt count = aArray.Count();
+
+    __LOG2("CMMCScBkupFileListCollection::AppendL() - Number of files %d to check for category %x", count, Category().Value() );
+    
+    for(TInt i=0; i<count; i++)
+        {
+        const TEntry& entry = aArray[i];
+#ifdef RD_FILE_MANAGER_BACKUP
+        TBool skipFile = EFalse;
+
+        if(Category().Value() != EBUCatUserFiles && Category().Value() != EBUCatAllInOne)
+            {
+            // Check whether public file in system user data folder. If it is and not part of
+            // user file category, then discard file from collection
+            const TDesC& path = PathInfo::PhoneMemoryRootPath();
+            TInt error = entry.iName.FindF(path);
+            if(error != KErrNotFound)
+                {
+                __LOG1("CMMCScBkupFileListCollection::AppendL() - Skipping file %S", &entry.iName );
+                skipFile = ETrue;
+                }
+            }
+        else if(Category().Value() == EBUCatUserFiles)
+            {
+            // Check also if public file is from mass-storage. If yes and user-files category in
+            // question, prevent file getting backed up, because otherwise it is probable 2 GB 
+            // get exceeded and we cannot save larger than 2 GB archive. Allow public files being 
+            // backed up in other categories.
+            TUint drvStatus( 0 );
+            TInt drive( KErrNotFound );
+            
+            if( RFs::CharToDrive( entry.iName[0], drive ) != KErrNone )
+                {
+                drive = KErrNotFound;
+                }
+            
+            TInt err = DriveInfo::GetDriveStatus(iFsSession, drive, drvStatus );
+            
+            if ( err == KErrNone && ( drvStatus & DriveInfo::EDriveInternal ) &&
+                 ( drvStatus & DriveInfo::EDriveExternallyMountable ) )
+                {
+                __LOG1("CMMCScBkupFileListCollection::AppendL() - Skipping file %S due it in mass storage", &entry.iName );
+                skipFile = ETrue;
+                }
+            }
+
+        if(!skipFile)
+#endif // RD_FILE_MANAGER_BACKUP
+            {
+            // Check whether the file is already present before adding it (avoid duplicate 
+            // public files)
+            CMMCScBkupFileInfo* fileInfo = CMMCScBkupFileInfo::NewLC( entry, aAssociatedSID );
+
+            TLinearOrder<CMMCScBkupFileInfo> comparer( CMMCScBkupFileInfo::OrderByFileName );
+            const TInt indexIfFound = iEntries.FindInOrder( fileInfo, comparer );
+            if  (indexIfFound < 0)
+                {
+                // Item wasn't found - insert it in sorted order
+                AppendL( fileInfo );
+                CleanupStack::Pop( fileInfo );
+                
+                __LOG1("CMMCScBkupFileListCollection::AppendL() - Adding file %S", &fileInfo->FileName() );
+
+                // Add a copy to our return array.
+                aAddedItems.AppendL( fileInfo );
+                }
+            else
+                {
+                // Duplicate, discard
+                __LOG1("CMMCScBkupFileListCollection::AppendL() - Duplicate file %S", &fileInfo->FileName() );
+                CleanupStack::PopAndDestroy( fileInfo );
+                }
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::AppendL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupFileListCollection::AppendL( CMMCScBkupFileInfo* aFileInfo )
+    {
+    TLinearOrder<CMMCScBkupFileInfo> comparer( CMMCScBkupFileInfo::OrderByFileName );
+    iEntries.InsertInOrderL( aFileInfo, comparer );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::Count()
+// 
+// 
+// ---------------------------------------------------------------------------
+TInt CMMCScBkupFileListCollection::Count() const
+    {
+    return iEntries.Count();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::Entry()
+// 
+// 
+// ---------------------------------------------------------------------------
+const CMMCScBkupFileInfo& CMMCScBkupFileListCollection::Entry(TInt aIndex) const
+    {
+    const CMMCScBkupFileInfo& entry = *iEntries[aIndex];
+    return entry;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::Remove()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupFileListCollection::Remove( TInt aIndex )
+    {
+    CMMCScBkupFileInfo* entry = iEntries[aIndex];
+    delete entry;
+    iEntries.Remove(aIndex);
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupFileListCollection::Reset()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupFileListCollection::Reset()
+    {
+    iEntries.ResetAndDestroy();
+    }
+