servicediscoveryandcontrol/pnp/test/upnp/upnputils/src/upnp_cf_msgs.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/upnputils/src/upnp_cf_msgs.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,277 @@
+// 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:
+// UPnP-proprietary messages
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+//System Includes 
+#include <ss_glob.h>
+#include <comms-infras/metatype.h>
+#include <comms-infras/metabuffer.h>
+#include <comms-infras/ss_thread.h>
+
+
+//Local Includes
+#include "upnp_cf_msgs.h"
+#include "upnpflowbase.h"
+#include "httpserverflow.h"
+#include "httpclientflow.h"
+
+using namespace Messages;
+using namespace Factories;
+
+// UPnP Message _Signatures_ (NOT messages)
+enum EMessageTypeId 
+	{        
+    ESigParamSet			= 1,		
+    EUPnPFlow				= 2,
+    EClientFlow				= 3,
+    EServerFlow				= 4,
+    EUdpFlow				= 5,
+    ESigNumberVersionMemChunk = 6,
+    ESigNumberMemChunk		= 7,
+    ESigParamSetFlow 		= 8,
+    ESigUPnPRequestInfo		= 9,
+    ESigUPnPResponseInfo	= 10,
+    ESigUPnPSubscriptionInfo = 11,
+    ESigRMemChunkFlow      = 12,
+    ESigRMBufInt			= 13,
+    ESigSsdpInfo			= 14,
+    ESigParamSetAny			= 15,
+    ESigTUint8Size       	= 16,
+    ESigUPnPClientRequestInfo		= 17,
+    ESigUPnPSubscribeReqInfo = 18,
+    ESigUPnPEventNotifyReqInfo = 19,
+	};
+
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigParamSet, KUpnpMessagesImplementationUid, ESigParamSet )
+	REGISTER_ATTRIBUTE ( TSigParamSet, iParamSet, TMeta<CSubConExtensionParameterSet*> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TUPnPFlowQuery, KUpnpMessagesImplementationUid, EUPnPFlow )
+	REGISTER_ATTRIBUTE ( TUPnPFlowQuery, iSCPRId, TMeta<TNodeId> )
+	REGISTER_ATTRIBUTE ( TUPnPFlowQuery, iDataClientType, TMeta<TInt> )
+	REGISTER_ATTRIBUTE ( TUPnPFlowQuery, iChunkManager, TMeta<TAny*> )
+END_ATTRIBUTE_TABLE ()
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( THttpClientFlowQuery, KUpnpMessagesImplementationUid, EClientFlow )
+	REGISTER_ATTRIBUTE ( THttpClientFlowQuery, iSockAddr, TMeta<TAppProtAddr> )
+	REGISTER_ATTRIBUTE ( THttpClientFlowQuery, iClientFlags, TMeta<TInt> )
+END_ATTRIBUTE_TABLE_BASE ( TUPnPFlowQuery, EUPnPFlow )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN( THttpServerFlowQuery, KUpnpMessagesImplementationUid, EServerFlow )
+	REGISTER_ATTRIBUTE ( THttpServerFlowQuery, iUri, TMeta<TUint8*> )
+	REGISTER_ATTRIBUTE ( THttpServerFlowQuery, iLength, TMeta<TInt> )
+END_ATTRIBUTE_TABLE_BASE(TUPnPFlowQuery, EUPnPFlow)
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN( THttpUdpFlowQuery, KUpnpMessagesImplementationUid, EUdpFlow )
+END_ATTRIBUTE_TABLE_BASE(TUPnPFlowQuery, EUPnPFlow)
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN( TSigNumberVersionMemChunk, KUpnpMessagesImplementationUid, ESigNumberVersionMemChunk )
+	REGISTER_ATTRIBUTE ( TSigNumberVersionMemChunk, iStatus, TMeta<TInt> )
+	REGISTER_ATTRIBUTE ( TSigNumberVersionMemChunk, iVersion, TMeta<TVersion> )
+	REGISTER_ATTRIBUTE ( TSigNumberVersionMemChunk, iBodyData, TMeta<RMemChunk> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN( TSigNumberMemChunk, KUpnpMessagesImplementationUid, ESigNumberMemChunk )
+	REGISTER_ATTRIBUTE ( TSigNumberMemChunk, iTimeOut, TMeta<TInt> )
+	REGISTER_ATTRIBUTE ( TSigNumberMemChunk, iURN, TMeta<RMemChunk> )
+END_ATTRIBUTE_TABLE_BASE ( TSigNumberVersionMemChunk, ESigNumberVersionMemChunk )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigParamSetFlow, KUpnpMessagesImplementationUid, ESigParamSetFlow )
+	REGISTER_ATTRIBUTE ( TSigParamSetFlow, iParamSet, TMeta<CSubConExtensionParameterSet*> )
+	REGISTER_ATTRIBUTE ( TSigParamSetFlow, iFlowId, TMeta<TNodeId> )	
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigUPnPResponseInfo, KUpnpMessagesImplementationUid, ESigUPnPResponseInfo )
+	REGISTER_ATTRIBUTE ( TSigUPnPResponseInfo, iTrans, TMeta<CTransaction*> )
+	REGISTER_ATTRIBUTE ( TSigUPnPResponseInfo, iStatus, TMeta<TInt> )	
+	REGISTER_ATTRIBUTE ( TSigUPnPResponseInfo, iInfo, TMetaPtr<SMetaDataNetCtorExt> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigRMemChunkFlow, KUpnpMessagesImplementationUid, ESigRMemChunkFlow )
+	REGISTER_ATTRIBUTE ( TSigRMemChunkFlow, iMemChunk, TMeta<RMemChunk> )
+	REGISTER_ATTRIBUTE ( TSigRMemChunkFlow, iFlowId, TMeta<TNodeId> )	
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSubsribeResponseInfo, KUpnpMessagesImplementationUid, ESigUPnPSubscriptionInfo )
+	REGISTER_ATTRIBUTE ( TSubsribeResponseInfo, iSid, TMeta<RMemChunk> )
+	REGISTER_ATTRIBUTE ( TSubsribeResponseInfo, iTimeout, TMeta<TInt> )
+END_ATTRIBUTE_TABLE ()
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigSsdpInfo, KUpnpMessagesImplementationUid, ESigSsdpInfo )
+	REGISTER_ATTRIBUTE ( TSigSsdpInfo, iSsdpInfo, TMeta<TSsdpInfo> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigParamSetAny, KUpnpMessagesImplementationUid, ESigParamSetAny )
+	REGISTER_ATTRIBUTE ( TSigParamSetAny, iParamSet, TMeta<CSubConExtensionParameterSet*> )
+	REGISTER_ATTRIBUTE ( TSigParamSetAny, iPtr, TMeta<TAny*> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigTUint8Size, KUpnpMessagesImplementationUid, ESigTUint8Size )
+	REGISTER_ATTRIBUTE ( TSigTUint8Size, iPtr, TMeta<TUint8*> )
+	REGISTER_ATTRIBUTE ( TSigTUint8Size, iSize, TMeta<TInt> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigUPnPClientRequestInfo, KUpnpMessagesImplementationUid, ESigUPnPClientRequestInfo )
+	REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iRequestMethod, TMeta<TInt> )
+	REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iUri, TMeta<RMemChunk> )	
+	REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iBody, TMeta<RMemChunk> )
+	REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iInfo, TMetaPtr<SMetaDataNetCtorExt> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSubscribeRequestInfo, KUpnpMessagesImplementationUid, ESigUPnPSubscribeReqInfo )
+	REGISTER_ATTRIBUTE ( TSubscribeRequestInfo, iTimeOut, TMeta<TInt> )
+	REGISTER_ATTRIBUTE ( TSubscribeRequestInfo, iCallback, TMeta<RMemChunk> )	
+	REGISTER_ATTRIBUTE ( TSubscribeRequestInfo, iSid, TMeta<RMemChunk> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TEventNotifyRequestInfo, KUpnpMessagesImplementationUid, ESigUPnPEventNotifyReqInfo )
+	REGISTER_ATTRIBUTE ( TEventNotifyRequestInfo, iSeqKey, TMeta<TInt> )
+	REGISTER_ATTRIBUTE ( TEventNotifyRequestInfo, iSid, TMeta<RMemChunk> )
+END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid )
+
+
+DEFINE_MVIP_CTR ( TSigParamSet );
+DEFINE_MVIP_CTR ( TUPnPFlowQuery);
+DEFINE_MVIP_CTR ( THttpClientFlowQuery );
+DEFINE_MVIP_CTR ( THttpServerFlowQuery );
+DEFINE_MVIP_CTR ( THttpUdpFlowQuery );
+DEFINE_MVIP_CTR ( TSigNumberVersionMemChunk );
+DEFINE_MVIP_CTR ( TSigNumberMemChunk );
+DEFINE_MVIP_CTR ( TSigParamSetFlow );
+DEFINE_MVIP_CTR ( TSigUPnPResponseInfo );
+DEFINE_MVIP_CTR ( TSubsribeResponseInfo );
+DEFINE_MVIP_CTR ( TSigRMemChunkFlow );
+DEFINE_MVIP_CTR ( TSigSsdpInfo );
+DEFINE_MVIP_CTR ( TSigParamSetAny );
+DEFINE_MVIP_CTR ( TSigTUint8Size );
+DEFINE_MVIP_CTR ( TSigUPnPClientRequestInfo );
+DEFINE_MVIP_CTR ( TSubscribeRequestInfo );
+DEFINE_MVIP_CTR ( TEventNotifyRequestInfo );
+
+
+const TImplementationProxy SignatureImplementationTable[] = 
+	{
+	//NOTE: Entries must be sorted for the binary search to work efficiently!
+	MVIP_CTR_ENTRY ( ESigParamSet, TSigParamSet ),
+	MVIP_CTR_ENTRY ( EUPnPFlow, TUPnPFlowQuery ),
+	MVIP_CTR_ENTRY ( EClientFlow, THttpClientFlowQuery ),
+	MVIP_CTR_ENTRY ( EServerFlow, THttpServerFlowQuery ),
+	MVIP_CTR_ENTRY ( EUdpFlow, THttpUdpFlowQuery ),
+	MVIP_CTR_ENTRY ( ESigNumberVersionMemChunk, TSigNumberVersionMemChunk ),
+	MVIP_CTR_ENTRY ( ESigNumberMemChunk, TSigNumberMemChunk ),
+	MVIP_CTR_ENTRY ( ESigParamSetFlow, TSigParamSetFlow ),
+	MVIP_CTR_ENTRY ( ESigUPnPResponseInfo, TSigUPnPResponseInfo ),	
+	MVIP_CTR_ENTRY ( ESigUPnPSubscriptionInfo, TSubsribeResponseInfo ),
+	MVIP_CTR_ENTRY ( ESigRMemChunkFlow, TSigRMemChunkFlow ),
+	MVIP_CTR_ENTRY ( ESigSsdpInfo, TSigSsdpInfo ),
+	MVIP_CTR_ENTRY ( ESigParamSetAny, TSigParamSetAny ),
+	MVIP_CTR_ENTRY ( ESigTUint8Size, TSigTUint8Size ),
+	MVIP_CTR_ENTRY ( ESigUPnPClientRequestInfo, TSigUPnPClientRequestInfo ),
+	MVIP_CTR_ENTRY ( ESigUPnPSubscribeReqInfo, TSubscribeRequestInfo ),
+	MVIP_CTR_ENTRY ( ESigUPnPEventNotifyReqInfo, TEventNotifyRequestInfo ),
+	};
+
+
+/*
+Note we need to register if a message needs to carries completely new set of parameters that is not supported by 
+TCFMessage....for this refer TCFUmtsIfMessageSig in IPProtoMessages.h
+*/
+EXPORT_C void TUpnpMessage::RegisterL ( Den::CCommonWorkerThread *aWorkerThread )
+	{
+	ASSERT ( aWorkerThread );	
+	aWorkerThread->TransportGlobals().RegisterInterfaceL ( TUid::Uid( KUpnpMessagesImplementationUid), sizeof(SignatureImplementationTable) / sizeof(SignatureImplementationTable[0] ), SignatureImplementationTable );	
+	}
+
+EXPORT_C void TUpnpMessage::DeRegister ( )
+	{
+	CWorkerThread* worker = SockManGlobals::Get()->SelfWorker();
+	ASSERT ( worker );
+	worker->TransportGlobals().DeregisterInterface( TUid::Uid ( KUpnpMessagesImplementationUid ) );
+	}
+
+EXPORT_C MFactoryQuery::TMatchResult TUPnPFlowQuery::Match( TFactoryObjectInfo& aObjectInfo )
+	{
+	CUPnPFlowBase* flow = static_cast<CUPnPFlowBase*>(aObjectInfo.iInfo.iFactoryObject);
+	if( ( iDataClientType == EHttpClientFlow ) && ( flow->FlowType() == EHttpClientFlow ) )
+		{
+		return static_cast<THttpClientFlowQuery&>(*this).Compare(aObjectInfo);
+		}
+	if( ( iDataClientType == EHttpServerFlow ) && ( flow->FlowType() == EHttpServerFlow ) )
+		{
+		return static_cast<THttpServerFlowQuery&>(*this).Compare(aObjectInfo);
+		}
+	if( ( iDataClientType == EHttpUdpFlow ) && ( flow->FlowType() == EHttpUdpFlow ) )
+		{
+		return static_cast<THttpUdpFlowQuery&>(*this).Compare(aObjectInfo);
+		}
+	if( ( iDataClientType == EHttpMUdpFlow ) && ( flow->FlowType() == EHttpMUdpFlow ) )
+		{
+		return static_cast<THttpUdpFlowQuery&>(*this).Compare(aObjectInfo);
+		}
+	return MFactoryQuery::EContinue;
+	}
+
+MFactoryQuery::TMatchResult THttpServerFlowQuery::Compare( TFactoryObjectInfo& aFactoryObjectInfo )
+	{
+	CHttpServerFlow* flow = static_cast<CHttpServerFlow*>(aFactoryObjectInfo.iInfo.iFactoryObject);
+	TPtrC8 uri(iUri);
+	if(flow->Uri() == uri)
+		{
+		return MFactoryQuery::EMatch;
+		}
+	return MFactoryQuery::EContinue;
+	}
+
+MFactoryQuery::TMatchResult THttpUdpFlowQuery::Compare(TFactoryObjectInfo& /*aFactoryObjectInfo*/ )
+	{
+	return MFactoryQuery::EMatch;
+	}
+
+MFactoryQuery::TMatchResult THttpClientFlowQuery::Compare(TFactoryObjectInfo& aFactoryObjectInfo )
+	{
+	const CHttpClientFlow* flow = static_cast<const CHttpClientFlow*>(aFactoryObjectInfo.iInfo.iFactoryObject);
+	
+	// iClientFlags == ECreateNew is handled by factory, other needs to be checked here	
+ 	TInetAddr remName;
+   	flow->RemName( remName );
+  	if ( remName.Address ( ) == iSockAddr.iAddr && remName.Port ( ) ==  iSockAddr.iPort && flow->Status( ) == KErrNone )
+		{
+		return MFactoryQuery::EMatch;
+		}
+	return MFactoryQuery::EContinue;
+	}
+
+EXPORT_C SMetaDataNetCtor* SMetaDataNetCtorExt::LoadL(TPtrC8& aDes)
+	{
+	TUint8* ptr = const_cast<TUint8*> ( aDes.Ptr() );
+	TPtr8 ptr2 ( ptr, aDes.Length() );
+	RBuf8 buf;
+	buf.CreateL(aDes);
+	
+	TPtrC8 ptr3 (buf.Ptr(), buf.Length());
+	CMetaDataVirtualCtorInPlace* vctr = SockManGlobals::Get()->SelfWorker()->TransportGlobals().VirtualCtor();
+	SMetaDataNetCtor* meta = vctr->New(ptr3, ptr2);
+	TInt len = buf.Length() - ptr3.Length();
+	aDes.Set(aDes.Ptr() + len, aDes.Length() - len);
+	buf.Close();
+	return meta;
+	}
+