persistentstorage/sql/SRC/Server/SqlBur.h
changeset 0 08ec8eefde2f
child 8 fa9941cf3867
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/SRC/Server/SqlBur.h	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,140 @@
+// Copyright (c) 2006-2009 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 <e32base.h>
+#include <f32file.h>
+#include <f32file64.h>
+#include <e32property.h>
+#include <connect/abclient.h> // MactiveBackupDataClient
+#include "SqlSrvBurInterface.h"
+
+using namespace conn;
+
+//-----------------------------------------
+// CSqlBackupClient
+//-----------------------------------------
+
+/**
+	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
+*/
+
+// derives from the framework mixin MActiveBackupClient
+class CSqlBackupClient : public CActive, public MActiveBackupDataClient
+	{
+	public:
+		static CSqlBackupClient *NewLC(MSqlSrvBurInterface *aBurInterface);
+		static CSqlBackupClient *NewL(MSqlSrvBurInterface *aBufInterface);
+		
+		~CSqlBackupClient();
+		
+		// AO implementations
+		void StartL();
+		void NotifyChange();
+		
+		// impl of virtuals from MActiveBackupDataClient	
+		void AllSnapshotsSuppliedL();
+		void ReceiveSnapshotDataL(TDriveNumber aDrive, TDesC8& aBuffer, TBool aLastSection);
+		TUint GetExpectedDataSize(TDriveNumber aDrive);
+		void GetSnapshotDataL(TDriveNumber aDrive, TPtr8& aBuffer, TBool& aFinished);
+		void InitialiseGetBackupDataL(TDriveNumber aDrive);
+		void GetBackupDataSectionL(TPtr8& aBuffer, TBool& aFinished);
+		void InitialiseRestoreBaseDataL(TDriveNumber aDrive);
+		void RestoreBaseDataSectionL(TDesC8& aBuffer, TBool aFinished);
+		void InitialiseRestoreIncrementDataL(TDriveNumber aDrive);
+		void RestoreIncrementDataSectionL(TDesC8& aBuffer, TBool aFinished);
+		void RestoreComplete(TDriveNumber aDrive);
+		void InitialiseGetProxyBackupDataL(TSecureId aSid, TDriveNumber aDrive);
+		void InitialiseRestoreProxyBaseDataL(TSecureId aSid, TDriveNumber aDrive);
+		void TerminateMultiStageOperation();
+		TUint GetDataChecksum(TDriveNumber aDrive);	
+		
+		// to validate successful BUR
+		TUint64 CheckSumL(const RFile64 &aOpenFile) const;
+		
+		// for debug
+		//void SetConsole(CConsoleBase *aConsole);
+	private:
+		CSqlBackupClient(MSqlSrvBurInterface *aInterface);
+		void ConstructL();
+		
+		// active object methods
+		void RunL();
+		void DoCancel();
+		TInt RunError(TInt aError);
+		
+		// used to determine what the BUR status is and to respond as required
+		void TestBurStatusL();
+	
+		// this is used to ask the SQL server for a list of databases to backup
+		// we ask the database server because the decision to backup is not
+		// only based on the UID but also the database backup flag stored in
+		// the database metadata - and we don't want to have to know how that
+		// is implemented
+		void GetBackupListL(TSecureId aSid);
+		void CopyBufData(const TDesC8& aInBuf, TInt& aInBufReadPos, TDes& aOutBuf, TInt aDataLen);
+		
+	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
+			};
+			
+		CActiveBackupClient *iActiveBackupClient;
+		RProperty iProperty;
+		MSqlSrvBurInterface *iInterface; // the SQL server
+		RArray<TParse> iFileList; // which is populated by the SQL server
+		RFile64 iFile;
+		TInt iFileIndex;
+		TUint iState;
+		HBufC* iBuffer; // used for the header data
+		TInt iHeaderSent; // how many header bytes sent so far
+		TUint32 iChecksum; // used by restore
+		TInt64 iFileSize; // used by restore
+		TUint32 iFileNameSize; // used by restore
+		TBool iAnyData; // set to true if the restore actually sends any data to us
+		TSecureId iSid; // the sid being backed up/restored
+
+	};
+
+#endif // __SQLBUR_H__