skins/AknSkins/srvinc/aknssrvactivebackupdataclient.h
changeset 0 05e9090e2422
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/skins/AknSkins/srvinc/aknssrvactivebackupdataclient.h	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,381 @@
+/*
+* Copyright (c) 2007 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:  Skin server's active data owner in backup/restore.
+*
+*/
+
+
+#ifndef C_AKNSSRVACTIVEBACKUPDATACLIENT_H
+#define C_AKNSSRVACTIVEBACKUPDATACLIENT_H
+
+#include <e32base.h>    // CBase
+#include <connect/abclient.h>
+
+/**
+ *  Skin server's active data owner in backup/restore.
+ *
+ *  Backed up files are not restored:
+ *      - if same file exists in system folder (cannot overwrite)
+ *      - if the same file exists in private directory
+ *      - if no matching .skn-file is found from private directory.
+ *
+ * If file is restored, it is re-created to the skin's private directory.
+ *
+ *  @lib aknskinsrv.dll
+ *  @since S60 v3.1
+ */
+NONSHARABLE_CLASS( CAknsSrvActiveBackupDataClient ) : public CBase, 
+                                                      public conn::MActiveBackupDataClient
+    {
+public:
+
+    enum TAknsSrvBackupState
+        {
+        // initial state; open a file for processing
+        EBackupNoFileOpen = 0,
+        // nothing sent for current file - send the file header info
+        EBackupOpenNothingSent,
+        // part of the header info sent - need to send the rest of the header
+        EBackupOpenPartHeaderSent,
+        // need to send data from the current file
+        EBackupOpenAllHeaderSent,
+        // At the end of the current file.
+        EBackupEndOfFile
+        };
+
+    enum TAknsSrvRestoreState
+        {
+        // initial state; expecting number of files to restore.
+        ERestoreNumberOfFiles = 0,
+        // expecting checksum of 16 bytes
+        ERestoreExpectChecksum,
+        // continue reading checksum; it didn't fit completely in 
+        // one read
+        ERestoreExpectMoreChecksum,
+        // expecting to read file size of 16 bytes
+        ERestoreExpectFileSize,
+        // file size didn't fit into read buffer in one read.
+        ERestoreExpectMoreFileSize,
+        // the size of the filename to restore
+        ERestoreExpectFileNameSize,
+        // filename size didn't fit into read buffer in one read.
+        ERestoreExpectMoreFileNameSize,
+        // the filename to restore
+        ERestoreExpectFileName,
+        // filename didn't fit into read buffer in one read.
+        ERestoreExpectMoreFileName,
+        // the content of the file to restore
+        ERestoreExpectData,
+        // file content didn't fit into read buffer in one read.
+        ERestoreExpectMoreData,
+        // At the end of current file. Creates missing files to 
+        // restored directory.
+        ERestoreComplete
+        };
+
+    static CAknsSrvActiveBackupDataClient* NewL( RFs& aFsSession );
+
+    virtual ~CAknsSrvActiveBackupDataClient();
+
+    /**
+    * This method is called when a backup or restore operation is 
+    * starting. Preparations can be done to prepare for BUR.
+    *        
+    * @param aBackupStateValue the value of the current backup state
+    */
+    void PrepareForBURL( TInt aBackupStateValue );
+
+// from base class MActiveBackupDataClient
+
+    /**
+     * This method informs the active backup data client that all 
+     * snapshots have been supplied. If the client has not
+     * received a snapshot then it should perform a base backup
+     */
+    virtual void AllSnapshotsSuppliedL();
+
+    /**
+     * This method receives all or part of a snapshot of data to allow 
+     * calculation of an incremental backup.  The snapshot is one that
+     * was previously supplied by the data owner.  The snapshot data 
+     * should be read from the location supplied. The snapshot data may
+     * be larger than the location supplied in which case the routine 
+     * will be called repeatedly until all data has been supplied.
+     *
+     * Snapshot data will also be supplied as part of a restore operation
+     *        
+     * @param aDrive the drive being backed up
+     * @param aBuffer a pointer to the base of the location from whence 
+     *        data can be copied.
+     * @param aLastSection ETrue if this is the last section of snapshot 
+     *        data, else EFalse.
+     */
+    virtual void ReceiveSnapshotDataL(
+        TDriveNumber aDrive, TDesC8& aBuffer, TBool aLastSection);
+
+    /**
+     * This method returns the expected size of backup data that will be
+     * supplied. If an incremental backup is underway then this method
+     * then this method will not be called until after 
+     * ReceiveSnapshotDataL(). The size data will be used for the purpose
+     * of tracking progess during a backup. If it is inaccurate then the
+     * user may see irregular progress but the actual backup data will 
+     * not be affected so it is acceptable to return an estimated value.
+     *
+     * @param aDrive the drive being backed up.
+     * @return the size of the data that will be returned
+     */
+    virtual TUint GetExpectedDataSize(TDriveNumber aDrive);
+
+    /**
+     * This method returns a snapshot of data to accompany a backup. The 
+     * snapshot is expected to contain details on files / data being 
+     * backed up. The format of the snapshot is only meaningful to the
+     * data owner. The snapshot will be supplied if the data owner is 
+     * asked for an incremental backup and for a restore operation. The 
+     * snapshot data should be copied to the location supplied.
+     *
+     * The snapshot data may be larger than the location supplied in 
+     * which case the routine will be called repeatedly until all data
+     * has been retrieved.
+     *
+     * @param aDrive the drive being backed up
+     * @param aBuffer a pointer to the base of the location where data 
+     *        can be copied.
+     * @param aFinished on return ETrue if all data has been returned 
+     *        for this drive, else EFalse.
+     */
+    virtual void GetSnapshotDataL( 
+        TDriveNumber aDrive, TPtr8& aBuffer, TBool& aFinished);
+
+    /**
+     * This method prepares the implementor to return backup data. It 
+     * will be followed by a sequence of calls to request the actual 
+     * data.
+     *        
+     * @param aDrive the drive being backed up.
+     */
+    virtual void InitialiseGetBackupDataL(TDriveNumber aDrive);
+
+    /**
+     * This method requests a section of backup data.  
+     * InitialiseGetBackupDataL() will have been called previously to
+     * specify the drive concerned.  The data returned may be base or
+     * incremental depending on the type of backup and the capability of
+     * the data owner.
+     *
+     * @param aBuffer a pointer to the base of the location where data 
+     *        can be copied.
+     * @param aFinished on return ETrue if all data has been returned 
+     *        for this drive, else EFalse.
+     */
+    virtual void GetBackupDataSectionL(TPtr8& aBuffer, TBool& aFinished);
+
+    /**
+     * This method prepares the implementor to receive base restore data
+     * for a drive. It will be followed by a sequence of calls to supply
+     * the actual data.
+     *
+     * @param aDrive the drive being restored.
+     */
+    virtual void InitialiseRestoreBaseDataL(TDriveNumber aDrive);
+
+    /**
+     * This method receives a section of base restore data.
+     * InitialiseRestoreBaseDataL() will have been called previously to 
+     * specify the drive concerned.
+     *
+     * @param aBuffer a pointer to the base of the location whence data
+     *        can be read.
+     * @param aFinished ETrue if all data has been returned for this 
+     *        drive, else EFalse.
+     */
+    virtual void RestoreBaseDataSectionL(TDesC8& aBuffer, TBool aFinished);
+
+    /**
+     * This method prepares the implementor to receive incremental 
+     * restore data for a drive. It will be followed by a sequence 
+     * of calls to supply the actual data.  If multiple increments
+     * are supplied then this methid will be called before each increment
+     *
+     * @param aDrive the drive being restored.
+     */
+    virtual void InitialiseRestoreIncrementDataL(TDriveNumber aDrive);
+
+    /**
+     * This method receives a section of increment restore data.
+     * InitialiseRestoreIncrementDataL() will have been called 
+     * previously to specify the drive concerned.
+     *
+     * @param aBuffer a pointer to the base of the location whence data 
+     *        can be read.
+     * @param aFinished ETrue if all data has been returned for this 
+     *        increment, else EFalse.
+     */
+    virtual void RestoreIncrementDataSectionL(TDesC8& aBuffer, TBool aFinished);
+
+    /**
+     * This method is called when all data to be restored has been 
+     * supplied.
+     *
+     * @param aDrive the drive being restored.
+     */
+    virtual void RestoreComplete(TDriveNumber aDrive);   
+
+    /**
+     * This method is called if copying of data is terminated prematurely 
+     * to allow the implementor to tidy up.  The same method applies to 
+     * all types of data and to backup and restore.
+     */
+    virtual void TerminateMultiStageOperation();
+
+    /**
+     * Gets a 32-bit checksum for its private data.
+     * This routine is for test purposes.  It must be implemented but an
+     * invariant checksum value can be provided.  Some tests may cause 
+     * checksum values to be compared.
+     *
+     * @param aDrive the drive containing data being checksummed
+     * @return the 32-bit checksum
+     */
+    virtual TUint GetDataChecksum(TDriveNumber aDrive);
+
+    /**
+    * This method prepares the implementor to return backup data on behalf of another data owner.
+    * It will be followed by a sequence of calls to request the actual data. This method is only
+    * for use by a proxy data manager that backs up data on behalf of other data owners.  There
+    * is no corresponding method for snapshots as it is assumed that a proxy data manager will
+    * only handle base data.
+    *
+    * @param aSID the data owner whose data is to be backed up
+    * @param aDrive the drive being backed up.
+    */
+    virtual void InitialiseGetProxyBackupDataL(TSecureId aSID, TDriveNumber aDrive);
+
+    /**
+    This method prepares the implementor to receive base restore data for another data owner
+    for a drive. It will be followed by a sequence of calls to supply the actual data.
+    This method is only for use by a proxy data manager that restores up data on behalf of
+    other data owners.  There is no corresponding method for incremental data as it is assumed
+    that a proxy data manager will only handle base data.
+
+    @param aSID the data owner whose data is to be restored
+    @param aDrive the drive being restored.
+    */
+    virtual void InitialiseRestoreProxyBaseDataL(TSecureId aSID, TDriveNumber aDrive);
+
+private:
+
+    /* Checks file integrity after restoration. */
+    TUint64 CheckSumL(const RFile& aOpenFile) const;
+
+    /* Scans the .skn-files in the private directory. */
+    void ScanDirectoryForSkinFilesL( const TDesC& aRootDir );
+
+    /* Re-creates backed-up file to private directory.
+       Also verifies that a matching .skn-file exists.*/
+    TInt RestoreFileInPrivateDirectoryL( const TDesC& aFileName );
+
+    CAknsSrvActiveBackupDataClient( RFs& aFsSession );
+
+    void ConstructL();
+
+    /* Initialise backup data. */
+    void DoInitialiseGetBackupDataL( TDriveNumber aDrive );
+
+private: // data
+
+    /**
+     * Index of currently handled file in filename array.
+     */
+    TInt iFileIndex;
+
+    /**
+     * Backup statemachine state.
+     */
+    TAknsSrvBackupState iBackupState;
+
+    /**
+     * Restore statemachine state.
+     */
+    TAknsSrvRestoreState iRestoreState;
+
+    /**
+     * Number of bytes sent from file header.
+     */
+    TInt iHeaderSent;
+
+    /**
+     * Array of files to backup/restore.
+     */
+    RArray<TParse> iFileArray;
+
+    /**
+     * "persistent" buffer.
+     */
+    HBufC* iBuffer;
+
+    /**
+     * Currently handled file.
+     */
+    RFile iFile;
+
+    /**
+     * Has any data been restored.
+     */
+    TBool iDataRestored;
+
+    /**
+     * Checksum of backup file. Used by Restore.
+     */
+    TUint32 iChecksum;
+
+    /**
+     * Size of file. Used by Restore.
+     */    
+    TUint32 iFileSize;
+
+    /**
+     * Lenght of filename. Used by Restore.
+     */
+    TUint32 iFileNameSize;
+
+    /*
+    * File system session.
+    */
+    RFs& iFsSession;
+
+    /*
+    * Number of files handled by Restore. 
+    * Note that actual number of restored files might be less than this, 
+    * since already existing files are not restored and orphaned files
+    * (.skn-file missing) are not restored either.
+    */
+    TInt iFilesRestored;
+
+    /*
+    * Number of files supposed to restore.
+    */
+    TUint32 iNumberofFiles;
+
+    /*
+    * Indicates that there is an issue with current file.
+    * All received Restore streams will be ignored, until a new file
+    * is received.
+    */
+    TBool iFileOpenError;
+    };
+
+#endif // C_AKNSSRVACTIVEBACKUPDATACLIENT_H
+