|
1 // Copyright (c) 2006-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 // IPProto SubConnection Provider implementation |
|
15 // |
|
16 // |
|
17 |
|
18 /** |
|
19 @file |
|
20 @internalComponent |
|
21 */ |
|
22 |
|
23 #include <comms-infras/corescprstates.h> |
|
24 #include <comms-infras/corescpractivities.h> |
|
25 #include "IPProtoSCPR.h" |
|
26 #include "IPProtoSCPRStates.h" |
|
27 #include <comms-infras/linkmessages.h> // for TLinkMessage |
|
28 #include <comms-infras/ss_msgintercept.h> |
|
29 |
|
30 |
|
31 using namespace Messages; |
|
32 using namespace ESock; |
|
33 using namespace IPProtoSCpr; |
|
34 using namespace MeshMachine; |
|
35 |
|
36 //We reserve space for two preallocated activities that may start concurrently on the SCPR |
|
37 //node: destroy and data client stop. |
|
38 static const TUint KDefaultMaxPreallocatedActivityCount = 2; |
|
39 static const TUint KMaxPreallocatedActivitySize = sizeof(MeshMachine::CNodeRetryParallelActivity) + sizeof(MeshMachine::APreallocatedOriginators<4>); |
|
40 static const TUint KIPProtoSCPRPreallocatedActivityBufferSize = KDefaultMaxPreallocatedActivityCount * KMaxPreallocatedActivitySize; |
|
41 |
|
42 //-========================================================= |
|
43 // |
|
44 // Activities |
|
45 // |
|
46 //-========================================================= |
|
47 |
|
48 |
|
49 namespace IPProtoSCprProvisionActivity |
|
50 { |
|
51 DECLARE_DEFINE_NODEACTIVITY(ECFActivityStoreProvision, IPProtoSCprProvision, TCFDataClient::TProvisionConfig) |
|
52 FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingProvision, MeshMachine::TNoTag) |
|
53 LAST_NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TStoreProvision) |
|
54 NODEACTIVITY_END() |
|
55 } |
|
56 |
|
57 |
|
58 namespace IPProtoSCprStartActivity |
|
59 { |
|
60 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityStart, IPProtoSCprStart, TCFServiceProvider::TStart, PRActivities::CStartActivity::NewL) |
|
61 FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingStart, CoreNetStates::TNoTagOrBearerPresentBlockedByStop) |
|
62 NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, CoreNetStates::TBindSelfToPresentBearer, CoreNetStates::TAwaitingBindToComplete, MeshMachine::TTag<CoreNetStates::KBearerPresent>) |
|
63 |
|
64 NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendNoBearer, MeshMachine::TAwaitingMessageState<TCFControlProvider::TBearer>, MeshMachine::TNoTagOrErrorTag) |
|
65 |
|
66 #ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW |
|
67 NODEACTIVITY_ENTRY(KNoTag, PRStates::TSendParamsToServiceProvider, CoreNetStates::TAwaitingParamResponse, CoreNetStates::TNoTagOrBearerPresent) |
|
68 #else |
|
69 NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TSendParamsToServiceProvider, CoreNetStates::TAwaitingParamResponse, CoreNetStates::TNoTagOrBearerPresent) |
|
70 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW |
|
71 NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, CoreNetStates::TStartServiceProviderRetry, CoreNetStates::TAwaitingStarted, MeshMachine::TNoTag) |
|
72 NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TStartSelf, CoreNetStates::TAwaitingDataClientStarted, MeshMachine::TNoTag) |
|
73 THROUGH_NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TSendDataClientRoutedToFlow, MeshMachine::TNoTag) |
|
74 LAST_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendStarted) |
|
75 LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing) |
|
76 NODEACTIVITY_END() |
|
77 } |
|
78 |
|
79 #ifndef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW |
|
80 namespace IPProtoSCprParamsRequest |
|
81 { |
|
82 DECLARE_DEFINE_NODEACTIVITY(ECFActivityParamRequest, IPProtoSCprSetParams, TCFScpr::TParamsRequest) |
|
83 FIRST_NODEACTIVITY_ENTRY(SCprStates::TAwaitingParamRequest, CoreNetStates::TNoTagOrBearerPresent) |
|
84 NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, SCprStates::TPassToServiceProvider, CoreNetStates::TAwaitingParamResponse, CoreNetStates::TBearerPresent) |
|
85 LAST_NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, SCprStates::TStoreParamsAndPostToOriginators) |
|
86 LAST_NODEACTIVITY_ENTRY(KNoTag, SCprStates::TStoreAndRespondWithCurrentParams) |
|
87 NODEACTIVITY_END() |
|
88 } |
|
89 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW |
|
90 |
|
91 namespace IPProtoSCprAgentEventActivity |
|
92 { |
|
93 DECLARE_DEFINE_NODEACTIVITY(IPProtoSCpr::EActivityAgentEvent, AgentEvent, TLinkMessage::TAgentEventNotification) |
|
94 NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TProcessAgentEvent, IPProtoSCpr::TAwaitingAgentEventNotification, MeshMachine::TNoTag) |
|
95 NODEACTIVITY_END() |
|
96 } |
|
97 |
|
98 //-========================================================= |
|
99 // Data Monitoring Activities |
|
100 //-========================================================= |
|
101 namespace IPProtoSCprDataMonitoringActivity |
|
102 { |
|
103 DECLARE_DEFINE_NODEACTIVITY(IPProtoSCpr::EActivityDataMonitoring, IPProtoSCprDataMonitoring, TCFDataMonitoringNotification::TDataMonitoringNotification) |
|
104 FIRST_NODEACTIVITY_ENTRY(IPProtoSCpr::TAwaitingDataMonitoringNotification, MeshMachine::TNoTag) |
|
105 LAST_NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TProcessDataMonitoringNotification) |
|
106 NODEACTIVITY_END() |
|
107 } |
|
108 |
|
109 namespace IPProtoSCprForwardStateChangeActivity |
|
110 { |
|
111 DECLARE_DEFINE_NODEACTIVITY(ECFActivityForwardStateChange, IPProtoSCprForwardStateChange, TCFMessage::TStateChange) |
|
112 FIRST_NODEACTIVITY_ENTRY(MeshMachine::TAwaitingMessageState<TCFMessage::TStateChange>, MeshMachine::TNoTag) |
|
113 LAST_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TForwardToControlProvider) |
|
114 NODEACTIVITY_END() |
|
115 } |
|
116 |
|
117 namespace IPProtoSCpr |
|
118 { |
|
119 DECLARE_DEFINE_ACTIVITY_MAP(stateMap) |
|
120 ACTIVITY_MAP_ENTRY(IPProtoSCprProvisionActivity, IPProtoSCprProvision) |
|
121 ACTIVITY_MAP_ENTRY(IPProtoSCprStartActivity, IPProtoSCprStart) |
|
122 ACTIVITY_MAP_ENTRY(IPProtoSCprDataMonitoringActivity, IPProtoSCprDataMonitoring) |
|
123 ACTIVITY_MAP_ENTRY(IPProtoSCprForwardStateChangeActivity, IPProtoSCprForwardStateChange) //Forward progress horizontally |
|
124 ACTIVITY_MAP_ENTRY(IPProtoSCprAgentEventActivity, AgentEvent) |
|
125 #ifndef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW |
|
126 ACTIVITY_MAP_ENTRY(IPProtoSCprParamsRequest, IPProtoSCprSetParams) |
|
127 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW |
|
128 ACTIVITY_MAP_END_BASE(SCprActivities, coreSCprActivities) |
|
129 } |
|
130 |
|
131 |
|
132 CIPProtoSubConnectionProvider::CIPProtoSubConnectionProvider(ESock::CSubConnectionProviderFactoryBase& aFactory) |
|
133 :CCoreSubConnectionProvider(aFactory, IPProtoSCpr::stateMap::Self()), |
|
134 ALegacySubConnectionActiveApiExt(this), |
|
135 TIfStaticFetcherNearestInHierarchy(this), |
|
136 iNotify(NULL), |
|
137 iControl(NULL) |
|
138 { |
|
139 LOG_NODE_CREATE(KIPProtoSCPRTag, CIPProtoSubConnectionProvider); |
|
140 } |
|
141 |
|
142 void CIPProtoSubConnectionProvider::ConstructL() |
|
143 { |
|
144 ADataMonitoringProvider::ConstructL(); |
|
145 CCoreSubConnectionProvider::ConstructL(KIPProtoSCPRPreallocatedActivityBufferSize); |
|
146 } |
|
147 |
|
148 |
|
149 void CIPProtoSubConnectionProvider::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage) |
|
150 { |
|
151 TNodeContext<CIPProtoSubConnectionProvider> ctx(*this, aMessage, aSender, aRecipient); |
|
152 ESOCK_DEBUG_MESSAGE_INTERCEPT(aSender, aMessage, aRecipient); |
|
153 CCoreSubConnectionProvider::ReceivedL(aSender, aRecipient, aMessage); |
|
154 User::LeaveIfError(ctx.iReturn); |
|
155 } |
|
156 |
|
157 CIPProtoSubConnectionProvider* CIPProtoSubConnectionProvider::NewL(ESock::CSubConnectionProviderFactoryBase& aFactory) |
|
158 { |
|
159 CIPProtoSubConnectionProvider* prov = new (ELeave) CIPProtoSubConnectionProvider(aFactory); |
|
160 CleanupStack::PushL(prov); |
|
161 prov->ConstructL(); |
|
162 CleanupStack::Pop(prov); |
|
163 return prov; |
|
164 } |
|
165 |
|
166 CIPProtoSubConnectionProvider::~CIPProtoSubConnectionProvider() |
|
167 { |
|
168 if (iControl) |
|
169 delete iControl; |
|
170 if (iNotify) |
|
171 delete iNotify; |
|
172 |
|
173 LOG_NODE_DESTROY(KIPProtoSCPRTag, CIPProtoSubConnectionProvider); |
|
174 } |
|
175 |
|
176 void CIPProtoSubConnectionProvider::ReturnInterfacePtrL(ADataMonitoringProtocolReq*& aInterface) |
|
177 { |
|
178 aInterface = this; |
|
179 } |
|
180 |
|
181 void CIPProtoSubConnectionProvider::ReturnInterfacePtrL(ESock::ALegacySubConnectionActiveApiExt*& aInterface) |
|
182 { |
|
183 aInterface = this; |
|
184 } |
|
185 |