diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/upnpmessage/inc/CHeaders.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servicediscoveryandcontrol/pnp/test/upnp/upnpmessage/inc/CHeaders.h Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,161 @@ +// Copyright (c) 2008-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 __CHEADERS_H__ +#define __CHEADERS_H__ + +#include +#include + + +class CHeaderField; +class CHeaderFieldPart; +class CHeaderFieldParam; +class CHeaderCodec; +class RHTTPHeaders; +class THTTPHdrFieldIter; +class THTTPHdrVal; + + +/** The CHeaders class provides the internal implementation of the RHTTPHeaders interface, which is + documented in . Briefly, this interface provides a unified point at which all header data + can be read and written for a given request or response. The CHeaders object is related to an + instance of a specific CHTTPTransactionCodec subclass, which is used to provide on-demand decoding + and encoding of indivual header fields. + @see RHTTPHeaders +*/ +class CHeaders : public CBase + { +friend class THTTPHdrFieldIter; +public: + + // Factory construction, given a particular codec. Ownership of the codec remains with the caller. + static CHeaders* NewL(CHeaderCodec& aCodec); + + // Destructor. Cleans up and releases resources to the system. + ~CHeaders(); + + // Creates a handle that is an abstraction of the interface + RHTTPHeaders Handle(); + +public: // methods proxied from RHTTPHeaders + + // Create or append a field part for the named field and assigned value + void SetFieldL(RStringF aFieldName, THTTPHdrVal aFieldValue); + + // Create or append a field part with parameter, for the specified field, parameter and associated values + void SetFieldL(RStringF aFieldName, THTTPHdrVal aFieldValue, + RStringF aParamName, THTTPHdrVal aParamValue); + + // Create a parameter in an exisitng part + void SetParamL(RStringF aFieldName, RStringF aParamName,THTTPHdrVal aParamValue, TInt aPartIdx); + + // Set a named field in the header to contain the supplied OTA data. Any existing header field of + // this name will be lost. + void SetRawFieldL(RStringF aFieldName, const TDesC8& aOtaFieldData, const TDesC8& aFieldSeparator); + + // Remove, entirely, the named header field from the header collection. All its parts and + // associated parameters (where they exist) are also removed + TInt RemoveField(RStringF aFieldName); + + // Remove the particular part of a field. All its parameters ,where they exist, are removed. If this is the only part + // then the header is also removed + TInt RemoveFieldPartL(RStringF aFieldName, TInt aIndex); + + + // Remove all the fields in this header collection + void RemoveAllFields(); + + // Obtain the number of parts in the named header field's value, Simple headers are created with a single part + // following one call to SetFieldL. Subsequent calls to SetFieldL create additional parts with the field exists + // already + TInt FieldPartsL(RStringF aFieldName) const; + + // Obtain the named header field's value. Optionally, the index of a part within the field + // may be specified. Parts are indexed from zero + TInt GetField(RStringF aFieldName, TInt aPartIdx, THTTPHdrVal& aHeaderValue) const; + + // Obtain an Over-The-Air representation of the named header field's value. + TInt GetRawField(RStringF aFieldName, TPtrC8& aRawFieldData) const; + + + // Obtain the value of a named parameter, associated with the named header field. An optional index to a part + // within the header field may be supplied, if not it is assumed that it is the first part + THTTPHdrVal GetParam(RStringF aFieldName, RStringF aParamName, THTTPHdrVal& aValue, TInt aPartIdx) const; + + // Access the header fields via an iterator + THTTPHdrFieldIter Fields() const; + + // Access the codec used to convert header fields between OTA and parsed format + CHeaderCodec& Codec() const; + + static const TStringTable& Table(); + +private: + + // Structure which contains the headerfield and the associated name + class THeaderFieldNamePair + { + public: + static TInt CompareFieldNames(const THeaderFieldNamePair& aField1, const THeaderFieldNamePair& aFieldName2); + public: + RStringF iFieldName; + CHeaderField* iField; + }; + + + // Constructor; stores the supplied codec pointer + CHeaders(CHeaderCodec& aCodec); + + // Utility to look up a given header name from the iFieldNames array and return its index. + TInt LocateFieldName(RStringF aHeaderName) const; + + // Looks up the given header name and returns the corresponding field if it exists; if not, a new field + // is created and returned + CHeaderField& CreateOrLookupFieldL(RStringF aHeaderName); + + // Obtains the indexed part of the named field + CHeaderFieldPart* GetFieldPartL(RStringF aFieldName, TInt aPartIdx) const; + + // Obtains the index parameter of the named field's indexed part + CHeaderFieldParam* GetFieldParameter(RStringF aFieldName, RStringF aParamName, TInt aPartIdx) const; + + // Inserts a header in the order of the name. + void DoInsertInNameOrderL(CHeaderField* aHeader, RStringF aHeaderName); + + // Deletes all fields + void PurgeFields(); + +private: + + // An array of field name pairs. Each field contains several values that is associated with a name of a field + RArray iFields; + + // The transaction codec associated with this header collection. + CHeaderCodec& iCodec; + }; + + +inline CHeaders::CHeaders(CHeaderCodec& aCodec) + : iCodec(aCodec) + { + } + +inline CHeaderCodec& CHeaders::Codec() const + { + return iCodec; + } + +#endif // CMESSAGE_H