|
1 // Copyright (c) 2007-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 "ctsysystemstateplugin.h" |
|
17 #include <ctsy/tflogger.h> |
|
18 |
|
19 CCtsySystemStatePlugin* CCtsySystemStatePlugin::NewL() |
|
20 { |
|
21 CCtsySystemStatePlugin* self = new (ELeave)CCtsySystemStatePlugin(); |
|
22 CleanupStack::PushL(self); |
|
23 self->ConstructL(); |
|
24 CleanupStack::Pop(self); |
|
25 return self; |
|
26 } |
|
27 |
|
28 CCtsySystemStatePlugin::CCtsySystemStatePlugin() |
|
29 { |
|
30 } |
|
31 |
|
32 void CCtsySystemStatePlugin::ConstructL() |
|
33 { |
|
34 // create active object for do RF state changing |
|
35 iAoChangeRfForEmergencyCall = new (ELeave) CChangeRfForEmergencyCall(*this, iSsmEmergencyCallRf); |
|
36 } |
|
37 |
|
38 CCtsySystemStatePlugin::~CCtsySystemStatePlugin() |
|
39 { |
|
40 if (iAoChangeRfForEmergencyCall) |
|
41 { |
|
42 delete iAoChangeRfForEmergencyCall; |
|
43 } |
|
44 } |
|
45 |
|
46 |
|
47 // --------------------------------------------------------------------------- |
|
48 // CCtsySystemStatePlugin::Connect |
|
49 // Try to connect to RSsmEmergencyCallRfAdaptation |
|
50 // returns KErrNone if success, otherwise -- error code |
|
51 // --------------------------------------------------------------------------- |
|
52 TInt CCtsySystemStatePlugin::Connect() |
|
53 { |
|
54 TFLOGSTRING("CCtsySystemStatePlugin::Connect()"); |
|
55 |
|
56 TInt error (KErrNone); |
|
57 if (!iConnected) |
|
58 { |
|
59 error = iSsmEmergencyCallRf.Connect(); |
|
60 if (KErrNone == error) |
|
61 { |
|
62 iConnected = ETrue; |
|
63 } |
|
64 } |
|
65 return error; |
|
66 } |
|
67 |
|
68 // --------------------------------------------------------------------------- |
|
69 // CCtsySystemStatePlugin::ActivateRfForEmergencyCall |
|
70 // Calls RSsmEmergencyCallRfAdaptation::ActivateRfForEmergencyCall |
|
71 // returns KErrNotReady if there is no connection to CCtsySystemStatePlugin, |
|
72 // otherwise -- error code returned from CCtsySystemStatePlugin |
|
73 // --------------------------------------------------------------------------- |
|
74 void CCtsySystemStatePlugin::ActivateRfForEmergencyCall(MCtsySsmPluginCallback* aSsmPluginCallback, |
|
75 TCtsySsmCallbackData& aCallbackData) |
|
76 { |
|
77 TFLOGSTRING("CCtsySystemStatePlugin::ActivateRfForEmergencyCall()" ); |
|
78 //try to connect |
|
79 TInt err = Connect(); |
|
80 if (err) |
|
81 { |
|
82 TFLOGSTRING2("CCtsySystemStatePlugin::ActivateRfForEmergencyCall() failed to connect %d", err); |
|
83 |
|
84 // inform CTSY about error... |
|
85 aSsmPluginCallback->SsmPluginCallback(err, aCallbackData); |
|
86 // and do nothing |
|
87 return; |
|
88 } |
|
89 |
|
90 iAoChangeRfForEmergencyCall->ActivateRfForEmergencyCall(aSsmPluginCallback, aCallbackData); |
|
91 } |
|
92 |
|
93 // --------------------------------------------------------------------------- |
|
94 // CCtsySystemStatePlugin::DeactivateRfAfterEmergencyCall |
|
95 // Calls RSsmEmergencyCallRfAdaptation::DeactivateRfAfterEmergencyCall |
|
96 // returns KErrNotReady if there is no connection to CCtsySystemStatePlugin, |
|
97 // otherwise -- error code returned from CCtsySystemStatePlugin |
|
98 // --------------------------------------------------------------------------- |
|
99 void CCtsySystemStatePlugin::DeactivateRfAfterEmergencyCall() |
|
100 { |
|
101 TFLOGSTRING("CCtsySystemStatePlugin::DeactivateRfForEmergencyCall()" ); |
|
102 //try to connect |
|
103 TInt err = Connect(); |
|
104 if (err) |
|
105 { |
|
106 TFLOGSTRING2("CCtsySystemStatePlugin::DeactivateRfAfterEmergencyCall() failed to connect %d", err); |
|
107 //do nothing |
|
108 return; |
|
109 } |
|
110 |
|
111 iAoChangeRfForEmergencyCall->DeactivateRfAfterEmergencyCall(); |
|
112 } |
|
113 |
|
114 // --------------------------------------------------------------------------- |
|
115 // CCtsySystemStatePlugin::Close |
|
116 // Close connection to RSsmEmergencyCallRfAdaptation |
|
117 // --------------------------------------------------------------------------- |
|
118 void CCtsySystemStatePlugin::Close() |
|
119 { |
|
120 TFLOGSTRING("CCtsySystemStatePlugin::Close()" ); |
|
121 if (iConnected) |
|
122 { |
|
123 // if there is some request... |
|
124 if (CChangeRfForEmergencyCall::ENotBusy != iAoChangeRfForEmergencyCall->Busy()) |
|
125 { |
|
126 // ... cancel it |
|
127 iSsmEmergencyCallRf.Cancel(); |
|
128 } |
|
129 |
|
130 iSsmEmergencyCallRf.Close(); |
|
131 iConnected = EFalse; |
|
132 } |
|
133 } |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 |
|
139 // --------------------------------------------------------------------------- |
|
140 // Active object for changing RF State |
|
141 // --------------------------------------------------------------------------- |
|
142 CChangeRfForEmergencyCall::CChangeRfForEmergencyCall(CCtsySystemStatePlugin& aCtsySystemStatePlugin, |
|
143 RSsmEmergencyCallRfAdaptation& aSsmEmergencyCallRf) : |
|
144 CActive(EPriorityStandard), |
|
145 iCtsySystemStatePlugin(aCtsySystemStatePlugin), |
|
146 iSsmEmergencyCallRf(aSsmEmergencyCallRf) |
|
147 { |
|
148 CActiveScheduler::Add(this); |
|
149 } |
|
150 |
|
151 // --------------------------------------------------------------------------- |
|
152 // Destructor for Active object |
|
153 // --------------------------------------------------------------------------- |
|
154 CChangeRfForEmergencyCall::~CChangeRfForEmergencyCall() |
|
155 { |
|
156 Cancel(); |
|
157 } |
|
158 |
|
159 // --------------------------------------------------------------------------- |
|
160 // Active object ActivateRfForEmergencyCall |
|
161 // --------------------------------------------------------------------------- |
|
162 void CChangeRfForEmergencyCall::ActivateRfForEmergencyCall(MCtsySsmPluginCallback* aSsmPluginCallback, |
|
163 TCtsySsmCallbackData& aCallbackData) |
|
164 { |
|
165 TFLOGSTRING("CChangeRfForEmergencyCall::ActivateRfForEmergencyCall()" ); |
|
166 |
|
167 if (EDeactivateBusy == iBusy) |
|
168 { |
|
169 // cancel any request |
|
170 Cancel(); |
|
171 iBusy = ENotBusy; |
|
172 } |
|
173 else if (EActivateBusy == iBusy) |
|
174 { |
|
175 if (aSsmPluginCallback) |
|
176 { |
|
177 aSsmPluginCallback->SsmPluginCallback(KErrServerBusy, aCallbackData); |
|
178 } |
|
179 return; |
|
180 } |
|
181 |
|
182 // store pointer to callback interface |
|
183 iSsmPluginCallback = aSsmPluginCallback; |
|
184 |
|
185 // copy data for callback |
|
186 iCallbackData.iReqHandle = aCallbackData.iReqHandle; |
|
187 RMobileENStore::TEmergencyNumber* number; |
|
188 aCallbackData.iNumberPackage.UnPackData(&number); |
|
189 iCallbackData.iNumberPackage.PackData(number); |
|
190 |
|
191 iSsmEmergencyCallRf.ActivateRfForEmergencyCall(iStatus); |
|
192 iBusy = EActivateBusy; |
|
193 |
|
194 SetActive(); |
|
195 } |
|
196 |
|
197 // --------------------------------------------------------------------------- |
|
198 // Active object DeactivateRfAfterEmergencyCall |
|
199 // --------------------------------------------------------------------------- |
|
200 void CChangeRfForEmergencyCall::DeactivateRfAfterEmergencyCall() |
|
201 { |
|
202 TFLOGSTRING("CChangeRfForEmergencyCall::DeactivateRfAfterEmergencyCall()" ); |
|
203 |
|
204 // if we've already sent request |
|
205 if (EActivateBusy == iBusy) |
|
206 { |
|
207 // cancel any request |
|
208 Cancel(); |
|
209 iBusy = ENotBusy; |
|
210 iSsmPluginCallback = NULL; // to prevent calling of callback (but I think there shoul be Cancel) |
|
211 return; |
|
212 } |
|
213 else if (EDeactivateBusy == iBusy) |
|
214 { |
|
215 // do nothing |
|
216 return; |
|
217 } |
|
218 |
|
219 iSsmEmergencyCallRf.DeactivateRfForEmergencyCall(iStatus); |
|
220 iBusy = EDeactivateBusy; |
|
221 |
|
222 SetActive(); |
|
223 } |
|
224 // --------------------------------------------------------------------------- |
|
225 // Active object Busy method |
|
226 // --------------------------------------------------------------------------- |
|
227 TBool CChangeRfForEmergencyCall::Busy() |
|
228 { |
|
229 return iBusy; |
|
230 } |
|
231 |
|
232 // --------------------------------------------------------------------------- |
|
233 // RunL for Active object |
|
234 // --------------------------------------------------------------------------- |
|
235 void CChangeRfForEmergencyCall::RunL() |
|
236 { |
|
237 iBusy = ENotBusy; |
|
238 |
|
239 // close SSM |
|
240 iCtsySystemStatePlugin.Close(); |
|
241 if (iSsmPluginCallback) |
|
242 { |
|
243 // just call callback interface and pass into it error code |
|
244 iSsmPluginCallback->SsmPluginCallback(iStatus.Int(), iCallbackData); |
|
245 iSsmPluginCallback = NULL; |
|
246 } |
|
247 } |
|
248 |
|
249 // --------------------------------------------------------------------------- |
|
250 // Cancel for Active object |
|
251 // --------------------------------------------------------------------------- |
|
252 void CChangeRfForEmergencyCall::DoCancel() |
|
253 { |
|
254 iSsmEmergencyCallRf.Cancel(); |
|
255 iBusy = ENotBusy; |
|
256 } |
|
257 |