servicediscoveryandcontrol/pnp/test/upnp/upnpmessage/inc/CHeaders.h
changeset 0 f5a58ecadc66
--- /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 <e32base.h>
+#include <stringpool.h>
+
+
+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 <http.h>.  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<THeaderFieldNamePair> 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