// Copyright (c) 2003-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 __THTTPHEADERVALUEVARIANT_H__
#define __THTTPHEADERVALUEVARIANT_H__
#include <http.h>
class RStringPool;
/**
* THttpHeaderValueVariant represents a value found in the header element. The value of the header element
* can be of the various datatype like integer, string and datetime hence THttpHeaderValueVariant is a container
* for them.
*
* @publishedAll
* @prototype
*/
class THttpHeaderValueVariant
{
friend class THttpHeaderParamIterator;
friend class THttpHeaderElementIterator;
friend class THttpHeaderIterator;
friend class CHttpClient;
friend class CHttpClientTransaction;
public:
/**
* Enumeration type.
*
*/
typedef enum
{
ENoType = 0x00, // No concrete datatype
EIntType = 0x01, // Integer datatype
EStrType = 0x02, // String datatype
EDateTimeType = 0x03 // Datetime datatype
}THttpVariantType;
public:
/**
* Default constructor
*/
inline THttpHeaderValueVariant();
/**
* Constructor
*/
inline THttpHeaderValueVariant(TInt aIntVariant);
inline THttpHeaderValueVariant(const TDesC8& aStrVariant);
inline THttpHeaderValueVariant(TDateTime aDateVariant);
/**
* Set the integer value
* @param aIntVariant Integer value
*/
inline void SetInt(TInt aIntVariant);
/**
* Set the string value
* @param aStrVariant String value
*/
inline void SetStr(const TDesC8& aStrVariant);
/**
* Set the datettime value
* @param aDateVariant Datettime value
*/
inline void SetDateTime(TDateTime aDateVariant);
/**
* Return the type that is represented by "this" object
*
*/
inline THttpVariantType Type() const;
/**
* Returns the contained integer. Will panic if the contained
* datatype is not an ineger
*/
inline TInt Int() const;
/**
* Returns the contained string. Will panic if the contained
* datatype is not an string
*/
inline TPtrC8 Str() const;
/**
* Returns the contained datetime value. Will panic if the contained
* datatype is not a datettime value
*/
inline TDateTime DateTime() const;
private:
THttpVariantType iVariantType;
TInt iVariantVal;
TInt iMoreSpace;
};
inline THttpHeaderValueVariant::THttpHeaderValueVariant()
: iVariantVal(0),
iVariantType(ENoType),
iMoreSpace(0)
{
}
inline THttpHeaderValueVariant::THttpHeaderValueVariant(TInt aInt)
: iVariantVal(aInt),
iVariantType(EIntType),
iMoreSpace(0)
{
}
inline THttpHeaderValueVariant::THttpHeaderValueVariant(const TDesC8& aStr)
: iVariantVal(reinterpret_cast<TInt>(const_cast<TUint8*>(aStr.Ptr()))),
iVariantType(EStrType),
iMoreSpace(aStr.Length())
{
}
inline THttpHeaderValueVariant::THttpHeaderValueVariant(TDateTime aDateTime)
: iVariantType(EDateTimeType),
iMoreSpace(0)
{
*reinterpret_cast<TTime*>(&iVariantVal) = aDateTime;
}
inline void THttpHeaderValueVariant::SetInt(TInt aInt)
{
iVariantVal = aInt;
iMoreSpace = 0;
iVariantType = EIntType;
}
inline void THttpHeaderValueVariant::SetStr(const TDesC8& aStr)
{
iVariantVal = reinterpret_cast<TInt>(const_cast<TUint8*>(aStr.Ptr()));
iMoreSpace = aStr.Length();
iVariantType = EStrType;
}
inline void THttpHeaderValueVariant::SetDateTime(TDateTime aDateTime)
{
*reinterpret_cast<TTime*>(&iVariantVal) = aDateTime;
iVariantType = EDateTimeType;
iMoreSpace = 0;
}
inline THttpHeaderValueVariant::THttpVariantType THttpHeaderValueVariant::Type() const
{
return iVariantType;
}
inline TInt THttpHeaderValueVariant::Int() const
{
__ASSERT_DEBUG(iVariantType == EIntType, User::Invariant());
return iVariantVal;
}
inline TPtrC8 THttpHeaderValueVariant::Str() const
{
__ASSERT_DEBUG(iVariantType == EStrType, User::Invariant());
TUint8* actualAddr = reinterpret_cast<TUint8*>(iVariantVal);
TPtrC8 ptr;
ptr.Set(actualAddr, iMoreSpace);
return ptr;
}
inline TDateTime THttpHeaderValueVariant::DateTime () const
{
__ASSERT_DEBUG(iVariantType == EDateTimeType, User::Invariant());
return reinterpret_cast<const TTime*>(&iVariantVal)->DateTime();
}
#endif