servicediscoveryandcontrol/pnp/test/upnp/Server/ServicePoint/src/upnpservicecpractivities.cpp
changeset 0 f5a58ecadc66
equal deleted inserted replaced
-1:000000000000 0:f5a58ecadc66
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // @file
       
    15 // @internalComponent
       
    16 // 
       
    17 //
       
    18 
       
    19 #include <comms-infras/ss_corepractivities.h>
       
    20 #include <comms-infras/ss_coreprstates.h>
       
    21 #include <comms-infras/ss_log.h>
       
    22 #include <comms-infras/ss_logext.h>
       
    23 
       
    24 #include "upnpservicecprstates.h"
       
    25 #include "upnpstatemachine.h"
       
    26 #include "upnpservicecpractivities.h"
       
    27 #include "upnpserverconstants.h"
       
    28 #include "upnplog.h"
       
    29 __FLOG_STMT(_LIT8(KComponent,"UPnPSPScpr");)
       
    30 
       
    31 using namespace ESock;
       
    32 using namespace PRActivities;
       
    33 using namespace MeshMachine;
       
    34 using namespace UPnPServiceCprStates;
       
    35 using namespace UPnPStateMachine;
       
    36 using namespace UPnPServiceCprActivities;
       
    37 using namespace Messages;
       
    38 
       
    39 namespace UpnPServiceCprServiceJoinRequestActivity
       
    40 {
       
    41 DECLARE_DEFINE_NODEACTIVITY ( TUpnpMessage::EActivityServiceJoinRequest, UpnpServiceJoinRequest, TNodeSignal::TNullMessageId  ) //Waiting for both Service / Embedded Device Join messages
       
    42 	FIRST_NODEACTIVITY_ENTRY ( TAwaitingServiceOrDeviceJoin, TNoTag )
       
    43 	LAST_NODEACTIVITY_ENTRY ( KNoTag, TPerformServiceOrDeviceValidationAndSendResponse )
       
    44 NODEACTIVITY_END ( )
       
    45 }
       
    46 
       
    47 namespace UPnPServiceCprNewServiceRegisterActivity
       
    48 {
       
    49 DECLARE_DEFINE_CUSTOM_NODEACTIVITY ( TUpnpMessage::EActivityNewServiceRegister, UpnpNewServiceRegister, TNodeSignal::TNullMessageId , CUpnpNewServiceRegisterActivity::NewL )
       
    50 	FIRST_NODEACTIVITY_ENTRY ( TAwaitingServiceOrDeviceRegister, TServiceOrDeviceTag )
       
    51 	THROUGH_NODEACTIVITY_ENTRY ( KServiceTag, TAppendServiceInfo, TRootRegisteredOrNoTag )
       
    52 	THROUGH_NODEACTIVITY_ENTRY ( KDeviceTag, TAppendDeviceInfo, TRootRegisteredOrNoTag )
       
    53 	NODEACTIVITY_ENTRY ( KNoTag, CUpnpNewServiceRegisterActivity::TRegisterRootDevice, CUpnpNewServiceRegisterActivity::TAwiatingRootDeviceRegistered, TNoTag )
       
    54 	LAST_NODEACTIVITY_ENTRY ( KNoTag, CUpnpNewServiceRegisterActivity::TReplyToPendingServices )
       
    55 	
       
    56 	LAST_NODEACTIVITY_ENTRY ( KRootRegisteredTag, CUpnpNewServiceRegisterActivity::TReplyToCurrentService )
       
    57 NODEACTIVITY_END ( )
       
    58 }
       
    59 	
       
    60 namespace UPnPServiceCprUnregisterServiceActivity
       
    61 {
       
    62 DECLARE_DEFINE_NODEACTIVITY ( ECFActivityDataClientIdle, UPnPServiceCprUnregisterService, TNodeSignal::TNullMessageId )
       
    63 	FIRST_NODEACTIVITY_ENTRY ( TAwaitingServiceOrDeviceUnregister, TServiceOrDeviceTag )
       
    64 	
       
    65 	THROUGH_NODEACTIVITY_ENTRY ( KServiceTag, TDeleteServiceInfo, TNoTag )
       
    66 	THROUGH_NODEACTIVITY_ENTRY ( KDeviceTag, TDeleteDeviceInfo, TNoTag )
       
    67 	
       
    68     LAST_NODEACTIVITY_ENTRY ( KNoTag, CprStates::THandleDataClientIdle )
       
    69 NODEACTIVITY_END ( )
       
    70 }
       
    71 
       
    72 namespace UpnpServiceCprSubscriptionTimerActivity
       
    73 {
       
    74 DECLARE_DEFINE_CUSTOM_NODEACTIVITY ( TUpnpMessage::EActivitySubscriptionTimer, UpnpServiceCprSubscriptionTimer, TUpnpMessage::TStartTimer, CUpnpSubscriptionTimerActivity::NewL )
       
    75 	FIRST_NODEACTIVITY_ENTRY ( CUpnpSubscriptionTimerActivity::TAwaitingStartTimer, TNoTag )
       
    76 	THROUGH_NODEACTIVITY_ENTRY ( KNoTag, CUpnpSubscriptionTimerActivity::TStartTimer, TTag< CoreStates::KLoopTag | NetStateMachine::EForward > )
       
    77 	
       
    78 	NODEACTIVITY_ENTRY ( CoreStates::KLoopTag, TDoNothing, CUpnpSubscriptionTimerActivity::TAwaitingStartOrStopTimer, CUpnpSubscriptionTimerActivity::TStartOrStopTag )	
       
    79 	THROUGH_NODEACTIVITY_ENTRY ( UPnPStateMachine::KStart, TDoNothing, TTag< CoreStates::KLoopTag | NetStateMachine::EBackward > )
       
    80 	
       
    81 	THROUGH_NODEACTIVITY_ENTRY ( UPnPStateMachine::KStop, CUpnpSubscriptionTimerActivity::TDequeueClient, CUpnpSubscriptionTimerActivity::TLoopOrCancelTag )	
       
    82 	LAST_NODEACTIVITY_ENTRY ( KCancelTag, TDoNothing )
       
    83 NODEACTIVITY_END ( )
       
    84 }
       
    85 
       
    86 
       
    87 namespace UPnPServiceCprStartActivity
       
    88 {
       
    89 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityStart, UPnPServiceCprStart, TCFServiceProvider::TStart, PRActivities::CStartActivity::NewL)
       
    90     FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingStart, CoreNetStates::TNoTagOrBearerPresentBlockedByStop)
       
    91 	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, CoreNetStates::TBindSelfToPresentBearer, CoreNetStates::TAwaitingBindToComplete, TTag<CoreNetStates::KBearerPresent>)
       
    92 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendNoBearer, MeshMachine::TAwaitingMessageState<TCFControlProvider::TBearer>, TTag<CoreNetStates::KBearerPresent>)
       
    93 
       
    94 	//Start the service provider, use the default cancellation.
       
    95 	//Forward TCancel to the service provider, wait for TStarted or TError (via the Error Activity)
       
    96 	//When TStarted arrives after TCancel the activity will move to the nearest KErrorTag
       
    97 	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, CoreNetStates::TStartServiceProviderRetry, CoreNetStates::TAwaitingStarted, TNoTagOrErrorTag)
       
    98 	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing)
       
    99 	//Start data clients, use the default cancellation.
       
   100 	//Forward TCancel to the self, wait for TDataClientStarted or TError (via the Error Activity)
       
   101 	//When TDataClientStarted arrives after TCancel the activity will move to the nearest KErrorTag
       
   102 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TStartSelf, CoreNetStates::TAwaitingDataClientStarted, TNoTagOrErrorTag)	
       
   103 	NODEACTIVITY_ENTRY(KNoTag, UPnPStateMachine::TRequestLocalHost, UPnPStateMachine::TAwaitingLocalHostFromMCpr, TNoTagOrErrorTag)
       
   104 	
       
   105 	NODEACTIVITY_ENTRY(KErrorTag, CoreNetStates::TStopSelf, CoreNetStates::TAwaitingDataClientStopped, TErrorTag)
       
   106 	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing)
       
   107 	
       
   108 	LAST_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendStarted)
       
   109 NODEACTIVITY_END()
       
   110 }
       
   111 
       
   112 
       
   113 	
       
   114 namespace UPnPServiceCprActivities
       
   115 {
       
   116 DEFINE_ACTIVITY_MAP ( activityMap )
       
   117 	ACTIVITY_MAP_ENTRY ( UpnPServiceCprServiceJoinRequestActivity, UpnpServiceJoinRequest )
       
   118 	ACTIVITY_MAP_ENTRY ( UPnPServiceCprNewServiceRegisterActivity, UpnpNewServiceRegister )
       
   119 	ACTIVITY_MAP_ENTRY ( UPnPServiceCprUnregisterServiceActivity, UPnPServiceCprUnregisterService )
       
   120 	ACTIVITY_MAP_ENTRY ( UpnpServiceCprSubscriptionTimerActivity, UpnpServiceCprSubscriptionTimer )
       
   121 	ACTIVITY_MAP_ENTRY ( UPnPServiceCprStartActivity, UPnPServiceCprStart )
       
   122 ACTIVITY_MAP_END_BASE ( CprActivities, coreCprActivities )
       
   123 }
       
   124 
       
   125 
       
   126 CNodeActivityBase* CUpnpNewServiceRegisterActivity::NewL ( const TNodeActivity& aActivitySig, AMMNodeBase& aNode )
       
   127 	{
       
   128 	return new ( ELeave ) CUpnpNewServiceRegisterActivity ( aActivitySig, aNode ) ;
       
   129 	}
       
   130 
       
   131 CUpnpNewServiceRegisterActivity::~CUpnpNewServiceRegisterActivity ( )
       
   132 	{
       
   133 	SetError ( KErrNone );
       
   134 	}
       
   135 
       
   136 DEFINE_SMELEMENT ( CUpnpNewServiceRegisterActivity::TRegisterRootDevice, NetStateMachine::MStateTransition, CUpnpNewServiceRegisterActivity::TContext )
       
   137 void CUpnpNewServiceRegisterActivity::TRegisterRootDevice::DoL ( )
       
   138 	{
       
   139 	LOG(ESockLogExternal::Printf(KSubsysSPNewSrvcRegActivity, KComponent, _L8("CUpnpNewServiceRegisterActivity::TRegisterRootDevice::DoL")));
       
   140 	CUpnpNewServiceRegisterActivity& activity = static_cast< CUpnpNewServiceRegisterActivity& > ( *iContext.iNodeActivity );
       
   141 	
       
   142 	if ( activity.iOriginators.Count ( ) == KFirstRegistration )
       
   143 		{
       
   144 		// send data client to default SCPR to publish root device and start listening for root device.
       
   145 		RNodeInterface* dc = iContext.Node ( ).GetFirstClient<TDefaultClientMatchPolicy> ( TClientType ( TCFClientType::EData, TCFClientType::EDefault ) );	
       
   146 				
       
   147 		const CUPnPRootDeviceInfoContainer& container = iContext.Node ( ).GetRootDeviceInfoContainer ( );
       
   148 		const CUPnPDeviceDescription& deviceDesc = container.GetRootDeviceDesciption ( );
       
   149 		//root device info
       
   150 		CUPnPDevice* deviceObj = deviceDesc.DeviceObject ( );
       
   151 		__ASSERT_DEBUG ( deviceObj != NULL, User::Invariant ( ) );
       
   152 		
       
   153 		LOG(ESockLogExternal::Printf(KSubsysSPNewSrvcRegActivity, KComponent, _L8("CUpnpNewServiceRegisterActivity::TRegisterRootDevice::DoL - Posting message TUpnpMessage::TRegisterRootDevice")));
       
   154 		activity.PostRequestTo ( *dc, TUpnpMessage::TRegisterRootDevice ( deviceObj ).CRef () );
       
   155 		}
       
   156 	}
       
   157 	
       
   158 DEFINE_SMELEMENT ( CUpnpNewServiceRegisterActivity::TReplyToPendingServices, NetStateMachine::MStateTransition, CUpnpNewServiceRegisterActivity::TContext )
       
   159 void CUpnpNewServiceRegisterActivity::TReplyToPendingServices::DoL ( )
       
   160 	{
       
   161 	LOG(ESockLogExternal::Printf(KSubsysSPNewSrvcRegActivity, KComponent, _L8("CUpnpNewServiceRegisterActivity::TReplyToPendingServices::DoL")));
       
   162 	TUpnpMessage::TRootDeviceRegistered& currentMsg = message_cast< TUpnpMessage::TRootDeviceRegistered > ( iContext.iMessage );
       
   163 	
       
   164 	if ( currentMsg.iValue == KErrNone )
       
   165 		{
       
   166 		iContext.Node ( ).ProcessRootDeviceRegisteredL ( );
       
   167 		}
       
   168 	LOG(ESockLogExternal::Printf(KSubsysSPNewSrvcRegActivity, KComponent, _L8("CUpnpNewServiceRegisterActivity::TReplyToPendingServices::DoL - Posting message TUpnpMessage::TServiceRegistered")));	
       
   169 	TUpnpMessage::TServiceRegistered msg ( currentMsg.iValue );	
       
   170   	iContext.iNodeActivity->PostToOriginators( msg );
       
   171 	}
       
   172 	
       
   173 DEFINE_SMELEMENT ( CUpnpNewServiceRegisterActivity::TReplyToCurrentService, NetStateMachine::MStateTransition, CUpnpNewServiceRegisterActivity::TContext )
       
   174 void CUpnpNewServiceRegisterActivity::TReplyToCurrentService::DoL ( )
       
   175 	{
       
   176 	LOG(ESockLogExternal::Printf(KSubsysSPNewSrvcRegActivity, KComponent, _L8("CUpnpNewServiceRegisterActivity::TReplyToCurrentService::DoL")));
       
   177 	LOG(ESockLogExternal::Printf(KSubsysSPNewSrvcRegActivity, KComponent, _L8("CUpnpNewServiceRegisterActivity::TReplyToCurrentService::DoL - Posting message TUpnpMessage::TServiceRegistered")));
       
   178 	TUpnpMessage::TServiceRegistered msg ( KErrNone );	
       
   179 	RClientInterface::OpenPostMessageClose ( iContext.NodeId ( ), address_cast<TNodeCtxId> ( iContext.iSender ), msg );
       
   180   	}
       
   181 	
       
   182 	
       
   183 CNodeActivityBase* CUpnpSubscriptionTimerActivity::NewL ( const TNodeActivity& aActivitySig, AMMNodeBase& aNode )
       
   184 	{
       
   185 	CUpnpSubscriptionTimerActivity* self = new ( ELeave ) CUpnpSubscriptionTimerActivity ( aActivitySig, aNode ) ;
       
   186 	CleanupStack::PushL ( self );
       
   187 	self->ConstructL( );
       
   188 	CleanupStack::Pop ( self );
       
   189 	return self;
       
   190 	}
       
   191 	
       
   192 void CUpnpSubscriptionTimerActivity::ConstructL ( )	
       
   193 	{
       
   194 	// create the timer object
       
   195 	iPeriodicTimer = CPeriodic::NewL ( CActive::EPriorityLow );	
       
   196 	}
       
   197 
       
   198 CUpnpSubscriptionTimerActivity::~CUpnpSubscriptionTimerActivity ( )
       
   199 	{
       
   200 	SetError ( KErrNone );
       
   201 	if ( iPeriodicTimer )
       
   202 		iPeriodicTimer->Cancel( );
       
   203 	delete iPeriodicTimer;
       
   204 	}
       
   205 
       
   206 DEFINE_SMELEMENT ( CUpnpSubscriptionTimerActivity::TStartTimer, NetStateMachine::MStateTransition, CUpnpSubscriptionTimerActivity::TContext )
       
   207 void CUpnpSubscriptionTimerActivity::TStartTimer::DoL ( )
       
   208 	{	
       
   209 	LOG(ESockLogExternal::Printf(KSubsysSPSubsTimerActivity, KComponent, _L8("CUpnpSubscriptionTimerActivity::TStartTimer::DoL")));
       
   210 	CUpnpSubscriptionTimerActivity& activity = static_cast<CUpnpSubscriptionTimerActivity&> ( *iContext.iNodeActivity );
       
   211 	
       
   212 	TCallBack updateCallback ( &CUpnpSubscriptionTimerActivity::SubscriptionTimerCallBackL, &activity );
       
   213 	activity.iPeriodicTimer->Start ( TTimeIntervalMicroSeconds32 ( KSubscriptionCleanupFrequency ), TTimeIntervalMicroSeconds32 ( KSubscriptionCleanupFrequency ), updateCallback );
       
   214 	}
       
   215 	
       
   216 DEFINE_SMELEMENT ( CUpnpSubscriptionTimerActivity::TDequeueClient, NetStateMachine::MStateTransition, CUpnpSubscriptionTimerActivity::TContext )
       
   217 void CUpnpSubscriptionTimerActivity::TDequeueClient::DoL ( )
       
   218 	{
       
   219 	LOG(ESockLogExternal::Printf(KSubsysSPSubsTimerActivity, KComponent, _L8("CUpnpSubscriptionTimerActivity::TDequeueClient::DoL")));
       
   220 	TInt pos = iContext.iNodeActivity->FindOriginator ( iContext.iSender );
       
   221 	if ( pos != KErrNotFound )
       
   222 		{		
       
   223 		iContext.iNodeActivity->RemoveOriginator( pos );
       
   224 		}
       
   225 	}
       
   226 	
       
   227 DEFINE_SMELEMENT ( CUpnpSubscriptionTimerActivity::TStartOrStopTag, NetStateMachine::MStateFork, CUpnpSubscriptionTimerActivity::TContext )
       
   228 TInt CUpnpSubscriptionTimerActivity::TStartOrStopTag::TransitionTag ( )
       
   229 	{
       
   230 	if  ( iContext.iMessage.IsMessage<TUpnpMessage::TStartTimer> ( ) )
       
   231 		{
       
   232 		return KStart;
       
   233 		}	
       
   234 	return KStop;
       
   235 	}
       
   236 
       
   237 DEFINE_SMELEMENT ( CUpnpSubscriptionTimerActivity::TLoopOrCancelTag, NetStateMachine::MStateFork, CUpnpSubscriptionTimerActivity::TContext )
       
   238 TInt CUpnpSubscriptionTimerActivity::TLoopOrCancelTag::TransitionTag ( )
       
   239 	{
       
   240 	CUpnpSubscriptionTimerActivity& activity = static_cast<CUpnpSubscriptionTimerActivity&> ( *iContext.iNodeActivity );	
       
   241 	return activity.iOriginators.Count() == 0 ? KCancelTag : (CoreStates::KLoopTag | NetStateMachine::EBackward);
       
   242 	}
       
   243 
       
   244 
       
   245 TInt CUpnpSubscriptionTimerActivity::SubscriptionTimerCallBackL ( TAny* aPtr )
       
   246 	{
       
   247 	CUpnpSubscriptionTimerActivity* activity = static_cast<CUpnpSubscriptionTimerActivity*> ( aPtr );
       
   248 	TUint orgCount = activity->iOriginators.Count ( );
       
   249 	
       
   250     if ( orgCount != 0 )
       
   251     	{
       
   252     	for ( TInt i = 0; i < orgCount; i++ )
       
   253 	    	{
       
   254 	    	TNodeId dc = address_cast<TNodeId> ( activity->iOriginators[i].RecipientId () );
       
   255  	    #if !defined(__GCCXML__)
       
   256  			CSubConnectionProviderBase& scprBase = mnode_cast<CSubConnectionProviderBase> ( dc.Node () );
       
   257  		#else
       
   258  			CSubConnectionProviderBase& scprBase = reinterpret_cast<CSubConnectionProviderBase&> ( dc.Node () );
       
   259  		#endif
       
   260  
       
   261  	    	CUPnPServiceSubConnectionProvider& subConnProv = static_cast<CUPnPServiceSubConnectionProvider&> ( scprBase );
       
   262  	    	subConnProv.DeprecateExpiredSubscriptions ();
       
   263 	    	}
       
   264         }
       
   265     else
       
   266     	{
       
   267     	activity->SetIdle( );
       
   268     	activity->iPeriodicTimer->Cancel();
       
   269     	}   
       
   270     return KErrNone;
       
   271 	}