servicediscoveryandcontrol/pnp/test/upnp/Server/ServicePoint/src/upnpservicedeftscpractivities.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/Server/ServicePoint/src/upnpservicedeftscpractivities.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,334 @@
+// 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:
+// @file
+// @internalComponent
+// 
+//
+
+//System Includes
+#include <comms-infras/ss_coreprstates.h>
+#include <comms-infras/ss_corepractivities.h>
+
+
+#include <httperr.h>
+
+//Local Includes
+#include "upnpservicedeftscpractivities.h"
+#include "upnpservicedeftscprstates.h"
+#include "upnpctrlscprstates.h"
+#include "upnpstatemachine.h"
+#include "upnplog.h"
+#include "upnpdescriptionschema.h"
+
+using namespace ESock;
+using namespace MeshMachine;
+using namespace CoreActivities;
+using namespace CoreNetStates;
+using namespace CoreStates;
+using namespace UPnPServiceDefaultStates;
+using namespace UPnPServiceDefaultActivities;
+using namespace UPnPStateMachine;
+
+
+__FLOG_STMT(_LIT8(KComponent,"UPnPSPDefltScpr");)
+
+namespace UPnPServiceDefaultBindToActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY ( ECFActivityBindTo, UPnPServiceDefaultBindToRequest, TCFDataClient::TBindTo, PRActivities::CBindToActivity::NewL )
+	FIRST_NODEACTIVITY_ENTRY ( CoreNetStates::TAwaitingBindTo, PRActivities::CBindToActivity::TNoTagOrBearerReady )
+    
+    THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TStoreBindToOriginator, TNoTag )    
+    NODEACTIVITY_ENTRY ( KNoTag, CoreNetStates::TSendControlClientJoinRequest, CoreStates::TAwaitingJoinComplete, TTag<KNoTag> )
+	
+	NODEACTIVITY_ENTRY ( KNoTag, TFindOrCreateUdpClientFlow, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr<TTag<KNoTag> > )
+	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TProcessUdpClientFlowCreation, TTag<KDataClientReady> )
+	
+	NODEACTIVITY_ENTRY ( KDataClientReady, TFindOrCreateUdpServerFlow, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr<TTag<KNoTag> > )
+	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TProcessUdpServerFlowCreation, TTag<KBindToComplete> )
+	
+	LAST_NODEACTIVITY_ENTRY ( KBindToComplete, ABindingActivity::TSendBindToComplete )
+	
+	NODEACTIVITY_ENTRY ( KErrorTag, CoreNetStates::TSendClientLeavingRequestToServiceProvider, CoreStates::TAwaitingLeaveComplete, TNoTag )
+	LAST_NODEACTIVITY_ENTRY ( KNoTag, TRaiseAndClearActivityError )
+NODEACTIVITY_END ( )
+}
+
+
+// UPnP Default SCRP will only udp data client
+// unless an actual service is registered with CPR i.e UPnP root device
+namespace UPnPServiceDefaultDataClientStartActivity
+{
+DECLARE_DEFINE_NODEACTIVITY ( ECFActivityStartDataClient, UPnPServiceDefaultDataClientStart, TCFDataClient::TStart )
+    FIRST_NODEACTIVITY_ENTRY ( CoreNetStates::TAwaitingDataClientStart, TNoTag )
+    NODEACTIVITY_ENTRY ( KNoTag, UPnPServiceDefaultStates::TStartMuClient, CoreNetStates::TAwaitingDataClientStarted, TNoTag )    
+	LAST_NODEACTIVITY_ENTRY ( KNoTag, PRStates::TSendDataClientStarted )
+NODEACTIVITY_END ( )
+}
+
+namespace UPnPServiceDefaultClientLeaveActivity
+{
+DECLARE_DEFINE_NODEACTIVITY ( ECFActivityClientLeave, UPnPServiceDefaultClientLeave, TNodeSignal::TNullMessageId ) //May be waiting for both messages
+	FIRST_NODEACTIVITY_ENTRY ( CoreStates::TAwaitingClientLeave, TNoTag )
+	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, UPnPServiceDefaultStates::TProcessClientLeave, UPnPServiceDefaultStates::TNoTagOrDataClientIdle )
+	THROUGH_NODEACTIVITY_ENTRY ( KDataClientIdle, CoreNetStates::TSendDataClientIdle, TNoTag )
+	LAST_NODEACTIVITY_ENTRY ( KNoTag, TDoNothing )
+NODEACTIVITY_END ( )
+}
+
+
+namespace UPnPServiceDefaultDataClientStopActivity
+{
+DECLARE_DEFINE_NODEACTIVITY ( ECFActivityStopDataClient, UPnPServiceDefaultDataClientStop, TCFDataClient::TStop  )
+	FIRST_NODEACTIVITY_ENTRY ( CoreNetStates::TAwaitingDataClientStop, CoreNetStates::TNoTagOrDataClientsToStop )
+	
+	NODEACTIVITY_ENTRY ( CoreNetStates::KDataClientsToStop, UPnPServiceDefaultStates::TProcessDataClientStop,  CoreNetStates::TAwaitingDataClientsStopped, TNoTag )	
+	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TDoNothing, CoreNetStates::TNoTagOrUnbindOnStop )
+	
+	NODEACTIVITY_ENTRY ( CoreNetStates::KUnbind, CoreNetStates::TSendClientLeavingRequestToServiceProvider, CoreStates::TAwaitingLeaveComplete, TNoTag )
+	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, UPnPStateMachine::TDestroyDataClients, TNoTag )
+	LAST_NODEACTIVITY_ENTRY ( KNoTag, PRStates::TSendDataClientStopped )
+NODEACTIVITY_END ( )
+}
+
+
+namespace UPnPServiceDefaultDestroyActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY ( ECFActivityDestroy, UPnPServiceDefaultDestroy, TEChild::TDestroy, CoreActivities::CDestroyActivity::New )
+	FIRST_NODEACTIVITY_ENTRY ( TAwaitingDestroy, UPnPStateMachine::TBlockedByAllActivitiesStopped )
+
+	//Stop self first
+    NODEACTIVITY_ENTRY ( KNoTag, CoreNetStates::TStopSelf, CoreNetStates::TAwaitingDataClientStopped, TNoTag )
+
+ 	LAST_NODEACTIVITY_ENTRY ( KNoTag, CoreNetStates::TSendClientLeavingAndRemoveControlProvider )
+NODEACTIVITY_END()
+}
+
+
+namespace UPnPServiceDefaultRegisterRootDeviceActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY ( TUpnpMessage::EActivityRegisterRootDevice, UPnPServiceDefaultRegisterRootDevice, TUpnpMessage::TRegisterRootDevice, CUpnpRegisterRootDeviceActivity::NewL )
+    FIRST_NODEACTIVITY_ENTRY ( TAwaitingRootDeviceRegister, TNoTag )
+    
+    THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TBuildPublishAndRootDeviceInfo, TTag<KSendRequest> )
+	THROUGH_NODEACTIVITY_ENTRY ( KSendRequest, UPnPServiceDefaultStates::TSendPublishRequest, TNoTag )
+	
+	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TRegisterRootDeviceWithMuServer, TNoTag )
+	NODEACTIVITY_ENTRY ( KNoTag, UPnPServiceDefaultStates::TStartMuServer, CoreNetStates::TAwaitingDataClientStarted, TNoTag )
+	
+	NODEACTIVITY_ENTRY ( KNoTag, TCreateServerFlow<ERootDescription>, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr<TTag<KNoTag> > )
+	NODEACTIVITY_ENTRY ( KNoTag, UPnPStateMachine::TProcessServerFlowCreation, CoreNetStates::TAwaitingDataClientStarted, CUpnpRegisterRootDeviceActivity::TIconCreateOrNoTag )
+	
+	NODEACTIVITY_ENTRY ( KCreateIconTag, CUpnpRegisterRootDeviceActivity::TCreateIconFlow, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr<TTag<KIconCreatedTag> > )
+	NODEACTIVITY_ENTRY ( KIconCreatedTag, TProcessServerFlowCreation, CoreNetStates::TAwaitingDataClientStarted, CUpnpRegisterRootDeviceActivity::TIconOrNoTag )
+	
+	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TSendRootDeviceRegistered, TNoTag )
+	
+	THROUGH_NODEACTIVITY_ENTRY ( KErrorTag, TSendRootDeviceRegistered, TNoTag )
+	LAST_NODEACTIVITY_ENTRY ( KNoTag, TClearError )
+NODEACTIVITY_END ( )
+}
+
+
+namespace UPnPSerivceDefaultSearchResponseActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY ( TUpnpMessage::EActivitySearchResponse, UPnPServiceDefaultSearchResponse, TUpnpMessage::TUPnPSearchRequest, CNodeParallelActivityBase::NewL )
+	FIRST_NODEACTIVITY_ENTRY ( UPnPStateMachine::TAwaitingSearchRequest, UPnPServiceDefaultStates::TNoTagOrIgnoreTag )
+	LAST_NODEACTIVITY_ENTRY ( KNoTag, UPnPServiceDefaultStates::TSendSearchResponse )
+	LAST_NODEACTIVITY_ENTRY ( CoreStates::KIgnore, UPnPStateMachine::TDiscardSearchRequestData )
+NODEACTIVITY_END ( )
+}
+
+
+namespace UPnPSerivceDefaultDeviceRepublishActivity
+{
+DECLARE_DEFINE_NODEACTIVITY ( TUpnpMessage::EActivityDeviceRepublish, UPnPServiceDefaultDeviceRepublish, TUpnpMessage::TDeviceRepublish )
+	FIRST_NODEACTIVITY_ENTRY ( UPnPServiceDefaultStates::TAwaitingDeviceRepublish, TNoTag )
+	LAST_NODEACTIVITY_ENTRY ( KNoTag, UPnPServiceDefaultStates::TSendPublishRequest )
+NODEACTIVITY_END ( )
+}
+	
+namespace UpnpRootDeviceInfoRequestActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY ( TUpnpMessage::EActivityRequestInfo, UpnpRootDeviceInfoRequestInfo, TUpnpMessage::TUPnPRequestInfo, CUpnpRootDeviceInfoRequestActivity::NewL )
+	FIRST_NODEACTIVITY_ENTRY ( TAwaitingUpnpRequestInfo, UPnPServiceDefaultStates::TRequestOrIgnoreTag )
+	LAST_NODEACTIVITY_ENTRY ( KDescribeRequest, CUpnpRootDeviceInfoRequestActivity::TComposeAndSendRootDescription )
+	LAST_NODEACTIVITY_ENTRY ( KIconRequest, CUpnpRootDeviceInfoRequestActivity::TFindAndSendIconData )
+
+	LAST_NODEACTIVITY_ENTRY ( CoreStates::KIgnore, UPnPStateMachine::TSendIgnoreResponse )
+NODEACTIVITY_END ( )
+}
+
+
+namespace UPnPServiceDefaultActivities
+{
+DEFINE_ACTIVITY_MAP ( activityMap )
+	ACTIVITY_MAP_ENTRY ( UPnPServiceDefaultBindToActivity, UPnPServiceDefaultBindToRequest )
+	ACTIVITY_MAP_ENTRY ( UPnPServiceDefaultDataClientStartActivity, UPnPServiceDefaultDataClientStart )
+	ACTIVITY_MAP_ENTRY ( UPnPServiceDefaultClientLeaveActivity, UPnPServiceDefaultClientLeave )
+	ACTIVITY_MAP_ENTRY ( UPnPServiceDefaultDataClientStopActivity, UPnPServiceDefaultDataClientStop )
+	ACTIVITY_MAP_ENTRY ( UPnPServiceDefaultDestroyActivity, UPnPServiceDefaultDestroy )
+	ACTIVITY_MAP_ENTRY ( UPnPServiceDefaultRegisterRootDeviceActivity, UPnPServiceDefaultRegisterRootDevice )
+	ACTIVITY_MAP_ENTRY ( UPnPSerivceDefaultSearchResponseActivity, UPnPServiceDefaultSearchResponse )
+	ACTIVITY_MAP_ENTRY ( UPnPSerivceDefaultDeviceRepublishActivity, UPnPServiceDefaultDeviceRepublish )
+	ACTIVITY_MAP_ENTRY ( UpnpRootDeviceInfoRequestActivity, UpnpRootDeviceInfoRequestInfo )
+ACTIVITY_MAP_END_BASE ( SCprActivities, coreSCprActivities )
+}
+
+
+// -------------- device description request activity------------------------
+CNodeActivityBase* CUpnpRootDeviceInfoRequestActivity::NewL ( const TNodeActivity& aActivitySig, AMMNodeBase& aNode )
+	{
+	TUint activityId = GetNextActivityCountL ( aActivitySig, aNode );
+	return ( new ( ELeave ) CUpnpRootDeviceInfoRequestActivity ( aActivitySig, aNode, activityId ) );
+	}
+
+
+CUpnpRootDeviceInfoRequestActivity::CUpnpRootDeviceInfoRequestActivity ( const TNodeActivity& aActivitySig, AMMNodeBase& aNode, TUint aActivitiesCount )
+:CNodeParallelActivityBase ( aActivitySig, aNode, aActivitiesCount )
+	{	  	
+	}
+
+
+CUpnpRootDeviceInfoRequestActivity::~CUpnpRootDeviceInfoRequestActivity ( )
+	{
+	SetError ( KErrNone );
+	}
+
+
+DEFINE_SMELEMENT ( CUpnpRootDeviceInfoRequestActivity::TComposeAndSendRootDescription, NetStateMachine::MStateTransition, CUpnpRootDeviceInfoRequestActivity::TContext )
+void CUpnpRootDeviceInfoRequestActivity::TComposeAndSendRootDescription::DoL ( )
+	{
+	LOG(ESockLogExternal::Printf(KSubsysSPRootDeviceInfoReqActivity, KComponent, _L8("CUpnpRootDeviceInfoRequestActivity::TComposeAndSendRootDescription::DoL")));
+	// compose current root device description xml data.
+	CUPnPServiceConnectionProvider& ctrlProv = iContext.Node ( ).ConnectionProvider ( );
+	
+	CUPnPRootDeviceInfoContainer& container = ctrlProv.GetRootDeviceInfoContainer ( );
+	CUPnPDeviceDescription& deviceDesc = container.GetRootDeviceDesciption ( );
+    
+    CUPnPDescriptionComposer& composer =  iContext.Node ( ).DeviceDescriptionComposerL ( );
+    RBuf8 deviceXmlBuf;
+    composer.ComposeDescriptionXmlL ( &deviceDesc,CUPnPDescriptionComposer::EDevice , deviceXmlBuf );
+	
+	CleanupClosePushL ( deviceXmlBuf );
+	//Send composed xml as response body to TCP Server Flow i.e current msg sender		
+	RMemChunk bufChain;
+	bufChain.CreateL ( deviceXmlBuf, ctrlProv.MemoryAllocator() );	
+	CleanupStack::PopAndDestroy ( &deviceXmlBuf );
+	
+	TUpnpMessage::TUPnPRequestInfo& requestMsg = message_cast< TUpnpMessage::TUPnPRequestInfo > ( iContext.iMessage );
+	CTransaction* trans = static_cast<CTransaction*> ( requestMsg.iPtr );
+	trans->AddBodyPart ( bufChain );
+		
+	LOG(ESockLogExternal::Printf(KSubsysSPRootDeviceInfoReqActivity, KComponent, _L8("CUpnpRootDeviceInfoRequestActivity::TComposeAndSendRootDescription::DoL - Posting messge TUpnpMessage::TUPnPResponseInfo")));	
+	TUpnpMessage::TUPnPResponseInfo msg ( trans, HTTPStatus::EOk, NULL );
+	RClientInterface::OpenPostMessageClose ( iContext.NodeId (), iContext.iSender, msg );
+	}
+	
+DEFINE_SMELEMENT ( CUpnpRootDeviceInfoRequestActivity::TFindAndSendIconData, NetStateMachine::MStateTransition, CUpnpRootDeviceInfoRequestActivity::TContext )
+void CUpnpRootDeviceInfoRequestActivity::TFindAndSendIconData::DoL ( )
+	{
+	TUpnpMessage::TUPnPRequestInfo& requestInfoMsg = message_cast<TUpnpMessage::TUPnPRequestInfo> ( iContext.iMessage );
+	
+	CTransaction* transaction = static_cast<CTransaction*> ( requestInfoMsg.iPtr );	
+	TInt statusCode;	
+	CUPnPUtils::FindAndSendIconDataL ( transaction, statusCode, iContext.Node ( ).ConnectionProvider().MemoryAllocator() );
+	
+	TUpnpMessage::TUPnPResponseInfo msg ( transaction, statusCode, NULL );
+	RClientInterface::OpenPostMessageClose ( iContext.NodeId (), iContext.iSender, msg );
+	}
+//-------------------------Embedded Device Session Registration Activity-------------------------------------
+CNodeActivityBase* CUpnpRegisterRootDeviceActivity::NewL ( const TNodeActivity& aActivitySig, AMMNodeBase& aNode )
+	{
+	return new ( ELeave ) CUpnpRegisterRootDeviceActivity ( aActivitySig, aNode ) ;
+	}
+
+
+CUpnpRegisterRootDeviceActivity::CUpnpRegisterRootDeviceActivity ( const TNodeActivity& aActivitySig, AMMNodeBase& aNode  )
+	: CNodeActivityBase ( aActivitySig, aNode ), iIconUrlIdx ( 0 )
+	{	  	
+	}
+
+CUpnpRegisterRootDeviceActivity::~CUpnpRegisterRootDeviceActivity ( )
+	{
+	SetError ( KErrNone	);
+	iIconUrl.Close ();
+	}
+
+DEFINE_SMELEMENT ( CUpnpRegisterRootDeviceActivity::TCreateIconFlow, NetStateMachine::MStateTransition, CUpnpRegisterRootDeviceActivity::TContext )
+void CUpnpRegisterRootDeviceActivity::TCreateIconFlow::DoL ()
+	{	
+	CUpnpRegisterRootDeviceActivity& activity = static_cast<CUpnpRegisterRootDeviceActivity&> ( *iContext.iNodeActivity );
+	CUPnPServiceConnectionProvider& ctrlProv = iContext.Node ().ConnectionProvider ();
+	
+	const CUPnPDevice& device = ctrlProv.RootDevice ();    
+    CStringPoolManager& stringPoolMgr = ctrlProv.StringPoolManager ();
+	RStringPool& sp = stringPoolMgr.StringPool ();
+
+	activity.iIconUrl.Close ();
+	const TDesC8& url = device.AtIconInfoTable ( activity.iIconUrlIdx )->Property ( sp.String ( UPNPDESCRIPTIONXMLTAGS::EUrl, stringPoolMgr.GetUPnPTable () ) );
+	const TDesC8& rootLoc = ctrlProv.RootDeviceLocation ();
+	
+	if ( url[0] == TChar ('/') )
+		{
+		activity.iIconUrl.CreateL ( rootLoc.Length () + ( url.Length () - 1 ) );
+		activity.iIconUrl.Copy ( rootLoc );
+		activity.iIconUrl.Append ( url.Mid (1) );
+		}
+	else
+		{
+		activity.iIconUrl.CreateL ( rootLoc.Length () + url.Length () );
+		activity.iIconUrl.Copy ( rootLoc );
+		activity.iIconUrl.Append ( url );
+		}
+	
+	const TUint8* uriPtr = activity.iIconUrl.Ptr ();
+	TUint size = activity.iIconUrl.Size ();
+	const TUid requestedUid = { CUPnPFlowFactory::iUid };
+	THttpServerFlowQuery flowQuery ( uriPtr,
+									 size,
+									 iContext.NodeId (),
+									 EHttpServerFlow );
+	
+	ESock::TCFFactory::TFindOrCreatePeer msg ( TCFPlayerRole::EDataPlane, requestedUid, &flowQuery );
+	
+	TCFPlayerRole playerRole ( TCFPlayerRole::EDataPlane );
+	Messages::TNodeId factoryContainer = SockManGlobals::Get()->GetPlaneFC( playerRole );
+	activity.PostRequestTo( factoryContainer, msg );
+	}
+
+DEFINE_SMELEMENT ( CUpnpRegisterRootDeviceActivity::TIconCreateOrNoTag, NetStateMachine::MStateFork, CUpnpRegisterRootDeviceActivity::TContext )
+TInt CUpnpRegisterRootDeviceActivity::TIconCreateOrNoTag::TransitionTag ()
+	{
+	CUPnPServiceConnectionProvider& ctrlProv = iContext.Node ().ConnectionProvider ();
+	const CUPnPDevice& device = ctrlProv.RootDevice ();
+    
+	return device.CountOfIconInfoTable () != 0 ? KCreateIconTag : KNoTag;
+	}
+
+DEFINE_SMELEMENT ( CUpnpRegisterRootDeviceActivity::TIconOrNoTag, NetStateMachine::MStateFork, CUpnpRegisterRootDeviceActivity::TContext )
+TInt CUpnpRegisterRootDeviceActivity::TIconOrNoTag::TransitionTag ()
+	{
+	CUpnpRegisterRootDeviceActivity& activity = static_cast<CUpnpRegisterRootDeviceActivity&> ( *iContext.iNodeActivity );
+	CUPnPServiceConnectionProvider& ctrlProv = iContext.Node ( ).ConnectionProvider ( );	
+	const CUPnPDevice& device = ctrlProv.RootDevice ( );
+	
+	activity.iIconUrlIdx++;
+	if ( device.CountOfIconInfoTable () != activity.iIconUrlIdx )
+		{
+		return NetStateMachine::EBackward | KCreateIconTag;
+		}
+	
+	return NetStateMachine::EForward | KNoTag;
+	}	
+