sysstatemgmt/systemstatemgr/cmd/inc/ssmcommandlistresourcereaderimpl.h
changeset 0 4e1aa6a622a0
child 3 a811597961f0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/cmd/inc/ssmcommandlistresourcereaderimpl.h	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,191 @@
+// Copyright (c) 2007-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 __SSMCOMMANDLISTRESOURCEREADERIMPL_H__
+#define __SSMCOMMANDLISTRESOURCEREADERIMPL_H__
+
+#include <e32base.h>
+#include <f32file.h>
+
+#include <ssm/ssmstate.h>
+#include <ssm/ssmswp.h>
+#include <ssm/ssmcmd.hrh>
+#include <barsread2.h>
+
+class CResourceFile;
+class MSsmConditionalCallback;
+class MSsmCommandList;
+
+/** Private implementation of CSsmCommandListResourceReader.
+
+@internalComponent
+*/
+NONSHARABLE_CLASS(CSsmCommandListResourceReaderImpl) : public CBase
+	{
+public:
+	static CSsmCommandListResourceReaderImpl* NewL(RFs& aFs, const TDesC& aCommandListPath, MSsmConditionalCallback& aConditionalCallback);
+	~CSsmCommandListResourceReaderImpl();
+
+	void Initialise(TRequestStatus& aStatus);
+	void InitialiseCancel();
+	void PrepareCommandList(MSsmCommandList& aCommandList, TInt aCommandListId, const TSsmState& aState, TRequestStatus& aStatus);
+	void PrepareCommandList(MSsmCommandList& aCommandList, TInt aCommandListId, const TSsmSwp& aSwp, TRequestStatus& aStatus);
+	void PrepareCommandListCancel();
+	TBool IsCommandListReady() const;
+	TBool Busy() const;
+	void GetCommandListIdsL(RArray<TInt>& aArray) const;
+	
+private:
+	enum TInternalAction
+		{
+		EIdle,
+		EInitialiseFirstStep,
+		EInitialiseNextStep,
+		EInitialiseSysDriveStep,
+		EPrepareFirstStep,
+		EPrepareNextStep
+		};
+
+	NONSHARABLE_CLASS(TMapping)
+		{
+	public:
+		TMapping(TInt aCommandListId, TInt aResourceId, CResourceFile* aResourceFile) : iCommandListId(aCommandListId), iResourceId(aResourceId), iResourceFile(aResourceFile) {}
+		TInt iCommandListId;	//this should always be the first member data
+		TInt iResourceId;
+		CResourceFile* iResourceFile;	// CSsmCommandListResourceReaderImpl takes the ownership
+		};
+
+	NONSHARABLE_CLASS(CResourcePool) : public CBase
+		{
+	public:
+		CResourcePool();
+		~CResourcePool();
+		TBool IsEmpty() const;
+		void Reset();
+		void AppendL(const CResourceFile* aResourceFile);
+		void AppendL(const TDesC& aFileName);
+		void AppendL(const TMapping& aMapping);
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+		void UpdateMappingArrayL(TInt aCommandListId, RArray<TMapping>& aMappingArray) const;
+#else
+		TMapping MappingL(TInt aCommandListId) const;
+#endif	//SYMBIAN_SSM_FLEXIBLE_MERGE
+		void GetCommandListIdsL(RArray<TInt>& aArray) const;
+		const TDesC& FileNameForResourceFileL(const CResourceFile* aResourceFile) const;
+
+	private:
+		RPointerArray<CResourceFile> iResourceFiles;
+		RArray<TMapping> iMappings;
+		RPointerArray<HBufC> iResourceFileNames;
+		};
+
+	NONSHARABLE_CLASS(CActiveBase) : public CActive
+		{
+	public:
+		~CActiveBase();
+	protected:
+		CActiveBase(TInt aPriority);
+		void Start();
+		void CompleteClientRequest(TInt aReason);
+	protected:
+		TRequestStatus* iRequestStatus;
+		TInternalAction iAction;
+		};
+
+	NONSHARABLE_CLASS(CInitialiser) : public CActiveBase
+		{
+	public:
+		static CInitialiser* NewL(RFs& aFs, const TDesC& aCommandListPath, CResourcePool& aResourcePool);
+		void Start(TRequestStatus& aStatus);
+		~CInitialiser();
+	private:
+		CInitialiser(RFs& aFs, CResourcePool& aResourcePool);
+		void ConstructL(const TDesC& aCommandListPath);
+		void ResetToUninitialisedState();
+		void DoInitialiseFirstStepL();
+		void DoInitialiseNextStepL();
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+		void DoInitialiseSysDriveStepL();
+#endif
+		CResourceFile* OpenResourceFileL(const TDesC& aFileName);
+		void ParseFileL(CResourceFile* aResourceFile);
+		// from CActive
+		void RunL();
+		void DoCancel();
+		TInt RunError(TInt aError);
+	private:
+		RFs& iFs;
+		RBuf iPath;
+		CResourcePool& iResourcePool;
+		CDir* iResourceFileEntries;
+		TInt iEntryIndex;
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+		RBuf iSystemDrivePath;
+		CDir* iRssFileEntriesInSysDrive;
+		TInt iSysDriveEntryIndex;
+#endif	//SYMBIAN_SSM_FLEXIBLE_MERGE
+		};
+
+	NONSHARABLE_CLASS(CPreparer) : public CActiveBase
+		{
+	public:
+		CPreparer(const CResourcePool& aResourcePool, MSsmConditionalCallback& aConditionalCallback);
+		~CPreparer();
+		void Start(MSsmCommandList& aCommandList, TInt aCommandListId, const TSsmState& aState, TRequestStatus& aStatus);
+		void Start(MSsmCommandList& aCommandList, TInt aCommandListId, const TSsmSwp& aSwp, TRequestStatus& aStatus);
+		TBool IsCommandListReady();
+	private:
+		void ResetReadyForNextPrepare();
+		void DoPrepareFirstStepL();
+		void DoPrepareNextStepL();
+		void AddCommandToListL(TSsmCommandType aType, RResourceReader& aCommandReader, TInt aConditionalInfoResourceId);
+		// from CActive
+		void RunL();
+		void DoCancel();
+		TInt RunError(TInt aError);
+	private:
+		const CResourcePool& iResourcePool;
+		MSsmConditionalCallback& iConditionalCallback;
+
+		// input parameters for current prepare operation
+		MSsmCommandList* iCommandList;	// Not owning
+		TInt iCommandListId;
+		TSsmState iState;
+		TSsmSwp iSwpChange;
+
+		// working variables for current prepare operation
+		TMapping iMapping; // mapping used for current prepare
+		RResourceReader iListReader;
+		TInt iCommandIndex;
+		TInt iBatchIndex; // number of commands left to read in current RunL
+		TBool iCommandListReady;
+#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE
+		RArray<TMapping> iMappingArray;
+		RArray<TInt> iCommandIndexInRssFile;
+		TInt iCurrentCommandListInMapping;
+#endif	//SYMBIAN_SSM_FLEXIBLE_MERGE
+		};
+
+private:
+	CSsmCommandListResourceReaderImpl();
+	void ConstructL(RFs& aFs, const TDesC& aCommandListPath, MSsmConditionalCallback& aConditionalCallback);
+
+private:
+	CResourcePool* iResourcePool;
+	CInitialiser* iInitialiser;
+	CPreparer* iPreparer;
+	};
+
+#endif // __SSMCOMMANDLISTRESOURCEREADERIMPL_H__