diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/Server/ServicePoint/src/upnpservicedeftscpractivities.cpp --- /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 +#include + + +#include + +//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 ) + + NODEACTIVITY_ENTRY ( KNoTag, TFindOrCreateUdpClientFlow, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr > ) + THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TProcessUdpClientFlowCreation, TTag ) + + NODEACTIVITY_ENTRY ( KDataClientReady, TFindOrCreateUdpServerFlow, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr > ) + THROUGH_NODEACTIVITY_ENTRY ( KNoTag, TProcessUdpServerFlowCreation, TTag ) + + 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 ) + 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, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr > ) + NODEACTIVITY_ENTRY ( KNoTag, UPnPStateMachine::TProcessServerFlowCreation, CoreNetStates::TAwaitingDataClientStarted, CUpnpRegisterRootDeviceActivity::TIconCreateOrNoTag ) + + NODEACTIVITY_ENTRY ( KCreateIconTag, CUpnpRegisterRootDeviceActivity::TCreateIconFlow, CoreNetStates::TAwaitingDataClientJoin, TErrorTagOr > ) + 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 ( 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 ( iContext.iMessage ); + + CTransaction* transaction = static_cast ( 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 ( *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 ( *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; + } +