--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothmgmt/btmgr/BTManServer/btmanserverburmgr.h Fri Apr 16 16:09:25 2010 +0300
@@ -0,0 +1,347 @@
+// Copyright (c) 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:
+// Implements backup and restore support for the Bluetooth Manager server.
+//
+
+/**
+ @file
+ @internalAll
+*/
+
+#ifndef BTMANSERVERBURMGR_H
+#define BTMANSERVERBURMGR_H
+
+#include <connect/abclient.h>
+
+#include "BTRegistryDB.h"
+
+#include "btmanserverburstatemachine.h"
+
+using namespace conn;
+
+_LIT(KBTBackupPanicCat, "BTManServer BUR Panic");
+// Used to allow state information to be encoded into a panic code.
+const TInt KBTBackupStatePanicMultiplier = 1000000;
+const TInt KBTBackupStateMultiplier = 1000;
+// Used to seperate the panic and state / event values in a panic code.
+const TInt KBTBackupStatePanicMajorDelimiter = 100000;
+const TInt KBTBackupStatePanicMinorDelimiter = 100;
+
+/**
+TBTBackupPanic - Panics that may be raised by the BUR manager
+**/
+enum TBTBackupPanic
+ {
+ EBTBURMgrAlreadyInOperation = 0, // A backup/restore event has been received during an ongoing BUR operation
+ EBTBURMgrExpectedDataMissing = 1, // An operation has found that it is missing essential data
+ EBTBURMgrBUROperationStartAlreadyNotified = 2, // An MBTNotify instance has already been told that a BUR operation has started (and has not received a corresponding BUROperationStop notification)
+ EBTBURMgrBUROperationStartNotNotified = 3, // An MBTNotify instance has been notified that a BUR operation has stopped, without receiving notification that it had started.
+
+ EBTBURMgrNoSessionAdded = 4, // No session has been registered on BTManServer for the BUR manager
+ EBTBURMgrInvalidRemoteDeviceIndex = 5, // An index for a remote device is invalid.
+ EBTBURMgrInvalidStateTransition = 6, // An attempted state transition was invalid.
+ EBTBURMgrInvalidState = 7, // Either the requested state was invalid or the current state is not valid for some operation.
+ EBTBURMgrInvalidStateIndex = 8, // A given state index is invalid.
+ EBTBURMgrMissingLocalAddress = 9, // A nonzero local address was expected but not found
+ EBTBURMgrUnexpectedMethodCall = 10, // A method was unexpectedly called
+ EBTBURMgrArraySizeMisMatch = 11, // An array does not have the expected size
+ EBTBURMgrUnknownBUREvent = 12, // An unrecognised backup or restore event was received.
+ EBTBURMgrActiveBackupClientNull = 13, // A pointer to a CActiveBackupClient instance is unexpectedly NULL
+ EBTBURMgrUnsupportedRegistryVersion = 14, // A new version of the registry is being used locally, which is not yet supported by this implementation.
+ EBTBURMgrUnexpectedRPropertyError = 15, // An RProperty::Get() call returned an error that was not expected.
+ EBTBURMgrInvalidBackupRestoreState = 16, // The masked value from the KUidBackupRestoreKey P&S key was not in the range of the TBURPartType enum.
+ EBTBURMgrDescriptorLengthTooLong = 17, // A descriptor length is greater than expected.
+ EBTBURMgrDescriptorUnexpectedLength = 18, // A descriptor length is different to what was expected.
+ };
+
+// The name of the backup file to which the BT registry will be copied to.
+_LIT(KBTManServerBackupFileName, "btregistrydb.bak");
+// The name of the restore file from which the BT registry will be restored from.
+_LIT(KBTManServerRestoreFileName, "btregistrydb.rst");
+
+// Some data range maximum values (where predefined const values are not available elsewhere)
+const TUint8 KBTBURMgrMaxGlobalSecurityValue = 0x1F; // All security options on in TBTDeviceSecurity
+const TUint8 KBTBURMgrMaxPageScanMode = 0x3; // Optional page scan mode III
+const TUint8 KBTBURMgrMaxPageScanPeriodMode = 0x2; // P2
+
+void InvalidStateTransitionPanic(TBTBURState aCurrentState, TBTBUREvent aEvent);
+
+
+class MBTBURNotify
+ {
+public:
+ /**
+ Invoked by CBTManServerBURMgr to provide notification that a backup or restore
+ operation has started.
+ **/
+ virtual void BUROperationStarted()=0;
+
+ /**
+ Invoked by CBTManServerBURMgr to provide notification that a backup or restore
+ operation has stopped.
+ **/
+ virtual void BUROperationStopped()=0;
+
+ };
+
+class CBTManServer;
+class CBTLocalAddressFetcher;
+class CBTBackupHandler;
+class CBTRestoreHandler;
+class CBTActiveBackupDataClient;
+
+NONSHARABLE_CLASS(CBTManServerBURMgr) : public CActive
+ {
+public:
+ static CBTManServerBURMgr* NewL(CBTManServer& aBTManServer, MBTBURNotify* aBURNotify, TInt aPriority=EPriorityStandard);
+ ~CBTManServerBURMgr();
+
+ void RequestBURNotification(MBTBURNotify* aBURNotify);
+ void SetLocalAddress(TBTDevAddr& aLocalAddr);
+ void RestoreFileReady();
+
+ // Implementation of normal state action
+ void HandleStateNormal();
+
+ // Implementation of backup state-specific actions.
+ void HandleStateBackupRequestL();
+ void HandleStateBackupRequestError();
+ void HandleStateBackupOngoingL();
+ void HandleStateBackupOngoingError();
+ void HandleStateBackupIgnore();
+
+ // Implementation of restore state-specific actions.
+ void HandleStateRestoreRequestL();
+ void HandleStateRestoreRequestError();
+ void HandleStateRestoreOngoingL();
+ void HandleStateRestoreOngoingError();
+ void HandleStateRestoreIgnore();
+
+ // Implementation of restore file processing state-specific actions.
+ void HandleStateProcessRestoreFileL();
+ void HandleStateProcessRestoreFileError(TInt aError);
+ void HandleStateRestoreFileProcessingComplete();
+
+ inline TInt TransitionState(TBTBUREvent aBUREvent);
+
+private:
+ CBTManServerBURMgr(CBTManServer& aBTManServer, MBTBURNotify* aBURNotify, TInt aPriority);
+ void ConstructL();
+
+ TBURPartType GetBURPartType(TInt aValue);
+
+ TBool RestoreFilePresent();
+ void CheckForRestoreFileL();
+
+ void SubscribeToBackupRestoreKey();
+ void ProcessBackupState(TBURPartType aBURStateValue);
+ TBool DoesBURAffectMeL(CActiveBackupClient& aClient);
+
+ void NotifyBUROperationStarted();
+ void NotifyBUROperationStopped();
+ void NotifyAnyBUROperationStopped();
+
+ void DeleteFile(const TDesC& fileName);
+ void DeleteBackupFile();
+ void DeleteRestoreFile();
+
+ void RenameBackupFileForRestore();
+ void UpdateLocalDeviceNameL();
+
+ // From CActive:
+ void RunL();
+ TInt RunError(TInt aError);
+ void DoCancel();
+
+private:
+ CBTManServer& iBTManServer;
+ MBTBURNotify* iBURNotify; // Does not own this object.
+
+ TBURPartType iBURState;
+
+ CActiveBackupClient* iActiveBackupClient;
+ RProperty iProperty;
+ CBTLocalAddressFetcher* iLocalAddrFetcher;
+
+ CBTManServerBURMgrStateFactory* iStateMachine;
+
+ CBTActiveBackupDataClient* iActiveBackupDataClient;
+
+ TBool iBUROperationStartNotified;
+
+ CBTBackupHandler* iBackupHandler;
+ CBTRestoreHandler* iRestoreHandler;
+
+ TBTDevAddr iLocalAddr;
+
+ };
+
+class CBTRegistryBURData;
+
+NONSHARABLE_CLASS(CBTBackupHandler) : public CBase
+ {
+public:
+ static CBTBackupHandler* NewL(CBTManServerBURMgr& aBURMgr, CBTRegistry& aRegistry);
+ ~CBTBackupHandler();
+
+ void CreateBackupFileL();
+
+private:
+ CBTBackupHandler(CBTManServerBURMgr& aBURMgr, CBTRegistry& aRegistry);
+ void ConstructL();
+
+private:
+ CBTManServerBURMgr& iBURMgr;
+ CBTRegistry& iRegistry;
+ CBTRegistryBURData* iRegistryData;
+ };
+
+NONSHARABLE_CLASS(CBTRestoreHandler) : public CBase
+ {
+public:
+ static CBTRestoreHandler* NewL(CBTManServerBURMgr& aBURMgr, CBTManServer& aManServer);
+ ~CBTRestoreHandler();
+
+ void RestoreLocalDeviceNameL();
+ void RestoreRemoteDeviceTableL(TBTDevAddr& aLocalAddr);
+
+private:
+ CBTRestoreHandler(CBTManServerBURMgr& aBURMgr, CBTManServer& aManServer);
+ void ConstructL();
+
+ void LoadRestoreDataL();
+
+ void NotifyLocalTableChange();
+ void NotifyRemoteTableChangeL(const TBTDevAddr& aAddress);
+
+private:
+ CBTManServerBURMgr& iBURMgr;
+ CBTManServer& iManServer;
+ CBTRegistryBURData* iRegistryData;
+
+ TBTDevAddr iBTLocalAddr;
+ };
+
+
+NONSHARABLE_CLASS(CBTRegistryBURData) : public CBase
+ {
+public:
+ static CBTRegistryBURData* NewL();
+ ~CBTRegistryBURData();
+
+ void WriteToStreamL(RWriteStream& aStream) const;
+ void ReadFromStreamL(RReadStream& aStream);
+
+ void ReadFromRegistryL(CBTRegistry& aRegistry);
+ TBool WriteLocalDeviceNameToRegistryL(CBTRegistry& aRegistry) const;
+ TBool WriteRemoteDeviceToRegistryL(CBTRegistry& aRegistry, TInt aDeviceIndex) const;
+
+ inline TBool HasRegistryData() const;
+
+ void GetRegistryVersionL(TUint32& aRegistryVersionMajor, TUint32& aRegistryVersionMinor) const;
+ TBool IsLocalAddressNonZeroL() const;
+ TBool IsLocalAddressEqualL(TBTDevAddr& aAddr) const;
+ TInt CountRemoteDevicesL() const;
+ const CBTDevice& GetRemoteDeviceL(TInt aDeviceIndex) const;
+ TSecureId GetRemoteDeviceEntrySidL(TInt aDeviceIndex) const;
+
+ void ClearRegistryData();
+
+private:
+ CBTRegistryBURData();
+ void ConstructL();
+
+ const TDesC8& GetLocalDeviceNameL() const;
+
+private:
+ TBool iHasRegistryData;
+
+ // Meta table:
+ TUint32 iRegistryVersionMajor;
+ TUint32 iRegistryVersionMinor;
+
+ // Persistence table
+ TBTLocalDevice* iLocalDevice;
+
+ // Remote device table:
+ CArrayFixFlat<TSecureId>* iRemoteDevicesSid;
+ CBTDeviceArray* iRemoteDevices;
+
+ };
+
+NONSHARABLE_CLASS(CBTLocalAddressFetcher) : public CActive
+ {
+public:
+ // High priority to ensure this AO fires before a client request to BTManServer
+ static CBTLocalAddressFetcher* NewL(CBTManServerBURMgr& aBURMgr, CBTRegistry& aRegistry, TInt aPriority=EPriorityHigh);
+ ~CBTLocalAddressFetcher();
+
+ void FetchLocalAddress();
+
+
+private:
+ CBTLocalAddressFetcher(CBTManServerBURMgr& aBURMgr, CBTRegistry& aRegistry, TInt aPriority);
+ void ConstructL();
+
+ void SubscribeToGetLocalDeviceAddressKey();
+ TBTDevAddr GetLocalAddressFromRegistryL();
+
+ // From CActive
+ void RunL();
+ void DoCancel();
+private:
+ CBTManServerBURMgr& iBURMgr;
+ CBTRegistry& iRegistry;
+ RProperty iProperty;
+
+ };
+
+NONSHARABLE_CLASS(CBTActiveBackupDataClient) : public CBase, public MActiveBackupDataClient
+ {
+public:
+ static CBTActiveBackupDataClient* NewL(CBTManServerBURMgr& aBURMgr);
+ ~CBTActiveBackupDataClient();
+
+ // Backup methods (not used)
+ virtual void AllSnapshotsSuppliedL();
+ virtual void ReceiveSnapshotDataL(TDriveNumber aDrive, TDesC8& aBuffer, TBool aLastSection);
+ virtual TUint GetExpectedDataSize(TDriveNumber aDrive);
+ virtual void GetSnapshotDataL(TDriveNumber aDrive, TPtr8& aBuffer, TBool& aFinished);
+ virtual void InitialiseGetBackupDataL(TDriveNumber aDrive);
+ virtual void GetBackupDataSectionL(TPtr8& aBuffer, TBool& aFinished);
+
+ // Restore methods (only the notification method RestoreComplete() is used)
+ virtual void InitialiseRestoreBaseDataL(TDriveNumber aDrive);
+ virtual void RestoreBaseDataSectionL(TDesC8& aBuffer, TBool aFinished);
+ virtual void InitialiseRestoreIncrementDataL(TDriveNumber aDrive);
+ virtual void RestoreIncrementDataSectionL(TDesC8& aBuffer, TBool aFinished);
+ virtual void RestoreComplete(TDriveNumber aDrive);
+
+ // General methods
+ virtual void TerminateMultiStageOperation();
+
+ // Test methods
+ virtual TUint GetDataChecksum(TDriveNumber aDrive);
+
+private:
+ CBTActiveBackupDataClient(CBTManServerBURMgr& aBURMgr);
+
+private:
+ CBTManServerBURMgr& iBURMgr;
+
+ };
+
+#include "btmanserverburmgr.inl"
+
+#endif //BTMANSERVERBURMGR_H