layouts/cdl/CdlServer/inc/CdlSFiles.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:53:51 +0300
branchRCL_3
changeset 100 9dbe1b043bea
parent 0 05e9090e2422
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* Copyright (c) 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 CDLSFILES
#define CDLSFILES

#include <CdlDllWatcher.h>

/**
* A collection of CDir objects.
*/
class CCdlDirs : public CArrayPtrFlat<CDir>
	{
public:
	CCdlDirs();
	~CCdlDirs();
	};

/**
* Mixin interface for objects that want to observe activity in the file system watcher
*/
class MFsWatcherObserver
	{
public:
	virtual void NewDirsList(CCdlDirs* aNewDirs) = 0;
	};

/**
* The file system watcher active object.
* This watches the ?:\system\cdl directories for changes in the available CDL DLLs.
*/
class CFsWatcher : public CActive
	{
public:
	CFsWatcher(RFs& aFs, MFsWatcherObserver& aObserver);
	~CFsWatcher();
	void ConstructL();

	CCdlDirs* CreateDirsListL() const;

private:
	void DoCancel();
	void RunL();
	void DoRunL();
	void Queue();

private:
	RFs& iFs;
	MFsWatcherObserver& iObserver;
	};


/**
* Self driven active object that maintains a list of the currently available CDL DLLs.
* It trickles changes in this set of DLLs to it's observer. This is done one DLL at a time
* to avoid hanging up the server on a long running scan of all CDL DLLs.
*/
class CCdlDllsWatcher : public CCdlDllsWatcherBase, MFsWatcherObserver
	{
public:
	CCdlDllsWatcher(RFs& aFs, MCdlDllsObserver* aObserver);
	~CCdlDllsWatcher();
	void ConstructL();

private: // from CActive
	void DoCancel();
	void RunL();

private: // from MFsWatcherObserver
	void NewDirsList(CCdlDirs* aNewDirs);

private:
	void DoRunL();
	void Queue();

	void StartTellingObserverIfNecessaryL();
	void AddNewToObserverL();
	void RemoveCurrentFromObserverL();

private: // from CCdlDllsWatcherBase
	TInt IsPluginInRom(const TDesC& aFileName, TBool& aIsInRom) const;

private:
	class TDllList
		{
	public:
		// List functions.
		// These functions iterate all the DLLs in name order.
		// Drive order is ignored, except when the same name appears in more
		// than one drive, when CDL drive priority rules are observed.
		void Reset();
		const TEntry& Current() const;
		TBool AtEnd() const;
		void Next();

		// Current entry comparison operators.
		// These compare the current entry for two DLL lists by name then 
		// date modified.
		TBool operator==(const TDllList& aRhs) const;
		TBool operator<(const TDllList& aRhs) const;

	private:
		void SetCurrent();

	public:
		CCdlDirs* iDirs;			// not owned
		TInt iIndices[KMaxDrives];
		const TEntry* iCurrent;
		};

	TDllList iCurrent;				// .iDirs is owned
	TDllList iNew;					// .iDirs is owned
	CCdlDirs* iNext;				// owned, temporary storage for new dirs list while processing on-going
	TBool iTellingObserver;
	MCdlDllsObserver* iObserver;
	CFsWatcher* iFsWatcher;			// owned
	};

#endif