filemanager/bkupengine/src/CMMCScBkupStateRequestListOfPublicFiles.cpp
branchRCL_3
changeset 21 65326cf895ed
parent 0 6a9f87576119
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/bkupengine/src/CMMCScBkupStateRequestListOfPublicFiles.cpp	Wed Sep 01 12:31:07 2010 +0100
@@ -0,0 +1,447 @@
+/*
+* Copyright (c) 2005 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: CMMCScBkupStateRequestListOfPublicFiles implementation
+*
+*
+*/
+
+#include "CMMCScBkupStateRequestListOfPublicFiles.h"
+
+// System includes
+#include <e32std.h>
+
+// User includes
+#include "MMCScBkupLogger.h"
+#include "MMCScBkupSBEUtils.h"
+#include "CMMCScBkupDataOwnerInfo.h"
+#include "RMMCScBkupProgressSizer.h"
+#include "CMMCScBkupDataOwnerInfo.h"
+#include "MMMCScBkupProgressObserver.h"
+#include "CMMCScBkupFileListCollection.h"
+#include "CMMCScBkupDataOwnerCollection.h"
+
+
+
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::CMMCScBkupStateRequestListOfPublicFiles()
+// 
+// C++ constructor.
+// ---------------------------------------------------------------------------
+CMMCScBkupStateRequestListOfPublicFiles::CMMCScBkupStateRequestListOfPublicFiles( MMMCScBkupDriver& aDriver )
+:   CMMCScBkupState( aDriver )
+    {
+    __LOG1("CMMCScBkupStateRequestListOfPublicFiles::CMMCScBkupStateRequestListOfPublicFiles() - 0x%08x", StateId().iUid );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::~CMMCScBkupStateRequestListOfPublicFiles()
+// 
+// Destructor.
+// ---------------------------------------------------------------------------
+CMMCScBkupStateRequestListOfPublicFiles::~CMMCScBkupStateRequestListOfPublicFiles()
+    {
+    Cancel();
+    //
+    delete iRequestObject;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::ConstructL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestListOfPublicFiles::ConstructL()
+    {
+    iRequestObject = CMMCScBkupStateRequestSpecificPublicFileInfo::NewL(Driver());
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::NewL()
+// 
+// 
+// ---------------------------------------------------------------------------
+CMMCScBkupStateRequestListOfPublicFiles* CMMCScBkupStateRequestListOfPublicFiles::NewL( MMMCScBkupDriver& aDriver )
+    {
+    CMMCScBkupStateRequestListOfPublicFiles* self = new(ELeave) CMMCScBkupStateRequestListOfPublicFiles( aDriver );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::StateId()
+// 
+// 
+// ---------------------------------------------------------------------------
+TMMCScBkupStateId CMMCScBkupStateRequestListOfPublicFiles::StateId() const
+    {
+    return KMMCScBkupStateIdRequestListOfPublicFiles;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::NextStateId()
+// 
+// 
+// ---------------------------------------------------------------------------
+TMMCScBkupStateId CMMCScBkupStateRequestListOfPublicFiles::NextStateId() const
+    {
+    return KMMCScBkupStateIdValidateDiskSpace;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::PerformStateInitL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestListOfPublicFiles::PerformStateInitL()
+    {
+    // Set to -1 so that the first time RunL is called, we start with
+    // the data owner at index 0.
+    iCurrentDataOwnerIndex = -1;
+    CompleteSelf(KErrNone);
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousStateStepL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousStateStepL()
+    {
+    CMMCScBkupDataOwnerCollection& dataOwners = Driver().DrvDataOwners();
+    if  (++iCurrentDataOwnerIndex < dataOwners.Count())
+        {
+        CMMCScBkupDataOwnerInfo& owner = dataOwners.Owner(iCurrentDataOwnerIndex);
+
+        const TBool hasPublicFiles = (owner.Owner().PassiveSettings() & EHasPublicFiles);
+        if  (hasPublicFiles)
+            {
+            // Request all the public files (on all supported drives) for this
+            // particular data owner
+            __ASSERT_ALWAYS(iRequestObject->IsActive() == EFalse, User::Invariant());
+            //
+            iRequestObject->RequestL(owner, iStatus);
+            SetActive();
+            }
+        else
+            {
+            // Try next data owner
+            CompleteSelf();
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousErrorCleanup()
+// 
+// 
+// ---------------------------------------------------------------------------
+TBool CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousErrorCleanup(TInt aError)
+    {
+    (void) aError;
+    __LOG1("CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousErrorCleanup() - **** - error: %d", aError );
+
+    // Cancel requester. Its probably already inactive, but just in case...
+    PerformAsynchronousCancellation();
+
+    // Reset state and move to next item. Treat the current (badly behaving) item
+    // as completed/processed.
+    CMMCScBkupDataOwnerCollection& dataOwners = Driver().DrvDataOwners();
+    if  ( iCurrentDataOwnerIndex < dataOwners.Count() )
+        {
+        CMMCScBkupDataOwnerInfo& owner = dataOwners.Owner( iCurrentDataOwnerIndex );
+        (void) owner;
+        __LOGFILE2("CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousErrorCleanup() - **** - error: %d, SID: 0x%08x - PUBLIC data skipped for DO", aError, owner.SecureId().iId );
+
+        // Ensures that asynchronous state step is called again..
+        CompleteSelf();
+        }
+
+    return ETrue;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousCancellation()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestListOfPublicFiles::PerformAsynchronousCancellation()
+    {
+    if  ( iRequestObject )
+        {
+        iRequestObject->Cancel();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestListOfPublicFiles::PerformLastRightsL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestListOfPublicFiles::PerformLastRightsL()
+    {
+    // Now we can calculate the progress        
+    TInt64 totalProgressAmount = 0;
+
+    // Calculate the total progress required for the entire backup operation
+    CMMCScBkupDataOwnerCollection& dataOwners = Driver().DrvDataOwners();
+    const TInt count = dataOwners.Count();
+    //
+    RMMCScBkupProgressSizer sizer( Driver().DrvParamsBase().DriveAndOperations() );
+    for(TInt i=0; i<count; i++)
+        {
+        CMMCScBkupDataOwnerInfo& owner = dataOwners.Owner( i );
+        //
+        totalProgressAmount += sizer.BackupTotalProgressValueL( owner );
+        }
+
+    // Check whether all categories have been processed and either store current 
+    // progress information in driver or inform progress handler about cumulative progress.
+    // If size is getting beyond file system limitation (2GB), leave with KErrxxx.
+    if(Driver().DrvLastCategory())
+        {
+        __LOG2("CMMCScBkupStateRequestListOfPublicFiles::PerformLastRightsL() - report progress understood (%Ld + %Ld)", 
+            totalProgressAmount, Driver().DrvTotalProgress());
+        
+        Driver().DrvStoreTotalProgress( totalProgressAmount );
+
+        if( Driver().DrvTotalProgress() > KMaxTInt )
+            {
+            __LOG1("CMMCScBkupStateRequestListOfPublicFiles::PerformLastRightsL() - leaving with KErrNotSupported due amount of data (%Ld)", 
+                Driver().DrvTotalProgress());
+            Driver().DrvProgressHandler().MMCScBkupStartBackuping( EFalse );
+            User::Leave( KErrNotSupported );
+            }
+        else
+            {
+            Driver().DrvProgressHandler().MMCScBkupHandleProgressDomainUnderstood( Driver().DrvTotalProgress() );
+            }
+        }
+    else
+        {
+        __LOG2("CMMCScBkupStateRequestListOfPublicFiles::PerformLastRightsL() - adding progress amount %Ld to existing %Ld)", 
+            totalProgressAmount, Driver().DrvTotalProgress());
+            
+        if( (totalProgressAmount + Driver().DrvTotalProgress()) > KMaxTInt )
+            {
+            __LOG1("CMMCScBkupStateRequestListOfPublicFiles::PerformLastRightsL() - leaving due amount of data (%Ld)", 
+                totalProgressAmount + Driver().DrvTotalProgress());
+            User::Leave(KErrNotSupported);
+            }
+        else
+            {
+            Driver().DrvStoreTotalProgress( totalProgressAmount );
+            }
+        }
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestSpecificPublicFileInfo::CMMCScBkupStateRequestSpecificPublicFileInfo()
+// 
+// 
+// ---------------------------------------------------------------------------
+CMMCScBkupStateRequestSpecificPublicFileInfo::CMMCScBkupStateRequestSpecificPublicFileInfo( MMMCScBkupDriver& aDriver )
+:   CMMCScBkupDriveSpecificRequest( aDriver.DrvParamsBase().DriveAndOperations(), EMMCScBkupOwnerDataTypePublicData ), iDriver(aDriver)
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestSpecificPublicFileInfo::NewL()
+// 
+// 
+// ---------------------------------------------------------------------------
+CMMCScBkupStateRequestSpecificPublicFileInfo* CMMCScBkupStateRequestSpecificPublicFileInfo::NewL( MMMCScBkupDriver& aDriver )
+    {
+    CMMCScBkupStateRequestSpecificPublicFileInfo* self = new (ELeave) CMMCScBkupStateRequestSpecificPublicFileInfo(aDriver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestSpecificPublicFileInfo::RequestL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestSpecificPublicFileInfo::RequestL( CMMCScBkupDataOwnerInfo& aOwner, TRequestStatus& aObserver )
+    {
+    iOwner = &aOwner;
+    CMMCScBkupDriveSpecificRequest::RequestL( aObserver );
+
+    // Start the asynchronous request. 
+    CompleteSelf(KErrNone);
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestSpecificPublicFileInfo::RunL()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestSpecificPublicFileInfo::RunL()
+    {
+    __LOG1("CMMCScBkupStateRequestSpecificPublicFileInfo::RunL() - START - iStatus: %d", iStatus.Int());
+    User::LeaveIfError(iStatus.Int());
+    //
+    CDataOwnerInfo& owner = iOwner->Owner();
+    const TDriveList& ownerDrives = owner.DriveList();
+    TDriveNumber drive = EDriveA;
+    const TBool driveAvailable = NextValidDrive(drive, ownerDrives);
+    const TSecureId secureId = iOwner->SecureId();
+
+    __LOG3("CMMCScBkupStateRequestSpecificPublicFileInfo::RunL() - secureId: 0x%08x, driveAvailable: %d, drive: %c", secureId.iId, driveAvailable, drive + 'A');
+
+    if  (driveAvailable)
+        {
+        // This drive needs to be scanned...
+        TInt err( KErrNone );
+        RFileArray files;
+        CleanupClosePushL(files);
+
+        // Get a copy of the generic data type for which we are
+        // requesting file listings...
+        CSBGenericDataType* genericDataType = CSBSecureId::NewL( secureId );
+        CleanupStack::PushL( genericDataType );
+        TRAP( err, Driver().DrvSecureBackupClient().PublicFileListL( drive, *genericDataType, files ) );
+        if( err != KErrNone && err != KErrNotFound )
+            {
+            User::Leave( err );
+            }
+        CleanupStack::PopAndDestroy( genericDataType );
+        // Additionally we need to request list of public files registered for packages.
+        if( MMCScBkupSBEUtils::HasSystemDataL( owner ) )
+            {
+            RFileArray pkgFiles;
+            CleanupClosePushL( pkgFiles );
+            __LOG2("CMMCScBkupStateRequestSpecificPublicFileInfo::RunL() - have %d files before package listing for DO, err %d", files.Count(), err);
+            TRAP( err, Driver().DrvSecureBackupClient().PublicFileListL( drive, owner.Identifier(), pkgFiles ) );
+            __LOG2("CMMCScBkupStateRequestSpecificPublicFileInfo::RunL() - have %d package files for DO, err %d", files.Count(), err);
+            const TInt pkgCount = pkgFiles.Count();
+            for(TInt i = 0; i < pkgCount; i++)
+                {
+                files.AppendL( pkgFiles[i] );
+                }
+            CleanupStack::PopAndDestroy( &pkgFiles );
+            }
+
+        // Add to the file list
+        __LOG1("CMMCScBkupStateRequestSpecificPublicFileInfo::RunL() - have %d files for DO", files.Count());
+        if  (files.Count())
+            {
+
+            // We want to be told by the public file collection exactly which files
+            // it added... We need to do this in order to report progress as accurately 
+            // as possible during the backup operation.
+            RArray< const CMMCScBkupFileInfo* > addedItems;
+            CleanupClosePushL(addedItems);
+            
+            // Add them to the public data file collection
+            Driver().DrvFileList().AppendL( files, addedItems, secureId );
+            
+            // For each identified file, update the data owner with the size of public data
+            const TInt count = addedItems.Count();
+            for(TInt i=0; i<count; i++)
+                {
+                const CMMCScBkupFileInfo& file = *addedItems[i];
+                const TInt size = file.Size();
+                //
+                __LOG3("CMMCScBkupStateRequestSpecificPublicFileInfo::RunL() - file[%04d] = %S, size: %d", i, &file.FileName(), size);
+                iOwner->AddToOperationalSizeL( EMMCScBkupOwnerDataTypePublicData, drive, size );
+                }
+            //
+            CleanupStack::PopAndDestroy( &addedItems );
+            }
+        //
+        CleanupStack::PopAndDestroy( &files );
+
+        // Complete ourself to try the next drive
+        CompleteSelf( KErrNone );
+        }
+    else
+        {
+        CompleteObserverRequest( KErrNone );
+        }
+
+    __LOG("CMMCScBkupStateRequestSpecificPublicFileInfo::RunL() - END");
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMMCScBkupStateRequestSpecificPublicFileInfo::DoCancel()
+// 
+// 
+// ---------------------------------------------------------------------------
+void CMMCScBkupStateRequestSpecificPublicFileInfo::DoCancel()
+    {
+    }
+
+
+
+