applayerpluginsandutils/bookmarksupport/test/cenrepsrv/shrepos.h
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/test/cenrepsrv/shrepos.h	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,382 @@
+// Copyright (c) 2004-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 SHREPOS_H
+#define SHREPOS_H
+
+#include <e32base.h>
+#include "obsrvr.h"
+#include "srvres.h"
+#include "srvdefs.h"
+#include "setting.h"
+#include "clientrequest.h"
+#include "panic.h"
+#include "transstate.h"
+#include "inifile.h"
+
+typedef RPointerArray<TServerSetting> RSettingPointerArray;
+
+enum TComparison {ENotEqual, EEqual};
+enum TMergeType {EInternalizeMerge, ETransactionMerge,ERestoreMerge, ESWIUpgradeMerge, ESWIDowngradeMerge};
+
+/** Uses private inheritance, delegating only those methods that are needed, to remove the possibility
+of callers breaking invariants (such as non-repeating and strictly-increasing keys) by using
+modifiers like Append directly.
+*/
+class RSettingsArray : private RArray<TServerSetting>
+	{
+public:
+	inline RSettingsArray();
+	inline ~RSettingsArray();
+	inline TServerSetting* Find(TInt aKey) const;
+	inline TInt FindIndex(const TServerSetting& aSetting) const;
+	inline void OrderedInsertL(const TServerSetting& aEntry);
+	inline TInt OrderedInsert(const TServerSetting& aEntry);
+	inline TInt Count() const;
+	inline const TServerSetting &operator[](TInt aIndex) const;
+	inline TServerSetting &operator[](TInt aIndex);
+	inline void Remove(TInt aIndex);
+	inline void Reset();
+	inline void AdoptL(RSettingsArray& aSrc);
+	
+	inline void WriteBackupStream (RWriteStream& aStream) const;
+	inline void ExternalizeL(RWriteStream& aStream) const;
+	inline void InternalizeL(RReadStream& aStream) ;
+
+	TInt Find(TUint32 aPartialId, TUint32 aMask, RSettingPointerArray& aMatches) const;
+	static TInt Merge(RSettingPointerArray& aDst, const RSettingPointerArray& aSrc);
+	inline TBool IsDefault() const;
+	inline void SetIsDefault(TBool aIsDefault);
+#ifdef SYMBIAN_CENTRALREPOSITORY_PARANOID_CHECKING
+	void ValidateInvariantProperties() const;
+	static void ValidateInvariantProperties(const RSettingPointerArray& aPtrArray);
+#endif
+ 	TInt MergeArray(RSettingsArray& aChanges, RArray<TUint32>& aDeletedSettings, TMergeType aMergeType, TBool aKeyOnly = EFalse);
+
+private:
+	enum {KGranularity=8};
+	inline void DeleteElement(TInt aIndex);
+	inline void RemoveElement(TInt aIndex);
+	TBool iIsDefault;
+	};
+/**
+@internalTechnology
+This is a wrapper for TSecurityPolicies specified for a range of settings,
+mian purpose is to provide nice search trough the range */
+class RRangePolicyArray : public RArray<TSettingsAccessPolicy>
+	{
+public:
+	inline RRangePolicyArray();
+	inline ~RRangePolicyArray();
+	inline TSettingsAccessPolicy* Find(TInt aKey) const;
+	inline void OrderedInsertL(const TSettingsAccessPolicy& aEntry);
+
+	inline void ExternalizeL(RWriteStream& aStream) const;
+	inline void InternalizeL(RReadStream& aStream) ;
+	};
+	
+/**
+@internalTechnology
+This is a wrapper for default metadata specified for ranges of settings,
+mian purpose is to provide nice search trough the range */
+class RDefaultMetaArray : public RArray<TSettingsDefaultMeta>
+	{
+public:
+	inline RDefaultMetaArray();
+	inline ~RDefaultMetaArray();
+	inline TSettingsDefaultMeta* Find(TInt aKey) const;
+	inline void OrderedInsertL(const TSettingsDefaultMeta& aEntry);
+	inline void ExternalizeL(RWriteStream& aStream) const;
+	inline void InternalizeL(RReadStream& aStream) ;
+	};
+
+/**
+@internalTechnology
+Base class for CServerRepository and other objects that may be in transactions with the
+shared repository. Contains a double queue link so the shared repository can build a queue
+of them. In order to use transactions in the shared repository, the object needs to supply a
+CRepositoryTransactor - either itself or a member variable. This makes it possible to
+prevent one transactor from closing another's transaction.
+Stores transaction state and changes made during the transaction.
+Also stores RMessage2 while pending async start or commit, and handles its completion.
+*/
+class CRepositoryTransactor : public CBase
+	{
+	// shared repository may set private transaction state, but not derived classes
+	friend class CSharedRepository;
+public:
+
+	inline TInt TransactionState() const
+		{
+		return iTransactionState;
+		}
+	inline TInt TransactionMode() const
+		{
+		return iTransactionState & EAllTransactionModeBits;
+		}
+	inline TBool IsInTransaction() const
+		{
+		return iTransactionState != ENoTransaction;
+		}
+	inline TBool IsInActiveTransaction() const
+		{
+		// transaction is active if no bits apart from the (non-zero) mode are set
+		return (iTransactionState != ENoTransaction) && (TransactionMode() == iTransactionState);
+		}
+	inline TBool IsInActiveReadTransaction() const
+		{
+		return iTransactionState == EReadTransaction;
+		}
+	inline TBool IsInActiveConcurrentReadWriteTransaction() const
+		{
+		return (iTransactionState == EConcurrentReadWriteTransaction);
+		}
+	inline TBool IsInActiveExclusiveReadWriteTransaction() const
+		{
+		return (iTransactionState == EReadWriteTransaction);
+		}
+	inline TBool IsInActiveReadWriteTransaction() const
+		{
+		return (iTransactionState == EReadWriteTransaction)
+			|| (iTransactionState == EConcurrentReadWriteTransaction);
+		}
+	inline TBool IsInFailedTransaction() const
+		{
+		return (iTransactionState & EFailedBit) != 0;
+		}
+
+protected:
+	inline void ClearSettings()
+		{
+		iTransactionSettings.Reset();
+		}
+
+private:
+	inline void SetFailed(TInt aError, TUint32 aErrorKey)
+		{
+		// don't want to fail more than once
+		ASSERT(IsInActiveTransaction());
+		ASSERT(aError != KErrNone); // must fail for a reason
+		iTransactionState |= EFailedBit;
+		ClearSettings();
+		iTransactionResult = aError;
+		iTransactionErrorKey = aErrorKey;
+		}
+	inline void PromoteToExclusiveReadWrite()
+		{
+		ASSERT(iTransactionState == EReadTransaction);
+		iTransactionState = EReadWriteTransaction;
+		ClearSettings();
+		}
+	inline void AddToQueue(TDblQue<CRepositoryTransactor>& aTransactors, TInt aMode)
+		{
+		ASSERT(!IsInTransaction());
+		// if the following ASSERT fails, transactor is already in a queue
+		ASSERT(iLink.iNext == NULL);
+		aTransactors.AddLast(*this);
+		iTransactionState = aMode;
+		// check adding to queue in an active state
+		ASSERT(IsInActiveTransaction());
+		ClearSettings();
+		// clear failure reasons
+		iTransactionResult = KErrNone;
+		iTransactionErrorKey = KUnspecifiedKey;
+		}
+	inline void Deque()
+		{
+		ASSERT(IsInTransaction());
+		// check transactor is in a queue
+		ASSERT(iLink.iNext != NULL);
+		iLink.Deque();
+		iTransactionState = ENoTransaction;
+		ClearSettings();
+		}
+protected:
+	// derived classes are free to change transaction settings.
+	// these can be made persistent by committing write transaction
+	RSettingsArray iTransactionSettings;
+
+private:
+	// A queue link used by the CSharedRepository the CTransactor is working on
+	TDblQueLink iLink;
+	// integer encoding transaction state using definition of TTransactionState
+	TInt iTransactionState;
+	// result to be returned by commit if transaction failed earlier
+	TInt iTransactionResult;
+	// if transaction failed earlier, key or partial key involved in the original error,
+	// or KUnspecifiedKey if could not be attributed to just one.
+	TUint32 iTransactionErrorKey;
+	};
+
+class CSharedRepository : public CObservable
+	{
+	friend class CServerRepository;
+	friend class TConvToolTester;
+
+public:
+	CSharedRepository(TUid aUid);
+	~CSharedRepository();
+
+	TUid Uid() const;
+	TInt CommitChanges();
+	void CommitChangesL()
+		{
+		User::LeaveIfError(CommitChanges());
+		}
+
+	TInt CreateL(TServerSetting& s, TSettingsAccessPolicy* &aPolicy, TBool aSingleMetaFound=EFalse);
+	
+	void SetMetaDataOnRead(TServerSetting& aSetting, TBool aSingleMetaFound);
+	
+	void SetMetaDataOnCreate(TServerSetting& newSetting, TUint32 aMeta)
+		{
+		if(aMeta)
+			{
+			newSetting.SetMeta(aMeta);
+			}
+		else
+			{
+			// No metadata specified. First check for a matching "range" default
+			// metadata setting
+			TSettingsDefaultMeta *defaultMeta = iRangeMeta.Find(newSetting.Key());
+			if (defaultMeta)
+				{
+				newSetting.SetMeta(defaultMeta->GetDefaultMetadata());
+				}
+			else
+				{
+				// Range value not found, try for a repository default
+				newSetting.SetMeta(iDefaultMeta);
+				}
+			}
+		}
+
+	TInt DeleteAndPersist(TUint32 aId);
+	TInt DeleteNoPersist(TUint32 aId);
+
+	TInt ResetNoPersistL(TServerSetting& aSetting);
+	void ResetAndPersistL(TServerSetting& aSetting);
+	TInt ResetAllNoPersistL(CSharedRepository& aRepository);
+	
+	const TSecurityPolicy& GetFallbackReadAccessPolicy(TUint32 aId);
+	inline const TSecurityPolicy& GetReadAccessPolicy(const TServerSetting& aSetting);
+	inline const TSecurityPolicy& GetReadAccessPolicy(TUint32 aId);
+	inline const TSecurityPolicy& GetDefaultReadAccessPolicy();
+
+	const TSecurityPolicy& GetFallbackWriteAccessPolicy(TUint32 aId);
+	inline const TSecurityPolicy& GetWriteAccessPolicy(const TServerSetting& aSetting);
+	inline const TSecurityPolicy& GetWriteAccessPolicy(TUint32 aId);
+	inline const TSecurityPolicy& GetDefaultWriteAccessPolicy();
+
+	TSettingsAccessPolicy* GetFallbackAccessPolicy(TUint32 aId);
+															
+	inline RPointerArray<TSettingsAccessPolicy>& SinglePolicyArray();
+	
+	void CheckPolicyL(const RMessage2& msg,const TSecurityPolicy& aPolicy,
+					const char *aDiagnostic);
+
+	static TBool SinglePolicyMatchOnKey(TSettingsAccessPolicy const &aSinglePolicy, TSettingsAccessPolicy const &aSinglePolicyIndexItem);
+	static TBool CompareKeyIds(TSettingsAccessPolicy const &aSinglePolicy, TSettingsAccessPolicy const &aSinglePolicyIndexItem);
+
+	TInt StartTransaction(CRepositoryTransactor& aTransactor, TInt aMode);
+	TInt CommitTransaction(CRepositoryTransactor& aTransactor, TUint32& aKeyInfo);
+	void CancelTransaction(CRepositoryTransactor& aTransactor);
+	TInt FailTransaction(CRepositoryTransactor& aTransactor, TInt aError, TUint32 aErrorKey);
+	void FailAllTransactions(const CRepositoryTransactor* aExcludeTransactor);
+	TInt AttemptPromoteTransactionToReadWrite(CRepositoryTransactor& aTransactor);
+	inline TBool IsTransactionActive();
+
+	void	MergeL(CSharedRepository& aInstallRep, TMergeType aMergeType);
+	
+	TInt FindLocationForFileL(TCentRepLocation& aLocation,TUid aUid,const TCentRepFileType aType) const;
+	
+	TInt	InstallFileTimeStampL(TTime& aInstallFileTimeStamp);
+
+	void	HandleUpdateMergeL(TTime aInstallFileTimeStamp, CSharedRepository& aInstallRep);
+	void	HandleDeleteMergeL(CSharedRepository& aRomRep);
+	TTime	InstallTime();
+	void	SetInstallTime(TTime aInstallTime);
+
+	inline TUid Owner() {return iOwner ;} ;
+	inline void WriteBackupStream(RWriteStream& aStream) const;
+	inline void WriteDeletedSettingsStream(RWriteStream& aStream) const;
+	inline void ExternalizeL(RWriteStream& aStream) const;
+	inline void InternalizeL(RReadStream& aStream) ;
+	void ExternalizeCre(RWriteStream& aStream) const;
+	void InternalizeCreL(RReadStream& aStream) ;
+	TInt ReloadContentL(CIniFileIn& aIniFile);
+	void DoCommitChangesToIniFileL(const TDesC& aOutFileName);
+	inline void SetSize(TInt aSize);
+	inline TInt Size() const;
+
+private:
+	void 	DoCommitChangesL();
+	void	ResetContent();
+	void	RestoreConsistencyL();
+	void	DoRestoreConsistencyL();
+	TInt	ReadSettingSavePolicyL(CIniFileIn& aFile,TServerSetting& aSetting, TSettingsAccessPolicy* &aPolicy, TBool& aSingleMetaFound);
+	TInt	CreateRepositoryFromCreFileL(TCentRepLocation aLocation);
+	void	CreateRepositoryFromCreFileL(TDesC& aFilePath);
+
+	void ReleaseTransactionLock(CRepositoryTransactor& aTransactor);
+	TInt DoCommitTransactionSettings(CRepositoryTransactor& aTransactor, TUint32& aKeyInfo);
+	void SetAllDefaultMetaFlags();
+	
+private:
+	enum {KGranularity=8};
+	//RSettingsArray<TServerSetting> iSettings;
+	RSettingsArray iSettings;
+	TUid iUid;
+	TUid iOwner;
+	
+	TTime iTimeStamp ;
+	//
+	RPointerArray<TSettingsAccessPolicy> iSinglePolicies;
+	RRangePolicyArray iRangePolicies;
+	//
+	TSecurityPolicy iDefaultReadPolicy;
+	TSecurityPolicy iDefaultWritePolicy;
+	
+	TSettingsAccessPolicy iDefaultPolicy;
+	TUint32 iDefaultMeta ;
+	RDefaultMetaArray iRangeMeta ;
+	TBool iPersistsIniFileExists;
+
+	// Keep track of deleted keys so that deletions can be propagated across
+	// a Backup/Restore cycle when backup data is merged with initialisation
+	// file during restore process.
+	RArray<TUint32> iDeletedSettings ;
+
+	// all transactors in the order added
+	TDblQue<CRepositoryTransactor> iTransactors;
+	// combined read/write lock for pessimistic transactions.
+	// -1 if in EReadWriteTransaction, otherwise non-negative number of EReadTransactions.
+	TInt iPessimisticTransactionLockCount;
+	// count of active concurrent read/write transactions:
+	TInt iNumActiveConcurrentReadWriteTransactions;
+
+	//iInconsistentData data flag will be set at the beginning of CommitChangesL()
+	//and reset at the end of it. The flag is used to implement lazy-load approach for the
+	//repository - if CommitChangesL() fails, the in-memory representation of the repository 
+	//won't match the updated by CommitChangesL() repository (ini) file. The repository
+	//consistency has to be restored before any next call of CSharedRepository methods.
+	TBool iInconsistentData;
+	
+	TInt32 iSize; //approximate size(in memory) of the repository after internalisation
+	};
+
+#include "shrepos.inl"
+
+#endif // SHREPOS_H