36 #include <comms-infras/ss_legacyinterfaces.h> |
36 #include <comms-infras/ss_legacyinterfaces.h> |
37 #include <comms-infras/simpleselectorbase.h> |
37 #include <comms-infras/simpleselectorbase.h> |
38 #include <commsdattypesv1_1_partner.h> |
38 #include <commsdattypesv1_1_partner.h> |
39 #include <es_prot_internal.h> |
39 #include <es_prot_internal.h> |
40 #include <elements/nm_messages_errorrecovery.h> |
40 #include <elements/nm_messages_errorrecovery.h> |
41 #include <es_enum_internal.h> |
|
42 #include "ItfInfoConfigExt.h" |
|
43 |
41 |
44 using namespace Messages; |
42 using namespace Messages; |
45 using namespace MeshMachine; |
43 using namespace MeshMachine; |
46 using namespace IpProtoCpr; |
44 using namespace IpProtoCpr; |
47 using namespace ESock; |
45 using namespace ESock; |
153 // are not waiting for TStopped and in certain situations it would arrive after the node has been |
151 // are not waiting for TStopped and in certain situations it would arrive after the node has been |
154 // destroyed |
152 // destroyed |
155 if (iContext.Node().iTimerStopped) |
153 if (iContext.Node().iTimerStopped) |
156 { |
154 { |
157 TInt selfidx = iContext.iNodeActivity->FindOriginator(iContext.Node().SelfInterface()); |
155 TInt selfidx = iContext.iNodeActivity->FindOriginator(iContext.Node().SelfInterface()); |
158 if(selfidx != KErrNotFound) |
156 ASSERT(selfidx != KErrNotFound); |
159 { |
157 iContext.iNodeActivity->RemoveOriginator(selfidx); |
160 iContext.iNodeActivity->RemoveOriginator(selfidx); |
|
161 } |
|
162 } |
158 } |
163 |
159 |
164 TInt stopCode = KErrCancel; |
160 TInt stopCode = KErrCancel; |
165 MeshMachine::CNodeActivityBase* activity = iContext.iNodeActivity; |
161 MeshMachine::CNodeActivityBase* activity = iContext.iNodeActivity; |
166 |
162 |
285 { |
281 { |
286 CoreNetStates::TAwaitingStart state(iContext); |
282 CoreNetStates::TAwaitingStart state(iContext); |
287 if (state.Accept()) |
283 if (state.Accept()) |
288 { |
284 { |
289 iContext.Node().DisableTimers(); |
285 iContext.Node().DisableTimers(); |
290 // Check if we have been re-started (i.e. a start request is processed immmediately after a stop request |
|
291 // has been processed). If so, we generate a special EInterfaceStarting notification towards ESock. |
|
292 // This is to solve the problem where there is a missing EInterfaceDown/EInterfaceUp event sequence |
|
293 // from AllInterfaceNotification in this scenario. |
|
294 if (iContext.Node().iStopped) |
|
295 { |
|
296 const TItfInfoConfigExt* ext = static_cast<const TItfInfoConfigExt*>(iContext.Node().AccessPointConfig().FindExtension(STypeId::CreateSTypeId(KIpProtoConfigExtUid, EItfInfoConfigExt))); |
|
297 if (ext) |
|
298 { |
|
299 TInterfaceNotification info = { ext->iConnectionInfo, TConnInterfaceState(EInterfaceRestarting) }; |
|
300 iContext.Node().Factory().InterfaceStateChange(TPckgC<TInterfaceNotification>(info)); |
|
301 } |
|
302 } |
|
303 return ETrue; |
286 return ETrue; |
304 } |
287 } |
305 return EFalse; |
288 return EFalse; |
306 } |
289 } |
307 |
290 |
394 iContext.Node().EnableTimers(); |
377 iContext.Node().EnableTimers(); |
395 iContext.Node().SetUsageProfile(KConnProfileMedium); |
378 iContext.Node().SetUsageProfile(KConnProfileMedium); |
396 iContext.Node().SetTimerMode(CIPProtoConnectionProvider::ETimerMedium); |
379 iContext.Node().SetTimerMode(CIPProtoConnectionProvider::ETimerMedium); |
397 |
380 |
398 iContext.Node().iTimerStopped = EFalse; |
381 iContext.Node().iTimerStopped = EFalse; |
399 iContext.Node().iTimerExpired = EFalse; |
|
400 CoreNetStates::TSendStarted transition(iContext); |
382 CoreNetStates::TSendStarted transition(iContext); |
401 transition.DoL(); |
383 transition.DoL(); |
402 } |
384 } |
403 |
385 |
404 DEFINE_SMELEMENT(IpProtoCpr::TProcessDataClientStatusChange, NetStateMachine::MStateTransition, IpProtoCpr::TContext) |
386 DEFINE_SMELEMENT(IpProtoCpr::TProcessDataClientStatusChange, NetStateMachine::MStateTransition, IpProtoCpr::TContext) |
425 ASSERT(dmProvider); // Must always support this interface |
407 ASSERT(dmProvider); // Must always support this interface |
426 |
408 |
427 TCFMessage::TSubConnDataTransferred wholeConnMsg(KNifEMCompatibilityLayerEntireSubConnectionUid, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes); |
409 TCFMessage::TSubConnDataTransferred wholeConnMsg(KNifEMCompatibilityLayerEntireSubConnectionUid, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes); |
428 TCFMessage::TSubConnDataTransferred defaultSubConnMsg(KNifEMCompatibilityLayerFakeSubConnectionId, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes); |
410 TCFMessage::TSubConnDataTransferred defaultSubConnMsg(KNifEMCompatibilityLayerFakeSubConnectionId, dmProvider->DataVolumesPtr()->iSentBytes, dmProvider->DataVolumesPtr()->iReceivedBytes); |
429 |
411 |
430 // Sending data clent status change message to all the control clients |
412 RNodeInterface* ctrlClient = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::ECtrl)); |
431 TClientIter<TDefaultClientMatchPolicy> ccIter = iContext.Node().GetClientIter<TDefaultClientMatchPolicy>(TClientType(TCFClientType::ECtrl), TClientType(0, TCFClientType::ELeaving)); |
413 if(ctrlClient) |
432 RNodeInterface* ctrlClient; |
414 { // Can't send this if the client's gone |
433 TBool ctrlClientPresent = false; |
415 ctrlClient->PostMessage(iContext.NodeId(), wholeConnMsg); |
434 while ((ctrlClient = ccIter++) != NULL) |
416 ctrlClient->PostMessage(iContext.NodeId(), defaultSubConnMsg); |
435 { |
417 |
436 //If any cntl clinet is present setting the variable ctrlClientPresent as true. |
418 iContext.Node().iSubConnEventDataSent = ETrue; |
437 ctrlClientPresent = true; |
419 } |
438 ctrlClient->PostMessage(iContext.NodeId(), wholeConnMsg); |
|
439 ctrlClient->PostMessage(iContext.NodeId(), defaultSubConnMsg); |
|
440 } |
|
441 if(ctrlClientPresent) |
|
442 { |
|
443 iContext.Node().iSubConnEventDataSent = ETrue; |
|
444 } |
|
445 } |
420 } |
446 } |
421 } |
447 |
422 |
448 DEFINE_SMELEMENT(TAwaitingIoctlMessage, NetStateMachine::MState, IpProtoCpr::TContext) |
423 DEFINE_SMELEMENT(TAwaitingIoctlMessage, NetStateMachine::MState, IpProtoCpr::TContext) |
449 TBool TAwaitingIoctlMessage::Accept() |
424 TBool TAwaitingIoctlMessage::Accept() |