|
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 } |