// VPROP.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//
 
#if !defined(__VPROPERTY_H__)
#define __VPROPERTY_H__

#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#if !defined(__BADESCA_H__)
#include <badesca.h>
#endif

#if !defined(__VUID_HRH__)
#include "vuid.h"
#endif

#if !defined(__VTOKEN_H__)
#include "vtoken.h"
#endif

#if !defined(__S32STRM_H__)
#include <s32strm.h>
#endif

//
// CParserParam
//

class CParserParam : public CBase
	{
public:
	IMPORT_C static CParserParam* NewL(const TDesC& aName,const TDesC* aValue);
	IMPORT_C ~CParserParam();
	IMPORT_C void SetValueL(const TDesC& aValue);
	IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
	IMPORT_C TPtrC Name() const;
	IMPORT_C TPtrC Value() const;
private:
	CParserParam(HBufC* aName,HBufC* aValue);
private:
	HBufC* iParamName;
	HBufC* iValue;
	};

//
// TVersitDateTime
//

class TVersitDateTime
	{
public:
	enum TRelativeTime
		{EIsUTC,EIsVCardLocal,EIsMachineLocal,EIsCorrect};
	IMPORT_C TVersitDateTime(const TDateTime& aDateTime,TRelativeTime aRelativeTime);
public:
	TDateTime iDateTime;
	TRelativeTime iRelativeTime;
	};

//
// CParserPropertyValue
//

class CParserPropertyValue : public CBase
	{
public:	
	IMPORT_C virtual void ExternalizeL(RWriteStream& aStream,const TUid& aEncodingUid)=0;
	IMPORT_C virtual void EncodeL(CBufFlat* aValue,const TUid& aEncoding) const;
	IMPORT_C virtual TBool SupportsInterface(const TUid& /*aInterfaceUid*/) const;
	inline TUid Uid() const;
protected:
	IMPORT_C void FoldEncodeAndWriteValueToStreamL(RWriteStream& aStream,const TDesC& aValue,const TUid& aEncodingUid) const;
	IMPORT_C CParserPropertyValue(const TUid& aPropertyValueUid);
private:
	TUid iPropertyValueUid;
	};

//
// CParserTimePropertyValue
//

class CVersitDaylight;

class CParserTimePropertyValue : public CParserPropertyValue
	{
public:
	IMPORT_C virtual void ConvertAllDateTimesToUTCL(const TTimeIntervalSeconds& aIncrement,const CVersitDaylight* aDaylight)=0;
	IMPORT_C virtual void ConvertAllUTCDateTimesToMachineLocalL(const TTimeIntervalSeconds& aIncrement)=0;
public: //from CParserPropertyValue
	IMPORT_C virtual TBool SupportsInterface(const TUid& aInterfaceUid) const;
protected:
	IMPORT_C CParserTimePropertyValue(const TUid& aPropertyValueUid);
	IMPORT_C void ConvertDateTime(TDateTime* aDateTime,const TTimeIntervalSeconds& aIncrement,const CVersitDaylight* aDaylight);		
	IMPORT_C TDesC8* EncodeVersitDateTimeL(const TVersitDateTime& aDateTime,TBool aEncodeTime=ETrue) const;
	IMPORT_C TDesC8* EncodeTimePeriodL(const TTime& aTimePeriod) const;
	};

//
//  CParserPropertyValueHBufC
//

class CParserPropertyValueHBufC : public CParserPropertyValue
	{	
public:
	IMPORT_C CParserPropertyValueHBufC(const TDesC& aValue);

	IMPORT_C static CParserPropertyValueHBufC* NewL(const TDesC& aValue);
	IMPORT_C static CParserPropertyValueHBufC* NewLC(const TDesC& aValue);
	IMPORT_C ~CParserPropertyValueHBufC();
	IMPORT_C TPtrC Value() const;	
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& aEncodingUid);
private:
	CParserPropertyValueHBufC();
	void ConstructL(const TDesC& aValue);
protected:
	HBufC* iValue;
	};

//
//  CParserPropertyValueCDesCArray
//

class CParserPropertyValueCDesCArray : public CParserPropertyValue
	{
public:
	IMPORT_C CParserPropertyValueCDesCArray(CDesCArray* aValue);
	IMPORT_C ~CParserPropertyValueCDesCArray();
	inline CDesCArray* Value() const;
	IMPORT_C TBool IsPresent(const TDesC& aValue) const;
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& aEncodingUid);
protected:
	CDesCArray* iValue;
	};

//
// CParserPropertyValueTimeZone
//

class CParserPropertyValueTimeZone: public CParserPropertyValue
	{
public:
	IMPORT_C CParserPropertyValueTimeZone(TTimeIntervalSeconds* aValue);
	IMPORT_C ~CParserPropertyValueTimeZone();
	inline TTimeIntervalSeconds* Value() const;
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& /*aEncodingUid*/);
protected:
	TTimeIntervalSeconds* iValue;
	};

//
// CVersitDaylight
//

class CVersitDaylight
	{
public:
	IMPORT_C CVersitDaylight(TBool aSavings,TTimeIntervalSeconds* aOffset,TVersitDateTime* aStartTime,TVersitDateTime* aEndTime,const TDesC& aStandardDesignation,const TDesC& aDaylightDesignation);

	IMPORT_C static CVersitDaylight* NewL(TBool aSavings, TTimeIntervalSeconds* aOffset, TVersitDateTime* aStartTime, TVersitDateTime* aEndTime, const TDesC& aStandardDesignation, const TDesC& aDaylightDesignation);
	IMPORT_C static CVersitDaylight* NewLC(TBool aSavings, TTimeIntervalSeconds* aOffset, TVersitDateTime* aStartTime, TVersitDateTime* aEndTime, const TDesC& aStandardDesignation, const TDesC& aDaylightDesignation);
	IMPORT_C ~CVersitDaylight();
private:
	CVersitDaylight(TBool aSavings, TTimeIntervalSeconds* aOffset, TVersitDateTime* aStartTime, TVersitDateTime* aEndTime);
	void ConstructL(const TDesC& aStandardDesignation, const TDesC& aDaylightDesignation);
public:	
	TBool iSavings;
	TTimeIntervalSeconds* iOffset;
	TVersitDateTime* iStartTime;
	TVersitDateTime* iEndTime;
	HBufC* iStandardDesignation;
	HBufC* iDaylightDesignation;
	};

//
// CParserPropertyValueDaylight
//

class CParserPropertyValueDaylight : public CParserTimePropertyValue
	{
public:
	IMPORT_C CParserPropertyValueDaylight(CVersitDaylight* aValue);
	IMPORT_C ~CParserPropertyValueDaylight();
	inline CVersitDaylight* Value() const;
public: //framework
	IMPORT_C void ConvertAllDateTimesToUTCL(const TTimeIntervalSeconds& aIncrement,const CVersitDaylight* aDaylight);
	IMPORT_C void ConvertAllUTCDateTimesToMachineLocalL(const TTimeIntervalSeconds& aIncrement);
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& /*aEncodingUid*/);
private:
	CVersitDaylight* iValue;
	};

//
//  CParserPropertyValueDateTime
//

class CParserPropertyValueDateTime : public CParserTimePropertyValue
	{
public:
	IMPORT_C CParserPropertyValueDateTime(TVersitDateTime* aValue);
	IMPORT_C ~CParserPropertyValueDateTime();
	inline TVersitDateTime* Value() const;
public: //framework
	IMPORT_C void ConvertAllDateTimesToUTCL(const TTimeIntervalSeconds& aIncrement,const CVersitDaylight* aDaylight);
	IMPORT_C void ConvertAllUTCDateTimesToMachineLocalL(const TTimeIntervalSeconds& aIncrement);
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& /*aEncodingUid*/);
protected:
	TVersitDateTime* iValue;
	};

//
//  CParserPropertyValueDate
//

class CParserPropertyValueDate : public CParserTimePropertyValue
	{
public:
	IMPORT_C CParserPropertyValueDate(TVersitDateTime* aValue);
	IMPORT_C ~CParserPropertyValueDate();
	inline TVersitDateTime* Value() const;
public: // from CParserTimePropertyValue
	IMPORT_C void ConvertAllDateTimesToUTCL(const TTimeIntervalSeconds& /*aIncrement*/,const CVersitDaylight* /*aDaylight*/);
	IMPORT_C void ConvertAllUTCDateTimesToMachineLocalL(const TTimeIntervalSeconds& /*aIncrement*/);
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& /*aEncodingUid*/);
private:
	TVersitDateTime* iValue;
	};

//
//  CParserPropertyValueMultiDateTimeL
//

class CParserPropertyValueMultiDateTime : public CParserTimePropertyValue
	{
public:
	IMPORT_C CParserPropertyValueMultiDateTime(CArrayPtr<TVersitDateTime>* aValue);
	IMPORT_C ~CParserPropertyValueMultiDateTime();
	inline CArrayPtr<TVersitDateTime>* Value() const;
public: //framework
	IMPORT_C void ConvertAllDateTimesToUTCL(const TTimeIntervalSeconds& aIncrement,const CVersitDaylight* aDaylight);
	IMPORT_C void ConvertAllUTCDateTimesToMachineLocalL(const TTimeIntervalSeconds& aIncrement);
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& /*aEncodingUid*/);
protected:
	CArrayPtr<TVersitDateTime>* iValue;
	};

//
//  CParserPropertyValueInt
//

class CParserPropertyValueInt : public CParserPropertyValue
	{
public:
	IMPORT_C CParserPropertyValueInt(TInt& aValue);
	inline TInt Value() const;
public: // from CParserPropertyValue
	IMPORT_C void ExternalizeL(RWriteStream& aStream,const TUid& /*aEncodingUid*/);
protected:
	TInt iValue;
	};

//
//	CParserProperty
//

class CParserProperty : public CBase
	{
public:
	IMPORT_C CParserProperty(CParserPropertyValue* aPropertyValue,const TDesC& aName,CArrayPtr<CParserParam>* aArrayOfParams);

	IMPORT_C static CParserProperty* NewL(CParserPropertyValue* aPropertyValue, const TDesC& aName, CArrayPtr<CParserParam>* aArrayOfParams);
	IMPORT_C static CParserProperty* NewLC(CParserPropertyValue* aPropertyValue, const TDesC& aName, CArrayPtr<CParserParam>* aArrayOfParams);
	IMPORT_C ~CParserProperty();
	IMPORT_C virtual void ExternalizeL(RWriteStream& aStream);
	IMPORT_C CParserParam* Param(const TDesC& aParamName) const; // note params can only appear once
	IMPORT_C void AddParamL(CParserParam* aParam);
	IMPORT_C void DeleteParam(TDesC& aParamName);
	IMPORT_C void SetNameL(const TDesC& aName);
	IMPORT_C virtual TBool SupportsInterface(const TUid& /*aInterfaceUid*/) const;
	IMPORT_C TPtrC Name() const;
	inline CParserPropertyValue* Value() const;
protected:
	CParserProperty::CParserProperty();
	void ConstructL(const TDesC& aName);
protected:
	CParserPropertyValue* iPropertyValue;
	HBufC* iPropertyName;
	CArrayPtr<CParserParam>* iArrayOfParams;
	};

inline TUid CParserPropertyValue::Uid() const
	{return iPropertyValueUid;}
inline CDesCArray* CParserPropertyValueCDesCArray::Value() const
	{return iValue;}
inline TTimeIntervalSeconds* CParserPropertyValueTimeZone::Value() const
	{return iValue;}
inline CVersitDaylight* CParserPropertyValueDaylight::Value() const
	{return iValue;}
inline TVersitDateTime* CParserPropertyValueDateTime::Value() const
	{return iValue;}
inline CArrayPtr<TVersitDateTime>* CParserPropertyValueMultiDateTime::Value() const
	{return iValue;}
inline TInt CParserPropertyValueInt::Value() const
	{return iValue;}
inline CParserPropertyValue* CParserProperty::Value() const
	{return iPropertyValue;}

#endif
