|
1 // Copyright (c) 1997-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 // |
|
15 |
|
16 #include <comms-infras/ss_log.h> |
|
17 #include <comms-infras/ss_nodemessages.h> |
|
18 #include "ss_std.h" |
|
19 #include "ss_glob.h" |
|
20 #include <comms-infras/ss_subconnflow.h> |
|
21 #include <comms-infras/ss_roles.h> |
|
22 #include <comms-infras/ss_tiermanagerutils.h> |
|
23 #include "policyrequest.h" |
|
24 #include <comms-infras/ss_esockstates.h> |
|
25 #include "policyrequeststates.h" |
|
26 #include <comms-infras/ss_tiermanager.h> |
|
27 #include <comms-infras/ss_corepractivities.h> |
|
28 |
|
29 #include <comms-infras/ss_nodemessages_serviceprovider.h> |
|
30 #include <comms-infras/ss_nodemessages_subconn.h> |
|
31 |
|
32 using namespace Messages; |
|
33 using namespace MeshMachine; |
|
34 using namespace ESock; |
|
35 using namespace NetStateMachine; |
|
36 using namespace PolicyRequestStates; |
|
37 |
|
38 |
|
39 namespace PolicyRequestErrorActivity |
|
40 { |
|
41 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityError, PolicyRequestError, TEBase::TError, PolicyRequestActivities::CPolicyRequestActivity::NewL) |
|
42 FIRST_NODEACTIVITY_ENTRY(PolicyRequestStates::TAwaitingError, MeshMachine::TNoTag) |
|
43 THROUGH_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TLeaveServiceProvidersOrSetIdle, MeshMachine::TNoTag) |
|
44 //TDestroyAwaitingLeaveCompleteLoop loops back to its own triple if more SPs |
|
45 NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSetIdleIfNoServiceProviders, MeshMachine::TAwaitingLeaveComplete, CoreActivities::CDestroyActivity::TNoTagOrNoTagBackwards) |
|
46 LAST_NODEACTIVITY_ENTRY(KNoTag, CoreStates::TAbortAllActivities) |
|
47 NODEACTIVITY_END() |
|
48 } |
|
49 |
|
50 namespace PolicyConnectionActivity |
|
51 { |
|
52 //TODO perhaps get this from a header file since its used in a number of places - see ss_subconn.cpp |
|
53 typedef MeshMachine::TAcceptErrorState<CoreNetStates::TAwaitingApplyResponse> TAwaitingApplyResponseOrError; |
|
54 |
|
55 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFPolicyConnectionActivity, PolicyConnection, TCFIPMessage::TPolicyRequest, PolicyRequestActivities::CPolicyRequestActivity::NewL) |
|
56 FIRST_NODEACTIVITY_ENTRY(PolicyRequestStates::TAwaitingConnPolicyRequest, MeshMachine::TNoTag) |
|
57 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TJoinCpr, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag) |
|
58 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TRequestCommsBinderFromSCpr, PolicyRequestStates::TAwaitingBinderResponse, MeshMachine::TNoTag) |
|
59 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TJoinReceivedSCpr, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag) |
|
60 |
|
61 THROUGH_NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendBindToComplete, MeshMachine::TNoTag) |
|
62 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TLeaveCpr, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag) |
|
63 |
|
64 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TJoinTheDeftSCPr, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag) |
|
65 //NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendRejoinDataClientRequestToDeftSCPr, CoreNetStates::TAwaitingRejoinDataClientComplete, MeshMachine::TNoTag) |
|
66 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendRejoinDataClientRequestToDeftSCPr, CoreNetStates::TAwaitingRejoinDataClientComplete, MeshMachine::TNoTagOrErrorTag) |
|
67 NODEACTIVITY_ENTRY(KErrorTag, PolicyRequestStates::TLeaveTheDeftSCPr, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TTag<KErrorTag>) |
|
68 |
|
69 // send param bundle with qos params |
|
70 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendQoSParamsToNewSCpr, CoreNetStates::TAwaitingParamResponse, MeshMachine::TNoTagOrErrorTag) |
|
71 |
|
72 //When adding socket, add first, remove later. |
|
73 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendApplyToNewSCPr, TAwaitingApplyResponseOrError, MeshMachine::TNoTagOrErrorTag) |
|
74 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendApplyToDeftSCPr, TAwaitingApplyResponseOrError, MeshMachine::TNoTagOrErrorTag) |
|
75 |
|
76 NODEACTIVITY_ENTRY(KErrorTag, PolicyRequestStates::TSendCancelToDeftSCPr, PolicyRequestStates::TAwaitingCancelError, MeshMachine::TNoTag) |
|
77 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TLeaveTheDeftSCPr, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag) |
|
78 |
|
79 //Cleanup |
|
80 NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TLeaveServiceProvidersOrSetIdle, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag) |
|
81 NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSetIdleIfNoServiceProviders, MeshMachine::TAwaitingLeaveComplete, CoreActivities::CDestroyActivity::TNoTagOrNoTagBackwards) |
|
82 LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing) |
|
83 NODEACTIVITY_END() |
|
84 } |
|
85 |
|
86 namespace PolicyRequestIgnoreSubConEvent |
|
87 { |
|
88 DECLARE_DEFINE_NODEACTIVITY(ECFActivityNotification, PolicyRequestSCprNotif, TCFSubConnControlClient::TSubConnNotification) |
|
89 NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TIgnoreAndCloseSubConEvent, CoreNetStates::TAwaitingSubConEvent, MeshMachine::TNoTag) |
|
90 NODEACTIVITY_END() |
|
91 } |
|
92 |
|
93 namespace PolicyRequestActivities |
|
94 { |
|
95 DECLARE_DEFINE_ACTIVITY_MAP(policyRequestActivities) |
|
96 ACTIVITY_MAP_ENTRY(PolicyConnectionActivity, PolicyConnection) |
|
97 ACTIVITY_MAP_ENTRY(PolicyRequestErrorActivity, PolicyRequestError) |
|
98 ACTIVITY_MAP_ENTRY(PolicyRequestIgnoreSubConEvent, PolicyRequestSCprNotif) |
|
99 ACTIVITY_MAP_END() |
|
100 } |
|
101 |
|
102 CPolicyRequest::CPolicyRequest(const TCFConnPolicyRequest& aMsg) |
|
103 : ACFMMNodeIdBase(PolicyRequestActivities::policyRequestActivities::Self()) |
|
104 { |
|
105 iParamBundle.Open(aMsg.iParamBundle); |
|
106 iFlowNodeId = aMsg.iFlowNodeId; |
|
107 iSenderSCPrNodeId = aMsg.iSenderSCPrNodeId; |
|
108 iIPCPrNodeId = aMsg.iIPCPrNodeId; |
|
109 iNewSCprId.SetNull(); |
|
110 |
|
111 //iMessage.Adopt(static_cast<RSafeMessage&>(const_cast<RMessage2&>(aMessage))); |
|
112 LOG_NODE_CREATE(KESockConnectionTag, CPolicyRequest); |
|
113 } |
|
114 |
|
115 CPolicyRequest::~CPolicyRequest() |
|
116 { |
|
117 //ASSERT(!iMessage.IsNull()); |
|
118 //iMessage.Complete(iError); |
|
119 iParamBundle.Close(); |
|
120 LOG_NODE_DESTROY(KESockConnectionTag, CPolicyRequest); |
|
121 } |
|
122 |
|
123 void CPolicyRequest::Received(TNodeContextBase& aContext) |
|
124 { |
|
125 Messages::TNodeSignal::TMessageId noPeerIds[] = { |
|
126 TCFIPMessage::TPolicyRequest::Id(), |
|
127 Messages::TNodeSignal::TMessageId() |
|
128 }; |
|
129 MeshMachine::AMMNodeBase::Received(noPeerIds, aContext); |
|
130 MeshMachine::AMMNodeBase::PostReceived(aContext); |
|
131 } |
|
132 |
|
133 void CPolicyRequest::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage) |
|
134 { |
|
135 // TODO: TCFMessage::TConnectionGoingDown - If this message is received |
|
136 // a new request needs to be sent on behalf of the socket, and |
|
137 // this one needs to cleanup/destroy itself. This is for the race condition |
|
138 // where either the idle timer triggers and begin stopping the connection, |
|
139 // or the connection is lost (both resulting in TConnectionGoingDown) while |
|
140 // the request is in progress. |
|
141 if (aMessage.IsMessage<TCFMessage::TStateChange>() || |
|
142 aMessage.IsMessage<TCFControlClient::TGoneDown>() ) |
|
143 { |
|
144 // Note of caution: As a control client of providers the CPolicyRequest |
|
145 // could be bombarded with messages that we have no interest in. |
|
146 // TStateChange is one, but there could be others. Due to the nature |
|
147 // of the mesh machine if we don't handle them it will forward them |
|
148 // to the CSocket which only expects a limited set of messages from |
|
149 // the CPolicyRequest. The CSocket wont like the messages and its not |
|
150 // great for performance to forward them unnecessarily so try to kill |
|
151 // them off here. |
|
152 aMessage.ClearMessageId(); |
|
153 return; |
|
154 } |
|
155 |
|
156 TNodeContext<CPolicyRequest> ctx(*this, aMessage, aSender, aRecipient); |
|
157 CPolicyRequest::Received(ctx); |
|
158 User::LeaveIfError(ctx.iReturn); |
|
159 } |
|
160 |
|
161 // |
|
162 //TCFConnPolicyRequest |
|
163 void TCFConnPolicyRequest::StartL(const TRuntimeCtxId& aSender) |
|
164 { |
|
165 CPolicyRequest* req = new (ELeave) CPolicyRequest(*this); |
|
166 CleanupStack::PushL(req); |
|
167 |
|
168 TNodeId newServiceProvider = iIPCPrNodeId; |
|
169 // set service provider of the PolicyPequest node |
|
170 req->AddClientL(iIPCPrNodeId, TClientType(TCFClientType::EServProvider,TCFClientType::EActive)); |
|
171 |
|
172 TCFIPMessage::TPolicyRequest msg(ESoCreateWithConnection); //Message to triger activity |
|
173 req->ReceivedL(aSender, TNodeCtxId(0, req->Id()), msg); |
|
174 CleanupStack::Pop(req); |
|
175 } |
|
176 |
|
177 void TCFConnPolicyRequest::DispatchL(const TRuntimeCtxId& aSender, const TRuntimeCtxId& aRecipient) |
|
178 { |
|
179 const TNodeId& nodeId = address_cast<const TNodeId>(aRecipient); //This message type operates on nodes |
|
180 ASSERT(nodeId==SockManGlobals::Get()->GetPlaneFC(TCFPlayerRole(TCFPlayerRole::ESubConnPlane))); //Should be dispatched on the Connection Plane container! |
|
181 |
|
182 CleanupClosePushL(iParamBundle); |
|
183 StartL(aSender); |
|
184 CleanupStack::PopAndDestroy(&iParamBundle); |
|
185 } |
|
186 |