diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/upnputils/src/upnp_cf_msgs.cpp --- /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 +#include +#include +#include + + +//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 ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TUPnPFlowQuery, KUpnpMessagesImplementationUid, EUPnPFlow ) + REGISTER_ATTRIBUTE ( TUPnPFlowQuery, iSCPRId, TMeta ) + REGISTER_ATTRIBUTE ( TUPnPFlowQuery, iDataClientType, TMeta ) + REGISTER_ATTRIBUTE ( TUPnPFlowQuery, iChunkManager, TMeta ) +END_ATTRIBUTE_TABLE () + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( THttpClientFlowQuery, KUpnpMessagesImplementationUid, EClientFlow ) + REGISTER_ATTRIBUTE ( THttpClientFlowQuery, iSockAddr, TMeta ) + REGISTER_ATTRIBUTE ( THttpClientFlowQuery, iClientFlags, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TUPnPFlowQuery, EUPnPFlow ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN( THttpServerFlowQuery, KUpnpMessagesImplementationUid, EServerFlow ) + REGISTER_ATTRIBUTE ( THttpServerFlowQuery, iUri, TMeta ) + REGISTER_ATTRIBUTE ( THttpServerFlowQuery, iLength, TMeta ) +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 ) + REGISTER_ATTRIBUTE ( TSigNumberVersionMemChunk, iVersion, TMeta ) + REGISTER_ATTRIBUTE ( TSigNumberVersionMemChunk, iBodyData, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN( TSigNumberMemChunk, KUpnpMessagesImplementationUid, ESigNumberMemChunk ) + REGISTER_ATTRIBUTE ( TSigNumberMemChunk, iTimeOut, TMeta ) + REGISTER_ATTRIBUTE ( TSigNumberMemChunk, iURN, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSigNumberVersionMemChunk, ESigNumberVersionMemChunk ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigParamSetFlow, KUpnpMessagesImplementationUid, ESigParamSetFlow ) + REGISTER_ATTRIBUTE ( TSigParamSetFlow, iParamSet, TMeta ) + REGISTER_ATTRIBUTE ( TSigParamSetFlow, iFlowId, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigUPnPResponseInfo, KUpnpMessagesImplementationUid, ESigUPnPResponseInfo ) + REGISTER_ATTRIBUTE ( TSigUPnPResponseInfo, iTrans, TMeta ) + REGISTER_ATTRIBUTE ( TSigUPnPResponseInfo, iStatus, TMeta ) + REGISTER_ATTRIBUTE ( TSigUPnPResponseInfo, iInfo, TMetaPtr ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigRMemChunkFlow, KUpnpMessagesImplementationUid, ESigRMemChunkFlow ) + REGISTER_ATTRIBUTE ( TSigRMemChunkFlow, iMemChunk, TMeta ) + REGISTER_ATTRIBUTE ( TSigRMemChunkFlow, iFlowId, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSubsribeResponseInfo, KUpnpMessagesImplementationUid, ESigUPnPSubscriptionInfo ) + REGISTER_ATTRIBUTE ( TSubsribeResponseInfo, iSid, TMeta ) + REGISTER_ATTRIBUTE ( TSubsribeResponseInfo, iTimeout, TMeta ) +END_ATTRIBUTE_TABLE () + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigSsdpInfo, KUpnpMessagesImplementationUid, ESigSsdpInfo ) + REGISTER_ATTRIBUTE ( TSigSsdpInfo, iSsdpInfo, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigParamSetAny, KUpnpMessagesImplementationUid, ESigParamSetAny ) + REGISTER_ATTRIBUTE ( TSigParamSetAny, iParamSet, TMeta ) + REGISTER_ATTRIBUTE ( TSigParamSetAny, iPtr, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigTUint8Size, KUpnpMessagesImplementationUid, ESigTUint8Size ) + REGISTER_ATTRIBUTE ( TSigTUint8Size, iPtr, TMeta ) + REGISTER_ATTRIBUTE ( TSigTUint8Size, iSize, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSigUPnPClientRequestInfo, KUpnpMessagesImplementationUid, ESigUPnPClientRequestInfo ) + REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iRequestMethod, TMeta ) + REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iUri, TMeta ) + REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iBody, TMeta ) + REGISTER_ATTRIBUTE ( TSigUPnPClientRequestInfo, iInfo, TMetaPtr ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TSubscribeRequestInfo, KUpnpMessagesImplementationUid, ESigUPnPSubscribeReqInfo ) + REGISTER_ATTRIBUTE ( TSubscribeRequestInfo, iTimeOut, TMeta ) + REGISTER_ATTRIBUTE ( TSubscribeRequestInfo, iCallback, TMeta ) + REGISTER_ATTRIBUTE ( TSubscribeRequestInfo, iSid, TMeta ) +END_ATTRIBUTE_TABLE_BASE ( TSignatureBase, ESignatureVoid ) + +EXPORT_START_ATTRIBUTE_TABLE_AND_FN ( TEventNotifyRequestInfo, KUpnpMessagesImplementationUid, ESigUPnPEventNotifyReqInfo ) + REGISTER_ATTRIBUTE ( TEventNotifyRequestInfo, iSeqKey, TMeta ) + REGISTER_ATTRIBUTE ( TEventNotifyRequestInfo, iSid, TMeta ) +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(aObjectInfo.iInfo.iFactoryObject); + if( ( iDataClientType == EHttpClientFlow ) && ( flow->FlowType() == EHttpClientFlow ) ) + { + return static_cast(*this).Compare(aObjectInfo); + } + if( ( iDataClientType == EHttpServerFlow ) && ( flow->FlowType() == EHttpServerFlow ) ) + { + return static_cast(*this).Compare(aObjectInfo); + } + if( ( iDataClientType == EHttpUdpFlow ) && ( flow->FlowType() == EHttpUdpFlow ) ) + { + return static_cast(*this).Compare(aObjectInfo); + } + if( ( iDataClientType == EHttpMUdpFlow ) && ( flow->FlowType() == EHttpMUdpFlow ) ) + { + return static_cast(*this).Compare(aObjectInfo); + } + return MFactoryQuery::EContinue; + } + +MFactoryQuery::TMatchResult THttpServerFlowQuery::Compare( TFactoryObjectInfo& aFactoryObjectInfo ) + { + CHttpServerFlow* flow = static_cast(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(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 ( 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; + } +