applayerprotocols/httpexamples/cookies/example/examplecookiemanager.h
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httpexamples/cookies/example/examplecookiemanager.h	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,159 @@
+// Copyright (c) 2001-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 __EXAMPLECOOKIEMANAGER_H__
+#define __EXAMPLECOOKIEMANAGER_H__
+
+#include <http/mhttpcookiemanager.h>
+
+/** CExampleCookieManager is an example implementation of a class that provides 
+	the MHttpCookieManager interface
+
+	It is meant as an example for cookie support developers and to be used to test 
+	the MHttpCookieManager interface and the CCookieFilter
+*/
+class CExampleCookieManager: public CBase, public MHttpCookieManager
+	{
+public:
+	/** Standard CClass construction method
+	@param	aStringPool	The stringpool to use for the creation of all strings in this manager
+	@return	A pointer to a fully constructed CExampleCookieManager
+	*/
+	IMPORT_C static CExampleCookieManager* NewL(RStringPool aStringPool);
+
+	/** Standard destructor
+	*/
+	IMPORT_C ~CExampleCookieManager();
+
+	/** Store a cookie. This will get called with each cookie that is encountered in a 
+		transaction response.
+		@param	aCookie	The cookie to be stored. Ownership of aCookie is passed to this class.
+		@param	aUri	The uri that sent this cookie.  This is required to complete any
+		missing attributes of the cookie and to ensure the cookie is valid.
+		@leave KErrNoMemory If the cookie could not be appended to the array or if attributes
+		could not be added to the cookie during validation.
+	*/
+	IMPORT_C void StoreCookieL(CCookie* aCookie, const TUriC8& aUri);
+
+	/** Get the relevant cookies for a transaction
+		@param	aTransaction	The transaction containing the request for which cookies are required
+		@param	aCookieList		An array which will be filled with the cookies for aTransaction. 
+								The array should be empty when this function is called.  Ownership of
+								the cookies remains with the manager.
+		@param	aCookie2Reqd	Flag indicating whether a Cookie2 header should be added to the 
+								outgoing request headers
+	*/
+	IMPORT_C void GetCookiesL(RHTTPTransaction aTransaction, RArray<CCookie*>& aCookieList, TBool& aCookie2Reqd);
+
+	/** Return the number of cookies that the manager currently holds.  This function has been added
+		for testing purposes but could be used as part of an API to allow users to view, add, delete 
+		cookies etc.
+		@return	The number of cookies held by the manager.
+	*/
+	TInt CookieCount();
+
+private:
+	/** Standard constructor
+	@param	aStringPool	The stringpool to use for the creation of all strings in this manager
+	*/
+	CExampleCookieManager(RStringPool aStringPool);
+
+	/** Ensure that a cookie is valid for the uri which submitted it.  Also, add the 
+	domain, path and port attributes to the cookie if they are missing.
+	@param	aCookie	The cookie to be validated
+	@param	aUri	The uri which the cookie came from
+	@return	ETrue if the cookie is valid, EFalse if not
+	*/
+	TBool ValidateCookieL(CCookie& aCookie, const TUriC8& aUri);
+
+	/** Check if the specified cookie should be submitted to the specified uri based
+	on the domain attribute only
+	@param	aCookie	The cookie to be checked
+	@param	aUri	The uri which is being requested
+	@return	ETrue if the cookie domain attribute matches the uri, EFalse if not
+	*/
+	TBool CheckDomainMatch(CCookie& aCookie, const TUriC8& aUri) const;
+
+	/** Check if the specified cookie should be submitted to the specified uri based
+	on the path attribute only
+	@param	aCookie	The cookie to be checked
+	@param	aUri	The uri which is being requested
+	@return	ETrue if the cookie path attribute matches the uri, EFalse if not
+	*/
+	TBool CheckPathMatch(CCookie& aCookie, const TUriC8& aUri) const;
+
+	/** Check if the specified cookie should be submitted to the specified uri based
+	on the port attribute only
+	@param	aCookie	The cookie to be checked
+	@param	aUri	The uri which is being requested
+	@return	ETrue if the cookie port attribute matches the uri, EFalse if not
+	*/
+	TBool CheckPortMatch(CCookie& aCookie, const TUriC8& aUri) const;
+
+	/** Check if the specified cookie should be submitted to the specified uri based
+	on the secure attribute only.  If a cookie contains the secure attribute then it
+	should only be submitted to a secure uri (ie one with a scheme of https).
+	@param	aCookie	The cookie to be checked
+	@param	aUri	The uri which is being requested
+	@return	ETrue if the cookie secure attribute matches the uri, EFalse if not
+	*/
+	TBool CheckSecureMatch(CCookie& aCookie, const TUriC8& aUri) const;
+
+	/** Compares two cookies to see which has the most specific path.  Used for inserting
+	cookies in order to the array returned from GetCookiesL. A more specific path is one which
+	contains more elements. ie /home/images/holiday is more specific than /home/images.
+	This comparison is achieved by counting the number of /s in the path.
+	The strange parameter type is required because the two parameters must be const 
+	references to whatever is contained in the array (in this case CCookie*).  To achieve
+	this the format is CCookie* const & aCookie1.
+	@param	aCookie1	The first cookie to be compared
+	@param	aCookie2	The second cookie to be compared
+	@return	Positive if aCookie1 has more /s than aCookie2, 0 if equal, negative 
+	if aCookie1 has less /s aCookie2
+	*/
+	static TInt CompareCookiePaths(CCookie* const & aCookie1, CCookie* const & aCookie2);
+
+	/** Count the number of path separators (/) in a given descriptor.
+	@param	aDes	The descriptor to count the separators in
+	@return	The number of separators
+	*/
+	static TInt CountSeparators(const TDesC8& aDes);
+
+	/** Returns a descriptor which is equivalent to the input descriptor without
+	double quotes surrounding it. If the input descriptor does not have double quotes
+	surrounding it then it is returned as is.  This is required because cookie attributes 
+	can optionally be surrounded by double quotes.
+	@param	aDes	The descriptor to remove the quotes from
+	@return	Descriptor which points to the part of aDes with no quotes
+	*/
+	TPtrC8 RemoveQuotes(const TDesC8& aDes) const;
+
+private:
+	/** Array of cookies for the current session
+	*/
+	RPointerArray<CCookie> iCookies;
+
+	/** The stringpool which is used for all strings in the manager
+	*/
+	RStringPool iStringPool;
+	};
+
+inline TInt CExampleCookieManager::CookieCount()
+	{
+	return iCookies.Count();
+	}
+
+#endif //__EXAMPLECOOKIEMANAGER_H__
+