// APGAPLST.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__APGAPLST_H__)
#define __APGAPLST_H__

#if !defined(__APAID_H__)
#include <apaid.h>
#endif
#if !defined(__APMSTD_H__)
#include <apmstd.h>
#endif

// classes defined:
class CApaAppData;
class CApaAppList;
//
// classes referenced:
class CApaMaskedBitmap;
class CApaAppInfoFileReader;
class RFs;
//

const TInt KApaMaxAppIcons=3;
const TInt KApaIconIndexSmall=0;
const TInt KApaIconIndexMedium=1;
const TInt KApaIconIndexLarge=2;

class CApaAppData : public CBase
	{
public:
	IMPORT_C TApaAppEntry AppEntry() const;
	inline TPtrC Caption() const;
	inline CApaMaskedBitmap* Icon(TInt aIconIndex) const;
	IMPORT_C void Capability(TDes8& aCapabilityBuf)const;
	inline TBool IsPresent() const;
	// ER5
	IMPORT_C TDataTypePriority DataType(const TDataType& aDataType) const;
	//
	inline void Lock();
	inline void Unlock();
private:
	static CApaAppData* NewL(const TApaAppEntry& aAppEntry,const TDesC& aDefaultAppInfoFileName,const RFs& aFs);
	CApaAppData();
	~CApaAppData();
	void ConstructL(const TApaAppEntry& aAppEntry,const TDesC& aDefaultAppInfoFileName,const RFs& aFs);
	void GetIconsL(CApaAppInfoFileReader& aAppInfoFile);
	TBool UpdateAif(const RFs& aFs,const TDesC& aDefaultAppInfoFileName);
	void GetAifDataL(const RFs& aFs,const TDesC& aDefaultAppInfoFileName);
	TBool IsPending()const;
private:
	enum { ENotPresent, ENotPresentPendingUpdate, EPresentPendingUpdate, EIsPresent, ESuperseded };
private:
	CApaMaskedBitmap* iIcon[KApaMaxAppIcons];
	HBufC* iCaption;
	HBufC* iFullName;
	TInt iIsPresent; // uses enum
	TUidType iUidType;
	TInt iReferenceCount;
	CApaAppData* iNext;
	TApaAppCapabilityBuf iCapabilityBuf;
	TApaAppEntry* iSuccessor;
	TTime iAifTimeStamp;
	CArrayFixFlat<TDataTypeWithPriority> iDataTypeArray;
private:
	friend class CApaAppList;
	};


class CApaAppList : public CBase
	{
public:
	IMPORT_C static CApaAppList* NewL(RFs& aFs,CApaAppFinder* aAppFinder); // takes ownership of aAppFinder
	//
	IMPORT_C void UpdateL();
	IMPORT_C void Purge();
	IMPORT_C TInt Count() const;
	IMPORT_C CApaAppData* FirstApp() const;
	IMPORT_C CApaAppData* NextApp(const CApaAppData* aApp) const;
	IMPORT_C CApaAppData* AppDataByUid(TUid aAppUid) const;
	IMPORT_C TInt UpdateCounter() const;
	// ER5
	IMPORT_C TUid PreferredDataHandlerL(const TDataType& aDataType) const;
	IMPORT_C void StartIdleUpdateL();
	//
	IMPORT_C ~CApaAppList();
private:
	CApaAppList(RFs& aFs,CApaAppFinder* aAppFinder);
	void UpdateNextAppL(TApaAppEntry& aAppEntry,TBool& aHasChanged);
	void SetPending(CApaAppData* aAppData);
	void SetNotFound(CApaAppData* aAppData, TBool& aHasChanged);
	static TInt IdleUpdateCallback(TAny* aObject);
	TInt IdleUpdate();
	void StopIdler();
private:
	RFs& iFs;
	CApaAppData* iAppData; // linked list of apps
	CApaAppFinder* iAppFinder;
	TInt iUpdateCounter;
	CPeriodic* iIdler;
	TApaAppEntry iCurrentApp;
	};


//
// inlines
//

inline TPtrC CApaAppData::Caption() const
	{ return *iCaption; }

inline CApaMaskedBitmap* CApaAppData::Icon(TInt aIconIndex) const
	{ return iIcon[aIconIndex]; }

inline TBool CApaAppData::IsPresent() const
	{ return iIsPresent; }

inline void CApaAppData::Lock()
	{ ++iReferenceCount; }

inline void CApaAppData::Unlock()
	{ --iReferenceCount; }

#endif
