diff -r 000000000000 -r bde4ae8d615e os/persistentdata/persistentstorage/sql/SRC/Server/SqlBur.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/persistentstorage/sql/SRC/Server/SqlBur.h Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,229 @@ +// Copyright (c) 2006-2010 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: +// + +#ifndef __SQLBUR_H__ +#define __SQLBUR_H__ + +#include +#include +#include +#include +#include // MactiveBackupDataClient +#include "SqlSrvBurInterface.h" + +//Forward declarations +class CSqlBurCallback; + +#ifdef SQL_BUR_PROPERTY_MONITOR_TEST + +const TInt32 KSqlBurPropertyCategory = 0x10281e17;//the SQL server secure id (the bur tests have the same id, + //in order to be able to operate with the property) +const TUint KSqlBurBackupRestoreKeyValue = 0x1234DDD1; + +extern TInt TestModeSqlBurError; +#define SQL_BUR_TEST_SET_ERROR(err) TestModeSqlBurError = err +//This macro is called at the end of CSqlBurEventMonitor::RunL()and CSqlBurEventMonitor::RunError() +//CActiveScheduler::Stop() is called here to return the execution control back to the test code. +#define SQL_BUR_TEST_STOP() CActiveScheduler::Stop() + +#else + +const TInt32 KSqlBurPropertyCategory = KUidSystemCategoryValue; +const TUint KSqlBurBackupRestoreKeyValue = conn::KUidBackupRestoreKey; + +#define SQL_BUR_TEST_SET_ERROR(err) (void)0 +#define SQL_BUR_TEST_STOP() (void)0 + +#endif + +/** +The system category of the backup and restore property, that is used for notifying active backup clients +regarding beginning or the end of backup or restore process. +Different value is used in SQL tests, because only the secure backup server can set or get the value of +the {KUidSystemCategoryValue, conn::KUidBackupRestoreKey} property. +@internalComponent +*/ +const TUid KSqlBurPropertyCategoryUid = {KSqlBurPropertyCategory}; + +/** +The backup and restore property key, that is used for notifying active backup clients +regarding beginning or the end of backup or restore process. +Different value is used in SQL tests, because only the secure backup server can set or get the value of +the {KUidSystemCategoryValue, conn::KUidBackupRestoreKey} property. +@internalComponent +*/ +const TUint KSqlBurBackupRestoreKey = KSqlBurBackupRestoreKeyValue; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////// Backup database file header format /////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +////// No version (Version 0) +// 8 chars 8 chars 8 chars up to 256 characters (512 bytes) +// <32-bit checksum><32-bit filesize><32-bit filenamelen> + +////// Version 2 +// 8 chars 8 chars 4 chars 16 chars 8 chars up to 256 characters (512 bytes) +// <32-bit checksum><64-bit filesize><32-bit filenamelen> + +const TInt KSqlBurHeaderVersion = 2; //Current backup database file header version + +const TUint32 KSqlBurMagicNum = 0xFFFFAA55; //Magic number. If the "old database file size" field in the header + //has this value, then the header version is 2+ +const TInt KSqlBurMaxHeaderSize = 256 + KMaxFileName; //The size of the buffer used for the operations on the header + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +An object of this class is created to monitor the backup & restore property +{KUidSystemCategory, KUidBackupRestoreKey}. +If the property gets set, the CSqlBurEventMonitor object will create a CSqlBurClient +instance to handle the backup or restore. + +@internalComponent +*/ +class CSqlBurEventMonitor : public CActive + { +public: + static CSqlBurEventMonitor* NewL(MSqlSrvBurInterface& aBufInterface); + virtual ~CSqlBurEventMonitor(); +#ifdef SQL_BUR_PROPERTY_MONITOR_TEST + inline conn::CActiveBackupClient* ActiveBackupClient(); + inline CSqlBurCallback* SqlBurCallback(); +#endif + +private: + CSqlBurEventMonitor(MSqlSrvBurInterface& aInterface); + void ConstructL(); + virtual void RunL(); + virtual void DoCancel(); + virtual TInt RunError(TInt aError); + void CreateContentL(); + void DestroyContent(); + +private: + RProperty iBurProperty;//B&R property published by the B&R server. SQL server subscribes for notifications + MSqlSrvBurInterface& iBurInterface;//Provided by the SQL server + conn::CActiveBackupClient* iActiveBackupClient;//The connection with the B&R server + CSqlBurCallback* iSqlBurCallback;//A "Database file list" interface provided by the SQL server + + }; + +#ifdef SQL_BUR_PROPERTY_MONITOR_TEST + +inline conn::CActiveBackupClient* CSqlBurEventMonitor::ActiveBackupClient() + { + return iActiveBackupClient; + } + +inline CSqlBurCallback* CSqlBurEventMonitor::SqlBurCallback() + { + return iSqlBurCallback; + } + +#endif + +/** +This class is called by the Backup and Restore Framework +when a backup or restore is requested by the user +It implements the active proxy backup and restore as +defined in the MActiveBackupDataClient interface. + +@internalComponent +*/ +class CSqlBurCallback : public CBase, public conn::MActiveBackupDataClient + { +public: + static CSqlBurCallback* NewL(MSqlSrvBurInterface& aBufInterface); + virtual ~CSqlBurCallback(); + + //Implementations of virtuals from MActiveBackupDataClient - full backup + virtual void InitialiseGetProxyBackupDataL(TSecureId aSid, TDriveNumber aDrive); + virtual TUint GetExpectedDataSize(TDriveNumber aDrive); + virtual void GetBackupDataSectionL(TPtr8& aBuffer, TBool& aFinished); + + //Implementations of virtuals from MActiveBackupDataClient - full restore + virtual void InitialiseRestoreProxyBaseDataL(TSecureId aSid, TDriveNumber aDrive); + virtual void RestoreComplete(TDriveNumber aDrive); + virtual void RestoreBaseDataSectionL(TDesC8& aBuffer, TBool aFinished); + + virtual void TerminateMultiStageOperation(); + virtual TUint GetDataChecksum(TDriveNumber aDrive); + + //Implementations of virtuals from MActiveBackupDataClient - incremental backup & restore - not supported + virtual void AllSnapshotsSuppliedL(); + virtual void ReceiveSnapshotDataL(TDriveNumber aDrive, TDesC8& aBuffer, TBool aLastSection); + virtual void GetSnapshotDataL(TDriveNumber aDrive, TPtr8& aBuffer, TBool& aFinished); + virtual void InitialiseGetBackupDataL(TDriveNumber aDrive); + virtual void InitialiseRestoreBaseDataL(TDriveNumber aDrive); + virtual void InitialiseRestoreIncrementDataL(TDriveNumber aDrive); + virtual void RestoreIncrementDataSectionL(TDesC8& aBuffer, TBool aFinished); + + // to validate successful BUR + TInt CheckSum(const RFile64 &aOpenFile, TUint64& aCheckSum) const; + +private: + CSqlBurCallback(MSqlSrvBurInterface& aInterface); + void CopyBufData(const TDesC8& aInBuf, TInt& aInBufReadPos, TDes& aOutBuf, TInt aDataLen); + void BackupCleanup(); + TInt RestoreCleanup(); + void SetBackupError(TInt aError); + +private: + + // state machine for backup + enum + { + EBackupNoFileOpen=0, // not currently processing a file + EBackupOpenNothingSent, // file open and ready, but nothing sent yet + EBackupOpenPartHeaderSent, // part of the header is sent, but more remains + EBackupOpenAllHeaderSent, // all of the header is sent, ready to send the data + EBackupEndOfFile // all done, tidy up after backup + }; + + // state machine for restore + // this is more complicated because we are driven by the backup engine + // and have incomplete information most of the time + enum + { + ERestoreExpectChecksum=0, // checksum marks the start of the next file + ERestoreExpectOldFileSize, // the size of the file - backup file header version 0 + ERestoreExpectVersion, // backup header version + ERestoreExpectFileSize, // the size of the file, backup file header version 2+ + ERestoreExpectFileNameSize, // the size of the file name + ERestoreExpectFileName, // the name of the file to restore + ERestoreExpectData, // now for the data + ERestoreComplete // tidy up after restore + }; + + MSqlSrvBurInterface& iInterface; //A "Database file list" interface provided by the SQL server + RArray iFileList; //An array with database file names for backup, provided by the SQL server + RFile64 iFile; //A handle to file being backup/restored. + TInt iFileIndex; //The index of the file name in iFileList being processed at the moment + TUint iState; //Backup or restore state machine - current state + TBuf iBuffer; //Used for the header data + TInt iHeaderSent; //How many header bytes sent so far + TUint32 iChecksum; //Database archive checksum - used by the restore. + TInt64 iFileSize; //Restored database file size - used by the restore. + TUint32 iFileNameSize; //Restored database file name size - used by the restore. + TDriveNumber iRestoreDrive; //The drive where the data is currently restored to. + TSecureId iRestoreId; //The secure id of the client which data is being restored at the moment + TInt iBackupError; //An error occured during the backup processing + TFileName iRestoreDir; //The directory where temporary files will be created during restore. + TParse iParse; + + }; + +#endif // __SQLBUR_H__