--- /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;
+ }
+