// CONCNF.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__CONCNF_H__)
#define __CONCNF_H__
#if !defined(__E32STD_H__)
#include <e32base.h>
#endif
#if !defined(__F32FILE_H__)
#include <f32file.h>
#endif
#if !defined(__S32STOR_H__)
#include <s32stor.h>
#endif
#if !defined(__APMSTD_H__)
#include <apmstd.h>
#endif

class CCnaConverter : public CBase
// Holds inherent properties of a converter
// these are Uid, and the mime types it supports
	{
public:
	IMPORT_C CCnaConverter();
	IMPORT_C static CCnaConverter* NewL(TUid aUid, TDataType aFromMimeType, TDataType aToMimeType);
	IMPORT_C static CCnaConverter* NewLC(TUid aUid, TDataType aFromMimeType, TDataType aToMimeType);
	IMPORT_C static CCnaConverter* NewL(const CCnaConverter& aConverter);
	IMPORT_C static CCnaConverter* NewLC(const CCnaConverter& aConverter);
	IMPORT_C ~CCnaConverter();
	IMPORT_C void AddMimeFromL(const TDataType& aMimeType);
	IMPORT_C void AddMimeToL(const TDataType& aMimeType);
	IMPORT_C void SetUid(TUid aUid);
	IMPORT_C void InternalizeL(RReadStream& aStream);
	IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
	IMPORT_C TBool MimeFrom(const TDataType& aMimeType) const;
	IMPORT_C TBool MimeTo(const TDataType& aMimeType) const;
	IMPORT_C TInt CountFrom() const;
	IMPORT_C TInt CountTo() const;
	IMPORT_C TDataType MimeFrom(TInt aIndex) const;
	IMPORT_C TDataType MimeTo(TInt aIndex) const;
	inline TUid Uid() const {return iUid;}
private:
	void ConstructL(TDataType aFromMimeType, TDataType aToMimeType);
	TBool FindMime(const TDataType& aMimeType, const CArrayFixFlat<TDataType>& aList) const;
private:
	TUid iUid;
	CArrayFixFlat<TDataType> iMimeFrom;
	CArrayFixFlat<TDataType> iMimeTo;
	};

class CCnaConvInfoFile : public CBase
// implementation class
	{
public:
	~CCnaConvInfoFile();
	//
protected:
	void ConstructL();
protected:
	RFs iFs;
	CPersistentStore* iStore;
	CArrayPtr<CCnaConverter>* iConverters;
	};

//
// classes CCnaConvInfoFileReader and CCnaConvInfoFileWriter are collection classes
// for CCnaConverter.  
//
// Each CNF file contains CCnaConverter information for each
// available CConverterBase derived class in it's associated DLL.
// 
// In addition there may be INI files for each converter which supply run time extended
// CCnaConverter information such as additional mime types.
//

class CCnaConvInfoFileReader : public CCnaConvInfoFile
	{
public:
	IMPORT_C static CCnaConvInfoFileReader* NewLC(const TDesC& aFileName,TUid aDllUid=KNullUid);
	IMPORT_C static CCnaConvInfoFileReader* NewL(const TDesC& aFileName,TUid aDllUid=KNullUid);
	IMPORT_C TInt Count();
	IMPORT_C CCnaConverter* AtL(TInt anIndex);
	//
	IMPORT_C void RestoreL();
private:
	void RestoreConverterL(TUid aUid, const CStreamDictionary& aDict);
	void ConstructL(const TDesC& aFileName,TUid aUid);
	};


class CCnaConvInfoFileWriter : public CCnaConvInfoFile
	{
public:
	IMPORT_C static CCnaConvInfoFileWriter* NewLC(const TDesC& aFileName,TUid aUid);
	IMPORT_C static CCnaConvInfoFileWriter* NewL(const TDesC& aFileName,TUid aUid);
	IMPORT_C ~CCnaConvInfoFileWriter();
	//
	IMPORT_C void AddConverterL(const CCnaConverter& aConverter);
	//
	IMPORT_C void StoreL() const;
private:
	TStreamId StoreConverterL(const CCnaConverter& aConverter)const;
	TStreamId StoreHeaderL()const;
	void ConstructL(const TDesC& aFileName,TUid aUid);
private:
	CStoreMap* iMap;
	};

#endif