diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/Server/ControlPoint/src/upnpctrlscprstates.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servicediscoveryandcontrol/pnp/test/upnp/Server/ControlPoint/src/upnpctrlscprstates.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,522 @@ +// 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: +// + +//System Includes +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +//Local Includes +#include "upnpctrlscprstates.h" +#include "upnpstatemachine.h" +#include "upnp_cf_msgs.h" +#include "upnpctrlscpractivities.h" +#include "upnpserverconstants.h" +#include "upnplog.h" + +using namespace ESock; +using namespace CorePanics; +using namespace UPnPControlSCprStates; +using namespace UPnPStateMachine; +using namespace PRActivities; +using namespace UPnPSearchStates; +using namespace UPnPRegisterNotifyStates; +using namespace CoreActivities; + +__FLOG_STMT(_LIT8(KComponent,"UPnPCtrlScprSts");) + +//===========================UPnP Control SCPR states and activities========================== + + +DEFINE_SMELEMENT ( TAwaitingDataClientJoin, NetStateMachine::MState, UPnPControlSCprStates::TContext ) +TBool TAwaitingDataClientJoin::Accept ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TAwaitingDataClientJoin"))); + + TCFFactory::TPeerFoundOrCreated* dcJoined = message_cast ( &iContext.iMessage ); + + if ( dcJoined ) + { + if ( iContext.iNodeActivity->Error( ) != KErrNone ) + { + RNodeInterface* clientAlreadyAdded = iContext.Node ( ).FindClient ( dcJoined->iNodeId ); + if ( clientAlreadyAdded == NULL && dcJoined->iNodeId != TNodeId::NullId ( ) ) + { + RClientInterface::OpenPostMessageClose ( iContext.NodeId (), dcJoined->iNodeId, TEChild::TDestroy ().CRef () ); + } + } + return ETrue; + } + else if ( iContext.iMessage.IsMessage ( ) ) + { + // We can't send TCancel to the factory, we better eat the message + // here and switch the activity into a cancelling mode. + iContext.iMessage.ClearMessageId ( ); + iContext.iNodeActivity->SetError( KErrCancel ); + } + else if ( iContext.iMessage.IsMessage ( ) ) + { + CUPnPActivityBase& activity = static_cast ( *iContext.iNodeActivity ); + TUpnpMessage::TCancelParamSet& msg = message_cast< TUpnpMessage::TCancelParamSet > ( iContext.iMessage ); + CUPnPRequestParamSetBase* paramSet = static_cast(msg.iParamSet); + + if ( activity.iRequestParamSet->Uri ( ).CompareF ( paramSet->Uri() ) == 0 ) + { + // We can't send TCancel to the factory, we better eat the message + // here and switch the activity into a cancelling mode. + iContext.iMessage.ClearMessageId ( ); + iContext.iNodeActivity->SetError( KErrCancel ); + + // delete cancel paramset based on type id. + STypeId metaType = activity.iRequestParamSet->GetTypeId( ); + switch ( metaType.iType ) + { + case EUPnPCancelDiscoverParamSet: + delete static_cast(paramSet); + break; + + case EUPnPCancelRegisterNotifyParamSet: + delete static_cast(paramSet); + break; + + case EUPnPCancelDescribeParamSet: + delete static_cast(paramSet); + break; + + case EUPnPCancelSubscribeParamSet: + delete static_cast(paramSet); + break; + + default: + break; + } + paramSet = NULL; + } + } + + return EFalse; + } + + +DEFINE_SMELEMENT ( TStoreRequestParams, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TStoreRequestParams::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TStoreRequestParams"))); + +#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW + TCFScpr::TSetParamsRequest* setParamsRequest = message_cast( &iContext.iMessage ); +#else + TCFScpr::TParamsRequest* setParamsRequest = message_cast( &iContext.iMessage ); +#endif //SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW + ASSERT ( setParamsRequest ); + + //Extract the parambundle from the request message. + if ( !setParamsRequest->iFamilyBundle.IsNull() ) + { + HBufC8* buf = HBufC8::NewL ( setParamsRequest->iFamilyBundle.Length() ); + TPtr8 bufPtr ( buf->Des() ); + + setParamsRequest->iFamilyBundle.Store ( bufPtr ); + iContext.Node().iRequestBundle.LoadL ( bufPtr ); + delete buf; + } + } + + +DEFINE_SMELEMENT ( TSendRequestParamResponse, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TSendRequestParamResponse::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TSendRequestParamResponse"))); + + if ( iContext.Node().iRequestBundle.GetFamilyAtIndex (0).Id () == EUPnPClearParamSet ) + { + iContext.Node().iResponseBundle.Close (); // DEF126893 fix pending + iContext.Node().iResponseBundle.CreateL (); + iContext.Node().iResponseBundle.Open (); + } +#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW + RClientInterface::OpenPostMessageClose ( iContext.NodeId (), iContext.iSender, TCFScpr::TSetParamsResponse ( iContext.Node().iResponseBundle ).CRef () ); +#else + RClientInterface::OpenPostMessageClose ( iContext.NodeId (), iContext.iSender, TCFScpr::TParamsResponse ( iContext.Node().iResponseBundle ).CRef () ); +#endif //SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW + + } + +DEFINE_SMELEMENT ( TInitiateActivities, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TInitiateActivities::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TInitiateActivities"))); + iContext.Node ( ).InitiateActivitiesL ( ); + } + +DEFINE_SMELEMENT ( TCreateControlDataClient, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TCreateControlDataClient::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TCreateControlDataClient"))); + + TNodeId factoryContainer = SockManGlobals::Get( )->GetPlaneFC( TCFPlayerRole ( TCFPlayerRole::EDataPlane ) ); + const TUid uid = { CUPnPFlowFactory::iUid }; + THttpClientFlowQuery flowQuery ( TAppProtAddr ( 0 , 0 ), iContext.NodeId (), EHttpClientFlow, THttpClientFlowQuery::ECreateNew ); + + iContext.iNodeActivity->PostRequestTo( factoryContainer, TCFFactory::TFindOrCreatePeer ( TCFPlayerRole::EDataPlane , uid, &flowQuery ).CRef () ); + } + + +DEFINE_SMELEMENT ( TProcessCallbackDataClient, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TProcessCallbackDataClient::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TProcessCallbackDataClient"))); + + const TNodeId& dataClient = (message_cast(iContext.iMessage)).iNodeId; + iContext.Node ().SetTcpServerFlow ( dataClient ); + + // start the data client + iContext.iNodeActivity->PostRequestTo ( dataClient, TCFDataClient::TStart ().CRef () ); + } + +DEFINE_SMELEMENT ( TSendActivityStopped, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TSendActivityStopped::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TSendActivityStopped"))); + + if ( iContext.Node ( ).IsClosing ( ) + && iContext.iNode.CountAllActivities () == 2 ) // only - destroy and this upnp activity is pending + { + RClientInterface::OpenPostMessageClose ( iContext.NodeId (), iContext.NodeId (), TUpnpMessage::TActivityStopped ().CRef () ); + } + + // since upnp control scpr ativities are self originated, clear activity error + iContext.iNodeActivity->SetError( KErrNone ); + } + +DEFINE_SMELEMENT ( TFindHttpClientFlowOrSendRequest, NetStateMachine::MStateFork, UPnPControlSCprStates::TContext ) +TInt TFindHttpClientFlowOrSendRequest::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TFindHttpClientFlowOrSendRequest"))); + + TAppProtAddr addr ( 0, 0 ); + CUPnPActivityBase* activity = static_cast ( iContext.iNodeActivity ); + + if ( iContext.iMessage.IsMessage ( ) ) + { + TUpnpMessage::TDescribeRequest& describeMsg = message_cast ( iContext.iMessage ); + activity->iRequestParamSet = static_cast ( describeMsg.iParamSet ); + addr = static_cast(describeMsg.iParamSet)->RemoteHost(); + } + else if ( iContext.iMessage.IsMessage ( ) ) + { + TUpnpMessage::TSubscribeRequest& subscribeMsg = message_cast ( iContext.iMessage ); + activity->iRequestParamSet = static_cast ( subscribeMsg.iParamSet ); + addr = static_cast ( subscribeMsg.iParamSet )->RemoteHost(); + } + + TInt idx = 0; + TBool dcFound = EFalse; + TBool dcInitialising = EFalse; + while ( iContext.Node().iFlowInfo.Count ( ) != idx ) + { + if ( iContext.Node().iFlowInfo[idx].iAppProtAddr == addr ) + { + if ( iContext.Node().iFlowInfo[idx].iDataClient != TNodeId::NullId ( ) ) + { + dcFound = ETrue; + activity->iFlowId = iContext.Node().iFlowInfo[idx].iDataClient; + } + else + { + dcInitialising = ETrue; + } + break; + } + idx++; + } + if ( dcFound ) + { + return UPnPStateMachine::KSendRequest; + } + if ( !dcInitialising ) + { + CUPnPControlSubConnectionProvider::TFlowInfo newDataClient; + newDataClient.iAppProtAddr = addr; + iContext.Node().iFlowInfo.Append ( newDataClient ); + } + return MeshMachine::KNoTag; + } + +DEFINE_SMELEMENT ( TFindOrCreateHttpClientFlow, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TFindOrCreateHttpClientFlow::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TFindOrCreateHttpClientFlow::DoL"))); + CUPnPActivityBase& activity = static_cast ( *iContext.iNodeActivity ); + + TAppProtAddr remoteHost ( 0, 0 ); + STypeId metaType = activity.iRequestParamSet->GetTypeId( ); + if ( metaType.iType == EUPnPDescribeRequestParamSet ) + { + CUPnPDescribeRequestParamSet* paramSet = static_cast ( activity.iRequestParamSet ); + remoteHost = paramSet->RemoteHost( ); + } + else if ( metaType.iType == EUPnPSubscribeRequestParamSet ) + { + CUPnPSubscribeRequestParamSet* paramSet = static_cast ( activity.iRequestParamSet ); + remoteHost = paramSet->RemoteHost( ); + } + + const TUid requestedUid = { CUPnPFlowFactory::iUid }; + + THttpClientFlowQuery flowQuery ( remoteHost, + iContext.NodeId (), + EHttpClientFlow, + THttpClientFlowQuery::EUseExisting ); + TCFPlayerRole playerRole ( TCFPlayerRole::EDataPlane ); + + TNodeId factoryContainer = SockManGlobals::Get( )->GetPlaneFC( playerRole ); + activity.PostRequestTo ( factoryContainer, TCFFactory::TFindOrCreatePeer ( TCFPlayerRole::EDataPlane, requestedUid, &flowQuery ).CRef () ); + } + + +DEFINE_SMELEMENT ( TProcessHttpDataClient, NetStateMachine::MStateTransition, UPnPControlSCprStates::TContext ) +void TProcessHttpDataClient::DoL ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("TProcessHttpDataClient"))); + + CUPnPActivityBase& activity = static_cast< CUPnPActivityBase& >( *iContext.iNodeActivity ); + + TAppProtAddr remoteHost; + STypeId metaType = activity.iRequestParamSet->GetTypeId( ); + if ( metaType.iType == EUPnPDescribeRequestParamSet ) + { + CUPnPDescribeRequestParamSet* paramSet = static_cast ( activity.iRequestParamSet ); + remoteHost = paramSet->RemoteHost( ); + } + else if ( metaType.iType == EUPnPSubscribeRequestParamSet ) + { + CUPnPSubscribeRequestParamSet* paramSet = static_cast ( activity.iRequestParamSet ); + remoteHost = paramSet->RemoteHost( ); + } + + TInt iDcIdx = 0; + for ( iDcIdx = 0; iDcIdx < iContext.Node ( ).iFlowInfo.Count ( ); iDcIdx++ ) + { + if ( iContext.Node ( ).iFlowInfo[iDcIdx].iAppProtAddr == remoteHost ) + { + break; + } + } + + TCFFactory::TPeerFoundOrCreated &msg = message_cast(iContext.iMessage ); + iContext.Node ( ).iFlowInfo[iDcIdx].iDataClient = msg.iNodeId; + activity.iFlowId = msg.iNodeId; + } + + +//======================================UPnP Search States============================================// + +DEFINE_SMELEMENT ( UPnPSearchStates::TFindUdpClientFlowOrSendRequest, NetStateMachine::MStateFork, UPnPSearchStates::TContext ) +TInt UPnPSearchStates::TFindUdpClientFlowOrSendRequest::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPSearchStates::TFindUdpClientFlowOrSendRequest"))); + + TUpnpMessage::TSearchRequest& msg = message_cast ( iContext.iMessage ); + CUPnPSearchActivity* activity = static_cast ( iContext.iNodeActivity ); + activity->iRequestParamSet = static_cast ( msg.iParamSet ); + + CUPnPControlSubConnectionProvider& node = static_cast(iContext.Node()); + if ( node.UdpClientFlow() == TNodeId::NullId () ) + { + return MeshMachine::KNoTag; + } + return UPnPStateMachine::KSendRequest; + } + +DEFINE_SMELEMENT ( UPnPSearchStates::TStoreUdpClientFlowAndSendRequest, NetStateMachine::MStateFork, UPnPSearchStates::TContext ) +TInt UPnPSearchStates::TStoreUdpClientFlowAndSendRequest::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPSearchStates::TStoreUdpClientFlowAndSendRequest"))); + + TCFFactory::TPeerFoundOrCreated &msg = message_cast(iContext.iMessage ); + iContext.Node().SetUdpClientFlow ( msg.iNodeId ); + return UPnPStateMachine::KSendRequest; + } + +DEFINE_SMELEMENT ( UPnPSearchStates::TCancelSearchOrProcessResponseTag, NetStateMachine::MStateFork, UPnPSearchStates::TContext ) +TInt UPnPSearchStates::TCancelSearchOrProcessResponseTag::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPSearchStates::TCancelSearchOrProcessResponseTag"))); + + if ( iContext.iMessage.IsMessage() ) + { + return UPnPStateMachine::KProcessResponse; + } + if ( iContext.iMessage.IsMessage() + || iContext.iMessage.IsMessage() ) + { + return MeshMachine::KCancelTag; + } + return MeshMachine::KErrorTag; + } + +DEFINE_SMELEMENT ( UPnPSearchStates::TNoTagOrResponseTag, NetStateMachine::MStateFork, UPnPSearchStates::TContext ) +TInt UPnPSearchStates::TNoTagOrResponseTag::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPSearchStates::TNoTagOrResponseTag"))); + + if ( iContext.iMessage.IsMessage () ) + { + return UPnPStateMachine::KProcessResponse; + } + return MeshMachine::KNoTag; + } + +//=================================UPnP Register Notify States =============================================================// + +DEFINE_SMELEMENT ( UPnPRegisterNotifyStates::TFindMUdpFlowOrSendRequest, NetStateMachine::MStateFork, UPnPRegisterNotifyStates::TContext ) +TInt UPnPRegisterNotifyStates::TFindMUdpFlowOrSendRequest::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPRegisterNotifyStates::TFindMUdpFlowOrSendRequest"))); + + TUpnpMessage::TRegisterNotifyRequest& msg = message_cast ( iContext.iMessage ); + CUPnPRegisterNotifyActivity* activity = static_cast ( iContext.iNodeActivity ); + activity->iRequestParamSet = static_cast ( msg.iParamSet ); + + CUPnPControlSubConnectionProvider& node = static_cast(iContext.Node()); + if ( node.UdpServerFlow () == TNodeId::NullId () ) + { + return MeshMachine::KNoTag; + } + return UPnPStateMachine::KSendRequest; + } + +DEFINE_SMELEMENT ( UPnPRegisterNotifyStates::TStoreMUdpFlowAndStartServer, NetStateMachine::MStateFork, UPnPRegisterNotifyStates::TContext ) +TInt UPnPRegisterNotifyStates::TStoreMUdpFlowAndStartServer::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPRegisterNotifyStates::TStoreMUdpFlowAndStartServer"))); + + TCFFactory::TPeerFoundOrCreated &msg = message_cast ( iContext.iMessage ); + iContext.Node ().SetUdpServerFlow ( msg.iNodeId ); + return MeshMachine::KNoTag; + } + +DEFINE_SMELEMENT ( UPnPRegisterNotifyStates::TCancelRegisterOrProcessResponseTag, NetStateMachine::MStateFork, UPnPRegisterNotifyStates::TContext ) +TInt UPnPRegisterNotifyStates::TCancelRegisterOrProcessResponseTag::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPRegisterNotifyStates::TCancelRegisterOrProcessResponseTag"))); + + if ( iContext.iMessage.IsMessage () || iContext.iMessage.IsMessage () ) + { + return UPnPStateMachine::KProcessResponse; + } + if ( iContext.iMessage.IsMessage () || iContext.iMessage.IsMessage () ) + { + return MeshMachine::KCancelTag; + } + return MeshMachine::KErrorTag; + } + +DEFINE_SMELEMENT ( UPnPRegisterNotifyStates::TNoTagOrResponseTag, NetStateMachine::MStateFork, UPnPRegisterNotifyStates::TContext ) +TInt UPnPRegisterNotifyStates::TNoTagOrResponseTag::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPRegisterNotifyStates::TNoTagOrResponseTag"))); + return iContext.iMessage.IsMessage () || iContext.iMessage.IsMessage() ? UPnPStateMachine::KProcessResponse : MeshMachine::KNoTag; + } + +//=================================UPnP Describe States =============================================================// + +DEFINE_SMELEMENT ( UPnPDescribeStates::TCancelDescribeOrProcessResponseTag, NetStateMachine::MStateFork, UPnPDescribeStates::TContext ) +TInt UPnPDescribeStates::TCancelDescribeOrProcessResponseTag::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("CancelDescribeOrProcessResponseTag"))); + + if ( iContext.iMessage.IsMessage () ) + { + return KProcessResponse; + } + else if(iContext.iMessage.IsMessage() + || iContext.iMessage.IsMessage() ) + { + return MeshMachine::KCancelTag; + } + else if (iContext.iMessage.IsMessage()) + { + TEBase::TError& msg = message_cast ( iContext.iMessage ); + if ( msg.iValue != KErrCancel ) + { + return MeshMachine::KErrorTag; + } + } + return MeshMachine::KNoTag; + } + +//==============================================================================================// +DEFINE_SMELEMENT ( UPnPSubscribeStates::TErrorOrProcessResponseTag, NetStateMachine::MStateFork, UPnPDescribeStates::TContext ) +TInt UPnPSubscribeStates::TErrorOrProcessResponseTag::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("UPnPSubscribeStates::ErrorOrProcessResponseTag"))); + + if ( iContext.iMessage.IsMessage () ) + { + return KProcessResponse; + } + else if ( iContext.iMessage.IsMessage () ) + { + return MeshMachine::KErrorTag; + } + return MeshMachine::KNoTag; + } + + +DEFINE_SMELEMENT ( UPnPSubscribeStates::TNoTagOrCancelSubscribe, NetStateMachine::MStateFork, UPnPSubscribeStates::TContext ) +TInt UPnPSubscribeStates::TNoTagOrCancelSubscribe::TransitionTag ( ) + { + LOG(ESockLogExternal::Printf(KSubsysCtrlScprSts, KComponent, _L8("NoTagOrCancelSubscribe"))); + + TUpnpMessage::TSubscribeResponse& msg = message_cast< TUpnpMessage::TSubscribeResponse > ( iContext.iMessage ); + + if ( msg.iStatus == HTTPStatus::EOk && iContext.iNodeActivity->Error() == KErrCancel ) + { + return MeshMachine::KCancelTag; + } + + return MeshMachine::KNoTag; + } +//==============================================================================================// +DEFINE_SMELEMENT ( TAwaitingBindToComplete, NetStateMachine::MState, UPnPStateMachine::TContext ) +TBool TAwaitingBindToComplete::Accept ( ) + { + CoreNetStates::TAwaitingBindToComplete awaitingBindToComplete ( iContext ); + if ( awaitingBindToComplete.Accept () ) + { + CCommsBinderActivity* binderActivity = reinterpret_cast ( iContext.iNodeActivity->FetchExtInterface ( CCommsBinderActivity::KInterfaceId ) ); + ASSERT ( binderActivity ); + RNodeInterface* pendingBinder = binderActivity->Binder (); + TUint c = iContext.Node ().CountActivities ( iContext.iNodeActivity->ActivitySigId () ); + if ( c == 1 ) + { + pendingBinder->ClearFlags ( TCFClientType::EActivating ); + } + //binderActivity->StoreBinder(NULL); + + return ETrue; + } + return EFalse; + } +