servicediscoveryandcontrol/pnp/test/upnp/Server/Flow/inc/httpmudpflow.h
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/Server/Flow/inc/httpmudpflow.h	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,234 @@
+// 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:
+// httpudpflow.h
+// @file
+// @internalComponent
+// 
+//
+
+#ifndef __HTTPMUDPFLOW_H_
+#define __HTTPMUDPFLOW_H_
+
+//System Includes
+#include <comms-infras/ss_subconnflow.h>
+#include <comms-infras/ss_flowbinders.h>
+#include <comms-infras/ss_protflow.h>
+#include<in_sock.h>
+#include<es_sock.h>
+#include <rmemchunk.h>
+
+#include "upnpflowbase.h"
+#include "cupnprequestparser.h"
+#include "upnp_cf_msgs.h"
+#include "httpudpflow.h"
+#include "ctimermappeduri.h"
+
+class CCallbackArgument;
+NONSHARABLE_CLASS ( CRecvElement ) : public CBase
+	{
+	public:
+
+	CRecvElement ( RMemChunk& aData, const TAppProtAddr& aAddr )
+	: iData ( aData ),
+	iAddr ( aAddr )
+	{
+	}
+
+	~CRecvElement ()
+		{
+		if ( !iData.IsEmpty () )
+			{
+			iData.Free ();
+			}
+		}
+	const TAppProtAddr& Address () const
+		{
+		return iAddr;
+		}
+
+	RMemChunk& Data ()
+		{
+		return 	iData;
+		}
+
+	private:
+	RMemChunk 		iData;
+	TAppProtAddr	iAddr;
+	};
+
+typedef RArray < CRecvElement* > CRecvElements;
+
+NONSHARABLE_CLASS ( CHttpMUdpFlow ) : public CUPnPFlowBase,
+						 			 public MParserObserver
+	{
+	friend class CUPnPFlowFactory;
+
+	public:
+	static CHttpMUdpFlow* NewL ( CSubConnectionFlowFactoryBase& aFactory,
+							  CUPnPProtocolIntfBase* aProtocolIntf,
+						  		const TNodeId& aSubConnId );
+	~CHttpMUdpFlow ();
+
+	private:
+	CHttpMUdpFlow ( CSubConnectionFlowFactoryBase& aFactory,
+					CUPnPProtocolIntfBase* aProtocolIntf,
+					const TNodeId& aSubConnId );
+
+	void ConstructL ();
+	protected:
+
+	// From CSubConnectionFlowBase
+	void ReceivedL ( const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage );
+
+	// From MParserObserver
+	virtual void GotHeaders ();
+	inline virtual void GotBodyData ();
+	virtual void DataParsed();
+	virtual void ParsingComplete ( RMemChunk& aExcessData );
+	virtual void ParserError ( TInt aError );
+
+	void StartFlow ( TNodeCtxId aSender );
+	void StopFlow ( TNodeCtxId aSender );
+	void ParseIfOneRecvElement ();
+	void ParseElement ();
+	void RemoveFirstRecvElement ();
+
+	TInt ValidateRequest ();
+	TInt ValidateNotifyRequest ();
+	TInt ValidateMSearchRequest ();
+
+	// This should be moved
+	TInt GetHeaderValue ( const CRequest& aResponse, TInt aFieldIndex, THTTPHdrVal& aFieldVal, const TStringTable& aTable ) const;
+	TInt GetParamValue ( const CRequest& aResponse, TInt aFieldIndex, TInt aParamIndex, THTTPHdrVal& aParamVal, const TStringTable& aTable ) const;
+	TBool IsHeaderPresent ( const CRequest& aResponse, TInt aFieldIndex, const TStringTable& aTable ) const;
+	TBool IsValidCacheControlHeader ( const CRequest& aResponse ) const;
+	TBool IsValidManHeader ( const CRequest& aResponse ) const;
+	TBool IsValidHostHeader ( CRequest& aRequest ) const;
+
+	void CreateMulticastListener ();
+
+	void NotifyClients ();
+	void HandleNotifyRequestL ();
+	static TInt HandleMSearchRequestL (  TAny* aPtr );
+	void RegisterL ( TNodeCtxId aChannelId, RMemChunk& aST, CSearchTargetArray& aArray );
+	void Unregister ( TNodeCtxId aChannelId );
+	void ReadRequestValues ( RStringF& aLocation, TInt& aMaxAge );
+	void ReadRequestValues ( RStringF& aSt, RStringF& aUsn, RStringF& aNts);
+	void ReadRequestValues ( TInt& aMaxAge, RStringF& aSt );
+private:
+	void CreateTimerEntryL( );
+	TInt AdjustedDelay( TInt aTime );
+	inline RPointerArray<CCallbackArgument>& GetArgumentArray();
+	inline RPointerArray<CTimerMappedUri>& GetTimerArray();
+	inline CSearchTargetArray& GetSearchTargetArray();
+private:
+	CUpnpRequestParser* 	iRequestParser;
+
+	CHeaderCodec* 			iCodec;
+
+	CSearchTargetArray		iSearchTargetArray;
+	CSearchTargetArray		iNotifyTargetArray;
+	RArray <TNodeCtxId>		iListenRequestors; // This array will be used untill the flow binds to
+													// UDP listener.
+	RMBufChain				iReceivedData;
+	CRequest*				iUPnPRequest; // Used for parsing the request
+	CRecvElements			iRecvElements;
+	TNodeId					iAppProtIntfId;
+
+	TBool					iIsStarted;
+	TBool					iIsLeaving;
+	TNodeCtxId				iLastLeavingClient;
+	RStringPool				iStringPool;
+	CDeltaTimer* 			iDeltaTimer;
+	RPointerArray<CTimerMappedUri> 		iTimerMappedArray;
+	RPointerArray<CCallbackArgument> 	iCallbackArray;
+	};
+
+void CHttpMUdpFlow::GotBodyData ()
+	{
+	ASSERT (0);
+	}
+RPointerArray<CCallbackArgument>& CHttpMUdpFlow::GetArgumentArray()
+	{
+	return iCallbackArray;
+	}
+RPointerArray<CTimerMappedUri>& CHttpMUdpFlow::GetTimerArray()
+	{
+	return iTimerMappedArray;
+	}
+CSearchTargetArray& CHttpMUdpFlow::GetSearchTargetArray()
+	{
+	return iSearchTargetArray;
+	}
+
+/*
+  This class holds the *This pointer of the object calling it so that the static
+  methods being called on expiry of CDeltaTimer can operate on the attributes of 
+  class
+ 
+  @internalComponent
+ */
+class CCallbackArgument: public CBase
+	{
+public:
+	static CCallbackArgument* NewL(TAny* aThis ,const TAppProtAddr& aAddress , const CSearchTarget* aStTarget);
+	inline ~CCallbackArgument();
+	inline TAny* GetThisPointer() const;
+	inline const TAppProtAddr& GetAddress() const;
+	inline const CSearchTarget* SearchTarget() const ;
+	inline void SetTimerEntry( TDeltaTimerEntry* aEntry);
+	inline const TDeltaTimerEntry* GetTimerEntry() const;
+private:
+	inline CCallbackArgument (TAny* aThis , const TAppProtAddr& aAddress , const CSearchTarget* aStTarget);
+		
+	TAny* iThisPointer;
+	TAppProtAddr iAddress;
+	const CSearchTarget* iSearchTarget;
+	TDeltaTimerEntry* iTimerEntry;
+	};
+
+/* Returns the pointer to the object it contains. */
+TAny* CCallbackArgument::GetThisPointer() const
+	{
+	return iThisPointer;
+	}
+
+const TAppProtAddr& CCallbackArgument::GetAddress() const
+	{
+	return iAddress;
+	}
+
+const CSearchTarget* CCallbackArgument::SearchTarget() const
+	{
+	return iSearchTarget;
+	}
+
+void CCallbackArgument::SetTimerEntry( TDeltaTimerEntry* aEntry)
+	{
+	iTimerEntry = aEntry;
+	}
+const TDeltaTimerEntry* CCallbackArgument::GetTimerEntry() const
+	{
+	return iTimerEntry;
+	}
+CCallbackArgument::CCallbackArgument (TAny* aThis , const TAppProtAddr& aAddress , const CSearchTarget* aStTarget):iThisPointer(aThis)
+		,iAddress( aAddress ), iSearchTarget( aStTarget )
+	{
+	
+	}
+
+CCallbackArgument::~CCallbackArgument()
+	{
+	}
+#endif // __HTTPMUDPFLOW_H