// APGICNFL.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__APGICNFL_H__)
#define __APGICNFL_H__

#if !defined (__APADEF_H__)
#include <apadef.h>
#endif
#if !defined (__APAID_H__)
#include <apaid.h>
#endif
#if !defined (__BITDEV_H__)
#include <bitdev.h>
#endif
#if !defined (__APMSTD_H__)
#include <apmstd.h>
#endif

// classes defined:
class CApaMaskedBitmap;
class CApaAppInfoFile;
class CApaAppInfoFileReader;
class CApaAppInfoFileWriter;
//
// classes referenced:
class CPersistentStore;
//

#ifdef _UNICODE
#define KUidAppInfoFile KUidAppInfoFile16
#else
#define KUidAppInfoFile KUidAppInfoFile8
#endif

const TUid KUidAppInfoFile8={268435562};
const TUid KUidAppInfoFile16={0x10003A38};

class CApaMaskedBitmap : public CFbsBitmap
	{
public:
	IMPORT_C static CApaMaskedBitmap* NewLC();
	IMPORT_C static CApaMaskedBitmap* NewL(CApaMaskedBitmap* aSourceIcon);
	//
	IMPORT_C CFbsBitmap* Mask() const;
	IMPORT_C void InternalizeL(RReadStream& aStream);
	IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
	//
	IMPORT_C ~CApaMaskedBitmap();
private:
	CApaMaskedBitmap();
	void ConstructL();
private:
	CFbsBitmap* iMask;
	};

enum TAifVersion
// The order here is important, only ever APPEND to the list
	{
	EAifVersionOriginal,
	EAifVersionAddsDataType
	};

class CApaAppInfoFile : public CBase
// implementation class
	{
public:
	~CApaAppInfoFile();
	//
protected:
	CApaAppInfoFile();
	void ConstructL();
private:
	class TCaptionHeader
		{
	public:
		void InternalizeL(RReadStream& aStream);			// internalizes the header info only
		void ExternalizeL(RWriteStream& aStream) const;		// externalizes the header info only
	public:
		TSwizzle<HBufC> iCaption;
		TLanguage iLanguage;
		};
	class TIconHeader
		{
	public:
		void InternalizeL(RReadStream& aStream);			// internalizes the header info only
		void ExternalizeL(RWriteStream& aStream) const;		// externalizes the header info only
	public:
		TSwizzle<CApaMaskedBitmap> iIcon;
		TInt iIconSideInPixels;
		};
	class TDataTypeHeader
		{
	public:
		// header info only
		void InternalizeL(RReadStream& aStream); 
		void ExternalizeL(RWriteStream& aStream) const;
	public:
		TSwizzle<TDataType> iDataType;
		TDataTypePriority iPriority;
		};
protected:
	RFs iFs;
	CPersistentStore* iStore;
	CArrayFix<TCaptionHeader>* iCaptionHeaderArray;
	CArrayFix<TIconHeader>* iIconHeaderArray;
	CArrayFix<TDataTypeHeader>* iDataTypeHeaderArray;
	TApaAppCapability iCapability;
	};


class CApaAppInfoFileReader : public CApaAppInfoFile
	{
public:
	IMPORT_C static CApaAppInfoFileReader* NewLC(const TDesC& aFileName,TUid aApplicationUid=KNullUid);
	IMPORT_C static CApaAppInfoFileReader* NewL(const TDesC& aFileName,TUid aApplicationUid=KNullUid);
	//
	IMPORT_C void Capability(TDes8& aInfo)const;
	IMPORT_C TApaAppCaption CaptionL(TLanguage aLanguage);
	IMPORT_C CApaMaskedBitmap* CreateMaskedBitmapL(TInt aIconSideInPixels); // If there are no bitmaps in the file this method leaves with KErrNotFound
	
	// Not available till ER5
	IMPORT_C void DataTypesSupportedL(CArrayFix<TDataTypeWithPriority>& aTypeList) const;
	//
	
	// utility function
	IMPORT_C static void StretchDrawL(CFbsBitmap* aSource,CFbsBitmap* aTarget,TSize aSizeInPixels);
	//
	IMPORT_C ~CApaAppInfoFileReader();
private:
	CApaAppInfoFileReader();
	void InternalizeL(RReadStream& aStream);
	void ConstructL(const TDesC& aFileName,TUid aUid);
private:
	HBufC* iDefaultCaption;
	};


class CApaAppInfoFileWriter : public CApaAppInfoFile
	{
public:
	IMPORT_C static CApaAppInfoFileWriter* NewLC(const TDesC& aFileName,TUid aApplicationUid);
	//
	IMPORT_C TInt SetCapability(const TDesC8& aInfo);
	IMPORT_C void AddCaptionL(TLanguage aLanguage,const TDesC& aCaption);
	IMPORT_C void AddIconL(const TDesC& aIconFileName);
	IMPORT_C void AddIconL(CApaMaskedBitmap& aIcon);
	
	// Not available till ER5
	IMPORT_C void AddDataTypeL(const TDataTypeWithPriority& aTypePriority);
	//
	
	IMPORT_C void StoreL();
	//
	IMPORT_C ~CApaAppInfoFileWriter();
private:
	CApaAppInfoFileWriter();
	void ExternalizeL(RWriteStream& aStream) const;
	void ConstructL(const TDesC& aFileName,TUid aUid);
private:
	CStoreMap* iMap;
	};

#endif

