|
1 /* |
|
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of the License "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * |
|
16 */ |
|
17 |
|
18 |
|
19 |
|
20 #include "cmodematsrv.h" |
|
21 #include "modematclientsrv.h" |
|
22 #include "modematsecpolicy.h" |
|
23 #include "cmodematsession.h" |
|
24 #include "cmodemathandler.h" |
|
25 #include "modemattrace.h" |
|
26 #include "catmessage.h" |
|
27 |
|
28 |
|
29 CModemAtSrv::CModemAtSrv( TInt aPriority ) : |
|
30 CPolicyServer( aPriority, KSrvPolicy ), iHandler(NULL) |
|
31 { |
|
32 } |
|
33 |
|
34 CModemAtSrv::~CModemAtSrv() |
|
35 { |
|
36 C_TRACE (( _L(">>CModemAtSrv::~CModemAtSrv()") )); |
|
37 iAtMessageArray.ResetAndDestroy(); |
|
38 iAtMessageArray.Close(); |
|
39 C_TRACE (( _L("<<CModemAtSrv::~CModemAtSrv()") )); |
|
40 } |
|
41 |
|
42 CModemAtSrv* CModemAtSrv::NewLC() |
|
43 { |
|
44 CModemAtSrv* self = new (ELeave) CModemAtSrv( EPriorityNormal ); |
|
45 CleanupStack::PushL( self ); |
|
46 self->ConstructL(); |
|
47 self->StartL( KATExtSrvName ); |
|
48 RThread().SetPriority( EPriorityNormal ); |
|
49 return self; |
|
50 } |
|
51 |
|
52 void CModemAtSrv::RemovePipe( const TUint8 aDteId ) |
|
53 { |
|
54 C_TRACE((_L("CModemAtSrv::RemovePipe()") )); |
|
55 iHandler->RemovePipe( aDteId ); |
|
56 } |
|
57 |
|
58 void CModemAtSrv::ClientClosed( CModemAtSession* aSession ) |
|
59 { |
|
60 C_TRACE (( _L("CModemAtSrv::ClientClosed()") )); |
|
61 TInt index = iSessions.Find( aSession ); |
|
62 if( index >= 0 ) |
|
63 { |
|
64 //remove session from routing table, if dteId exists |
|
65 if(iSessions[index]->GetDteId() != KInitialDteId ) |
|
66 { |
|
67 iRouteTable[ iSessions[index]->GetPluginType() ][ iSessions[index]->GetDteId() ] = NULL; |
|
68 } |
|
69 |
|
70 if( iSessions.Count() == 1 ) |
|
71 { |
|
72 C_TRACE((_L("Disconnecting ISI message handler ") )); |
|
73 iHandler->Disconnect( iSessions[ index ]->GetDteId() ); |
|
74 } |
|
75 |
|
76 C_TRACE((_L("Removing session (plugin type %d dteid: %d)"), iSessions[index]->GetPluginType(), iSessions[index]->GetDteId() )); |
|
77 iSessions.Remove( index ); |
|
78 |
|
79 C_TRACE((_T("<<CModemAtSrv::ClientClosed()") )); |
|
80 } |
|
81 } |
|
82 |
|
83 CSession2* CModemAtSrv::NewSessionL( const TVersion& aVersion, |
|
84 const RMessage2& /*aMessage*/ ) const |
|
85 { |
|
86 C_TRACE (( _T("CModemAtSrv::NewSessionL()") )); |
|
87 CModemAtSrv& thisServer = const_cast<CModemAtSrv&>( *this ); |
|
88 CModemAtSession* session = CModemAtSession::NewL( thisServer, aVersion ); |
|
89 CleanupStack::PushL( session ); |
|
90 thisServer.iSessions.AppendL( session ); |
|
91 CleanupStack::Pop( session ); |
|
92 return session; |
|
93 } |
|
94 |
|
95 void CModemAtSrv::ConstructL() |
|
96 { |
|
97 C_TRACE (( _T("CModemAtSrv::ConstructL()") )); |
|
98 iHandler = CModemAtHandler::NewL( *this ); |
|
99 |
|
100 //setup routing table |
|
101 for( TInt i = 0 ; i < KPluginCount ; i++) |
|
102 { |
|
103 for(TInt o = 0; o < KMaxDteIdCount; o++) |
|
104 { |
|
105 iRouteTable[ i ][ o ] = NULL; |
|
106 } |
|
107 } |
|
108 } |
|
109 |
|
110 void CModemAtSrv::HandleSignalInd( const TInt aDteId ) |
|
111 { |
|
112 C_TRACE ((_T("CModemAtSrv::HandleSignalInd aDteId = %d sessions = %d"), aDteId, iSessions.Count() )); |
|
113 for( TInt i = 0; i < iSessions.Count(); i++ ) |
|
114 { |
|
115 if( iSessions[i]->GetDteId() == aDteId && iSessions[i]->IsSignalIndReqActive() ) |
|
116 { |
|
117 C_TRACE (( _T("CModemAtSrv::HandleSignalInd() session found") )); |
|
118 iSessions[i]->SignalIndReceived(); |
|
119 } |
|
120 } |
|
121 } |
|
122 |
|
123 void CModemAtSrv::HandleUnsolicitedData( const TInt aDteId, const TDesC8& aData ) |
|
124 { |
|
125 C_TRACE ((_T("CModemAtSrv::HandleUnsolicitedData aDteId = %d sessions = %d"), aDteId, iSessions.Count() )); |
|
126 for( TInt i = 0; i < iSessions.Count(); i++ ) |
|
127 { |
|
128 if( (iSessions[i]->GetDteId() == aDteId || aDteId == KUnsolicitedDataDteId )&& |
|
129 iSessions[i]->IsUnsolicitedDataReqActive() && |
|
130 iSessions[i]->GetPluginType() == EATExtPlugin ) |
|
131 { |
|
132 C_TRACE (( _T("CModemAtSrv::HandleUnsolicitedData() session found") )); |
|
133 iSessions[i]->UnsolicitedData( aData ); |
|
134 } |
|
135 } |
|
136 } |
|
137 |
|
138 void CModemAtSrv::HandleCommandModeChange( TInt aDteId, TCommandMode aMode ) |
|
139 { |
|
140 C_TRACE ((_T("CModemAtSrv::HandleCommandModeChange aDteId = %d sessions = %d mode = %d"), aDteId, iSessions.Count(), (TInt) aMode )); |
|
141 for( TInt i = 0; i < iSessions.Count(); i++ ) |
|
142 { |
|
143 if( iSessions[i]->GetDteId() == aDteId && |
|
144 iSessions[i]->IsCommandModeReqActive() && |
|
145 iSessions[i]->GetPluginType() == ECommonPlugin ) |
|
146 { |
|
147 C_TRACE (( _T("CModemAtSrv::HandleCommandModeChange() session found") )); |
|
148 iSessions[i]->CommandModeChanged( aMode ); |
|
149 } |
|
150 } |
|
151 } |
|
152 |
|
153 void CModemAtSrv::BroadcastModemConnected(const TUint aDteId, TInt aErr ) |
|
154 { |
|
155 C_TRACE ((_T("CModemAtSrv::BroadcastModemConnected aDteId = %d err = %d sessions = %d"), aDteId, aErr, iSessions.Count() )); |
|
156 for( TInt i = 0; i < iSessions.Count(); i++ ) |
|
157 { |
|
158 if( iSessions[i]->GetDteId() == aDteId && iSessions[i]->IsConnectReqActive() ) |
|
159 { |
|
160 C_TRACE (( _T("CModemAtSrv::BroadcastModemConnected() session found") )); |
|
161 iSessions[i]->ModemConnected( aErr ); |
|
162 } |
|
163 } |
|
164 } |
|
165 |
|
166 void CModemAtSrv::HandleIntermediateDataInd( const TInt aDteId, |
|
167 const TATPluginInterface aPluginType, |
|
168 const TDesC8& aResponse, |
|
169 const TUint8 aCommand ) |
|
170 { |
|
171 C_TRACE ((_T("CModemAtSrv::HandleIntermediateDataInd aDteId = %d sessions = %d "), aDteId, iSessions.Count() )); |
|
172 C_TRACE ((_T("plugintype = %d command = %d"), (TInt)aPluginType, aCommand )); |
|
173 |
|
174 if ( iAtMessageArray.Count() > 0 ) |
|
175 { |
|
176 C_TRACE((_L("iAtMessageArray[0]->ReceiveATResponse Intermediate data"))); |
|
177 iAtMessageArray[0]->ReceiveATResponse( aResponse, EFalse ); |
|
178 } |
|
179 else |
|
180 { |
|
181 C_TRACE ((_T("CModemAtSrv::HandleIntermediateDataInd INTERMEDIATE DATA received but no request active") )); |
|
182 } |
|
183 } |
|
184 |
|
185 void CModemAtSrv::HandleATResponse( const TInt aDteId, const TDesC8& aResponse, const TUint8 aCommand ) |
|
186 { |
|
187 C_TRACE ((_T(">>CModemAtSrv::HandleATResponse aDteId = %d sessions = %d "), aDteId, iSessions.Count() )); |
|
188 C_TRACE ((_T("CModemAtSrv::HandleATResponse command = %d"), aCommand )); |
|
189 |
|
190 if ( iAtMessageArray.Count() > 0 ) |
|
191 { |
|
192 CAtMessage* tmp = iAtMessageArray[0]; |
|
193 C_TRACE((_L("iAtMessageArray[0]->ReceiveATResponse 0x%x"), tmp )); |
|
194 tmp->ReceiveATResponse( aResponse, ETrue ); |
|
195 C_TRACE((_L("CModemAtSrv::HandleATResponse Remove the first message in Fifo"))); |
|
196 RemoveFirstFromSendFifo(); |
|
197 C_TRACE((_L("CModemAtSrv::HandleATResponse SendNextFromFifo"))); |
|
198 SendNextFromFifo(); |
|
199 } |
|
200 else |
|
201 { |
|
202 HandleUnsolicitedData( aDteId, aResponse); |
|
203 } |
|
204 C_TRACE ((_T("<<CModemAtSrv::HandleATResponse()") )); |
|
205 } |
|
206 |
|
207 void CModemAtSrv::ConnectToModem(CModemAtSession* aSession) |
|
208 { |
|
209 C_TRACE ((_T(">>CModemAtSrv::ConnectToModem 0x%x"), aSession)); |
|
210 TInt type = aSession->GetPluginType(); |
|
211 |
|
212 C_TRACE(( _L("session count: %d, type: %d"), iSessions.Count(), type )); |
|
213 //find already defined dteid |
|
214 for(TInt i = 0; i < iSessions.Count(); i++) |
|
215 { |
|
216 TInt dteid = iSessions[i]->GetDteId(); |
|
217 TDesC8& name = iSessions[i]->GetName(); |
|
218 C_TRACE((_L("i: %d, dteid: %d"), i, dteid)); |
|
219 |
|
220 //Is there plugin with samename |
|
221 if( name.Compare(aSession->GetName())== 0 && dteid != KInitialDteId ) |
|
222 { |
|
223 if( type == iSessions[i]->GetPluginType()) |
|
224 { |
|
225 TRACE_ASSERT_ALWAYS; |
|
226 aSession->SetDteId( dteid ); |
|
227 aSession->ModemConnected((TInt)KErrAlreadyExists); |
|
228 C_TRACE ((_T("<<CModemAtSrv::ConnectToModem 0x%x"), aSession)); |
|
229 return; |
|
230 } |
|
231 //add current session to route table |
|
232 C_TRACE((_L("AddSessionToRouteTable type: %d, dteid: %d"), type, aSession->GetDteId())); |
|
233 iRouteTable[aSession->GetPluginType()][dteid] = aSession; |
|
234 C_TRACE((_L("Interface exists=> %d"),dteid)); |
|
235 |
|
236 aSession->SetDteId( dteid ); |
|
237 aSession->ModemConnected(KErrNone); //connected |
|
238 C_TRACE ((_T("<<CModemAtSrv::ConnectToModem 0x%x"), aSession)); |
|
239 return; |
|
240 } |
|
241 } |
|
242 |
|
243 //no AT-plugin& Common plugin, find first free dteid |
|
244 TInt dteId = 0; |
|
245 while(iRouteTable[0][dteId] || iRouteTable[1][dteId]) |
|
246 { |
|
247 dteId++; |
|
248 } |
|
249 ASSERT_PANIC_ALWAYS( dteId < KMaxDteIdCount ); |
|
250 iRouteTable[type][dteId] = aSession; |
|
251 C_TRACE((_L("Added new dteid: %d"),dteId)); |
|
252 |
|
253 aSession->SetDteId(dteId); |
|
254 iHandler->Connect(dteId); |
|
255 C_TRACE ((_T("<<CModemAtSrv::ConnectToModem 0x%x"), aSession)); |
|
256 } |
|
257 |
|
258 void CModemAtSrv::AddToSendFifo( const TUint8 aDteId, |
|
259 const TATPluginInterface aPluginType, |
|
260 CAtMessage* aMessage ) |
|
261 { |
|
262 C_TRACE (( _T("CModemAtSrv::AddToSendFifo( dteId = %d,0x%x)"), aDteId, aMessage )); |
|
263 |
|
264 iAtMessageArray.Append( aMessage ); // only one AT command at the time in modem |
|
265 |
|
266 if( iAtMessageArray.Count() == 1 ) //if empty Fifo send immediately |
|
267 { |
|
268 C_TRACE((_L("Sending message immediately"))); |
|
269 iHandler->SendATCommand( aDteId, |
|
270 aPluginType, |
|
271 aMessage->GetMessageType(), |
|
272 aMessage->GetBuffer() ); |
|
273 } |
|
274 } |
|
275 |
|
276 void CModemAtSrv::RemoveFirstFromSendFifo() |
|
277 { |
|
278 C_TRACE(( _T("CModemAtSrv::RemoveFirstFromSendFifo iAtMessageArray.Count = %d"), iAtMessageArray.Count() )); |
|
279 if( iAtMessageArray.Count( ) > 0 ) |
|
280 { |
|
281 C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 1") )); |
|
282 CAtMessage* msg = iAtMessageArray[0]; |
|
283 C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 2 0x%x"), msg )); |
|
284 iAtMessageArray.Remove(0); |
|
285 if( msg ) |
|
286 { |
|
287 C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 3") )); |
|
288 delete msg; |
|
289 } |
|
290 else |
|
291 { |
|
292 TRACE_ASSERT_ALWAYS; |
|
293 } |
|
294 C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 4") )); |
|
295 } |
|
296 C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 5") )); |
|
297 } |
|
298 |
|
299 void CModemAtSrv::SendNextFromFifo() |
|
300 { |
|
301 C_TRACE ((_T("CModemAtSrv::SendNextFromFifo fifo has %d message(s)"), iAtMessageArray.Count() )); |
|
302 |
|
303 TPtr8 ptr(0,0); |
|
304 if( iAtMessageArray.Count() > 0 ) |
|
305 { |
|
306 C_TRACE((_L("Messages in buffer... Sending message"))); |
|
307 ptr.Set( iAtMessageArray[0]->GetBuffer() ); |
|
308 |
|
309 C_TRACE (( _T("iHandler->SendATCommand()") )); |
|
310 iHandler->SendATCommand( iAtMessageArray[0]->GetSession()->GetDteId(), |
|
311 iAtMessageArray[0]->GetSession()->GetPluginType(), |
|
312 iAtMessageArray[0]->GetMessageType(), |
|
313 ptr ); |
|
314 } |
|
315 } |
|
316 |
|
317 void CModemAtSrv::CancelFifoRequests( const CModemAtSession* aSession ) |
|
318 { |
|
319 C_TRACE((_T(">>CModemAtSrv::CancelFifoRequests count: %d"), iAtMessageArray.Count() )); |
|
320 TInt messageCount = iAtMessageArray.Count(); |
|
321 for( TInt i = 0; i < messageCount; i++ ) |
|
322 { |
|
323 C_TRACE((_T("CancelFifoRequests %d"), i )); |
|
324 CAtMessage* msg = iAtMessageArray[ i ]; |
|
325 if( msg ) |
|
326 { |
|
327 C_TRACE((_T("Found Request: 0x%x"),msg )); |
|
328 if( msg->GetSession() == aSession) |
|
329 { |
|
330 C_TRACE((_T("CancelFifoRequests - canceling request") )); |
|
331 msg->CancelRequest(); |
|
332 C_TRACE (( _T("CModemAtSrv::CancelFifoRequest delete msg") )); |
|
333 delete msg; |
|
334 } |
|
335 } |
|
336 } |
|
337 C_TRACE (( _T("CModemAtSrv::CancelFifoRequest iAtMessageArray.Remove %d messages"), messageCount )); |
|
338 for( TInt j = 0; j < messageCount && iAtMessageArray.Count() > 0; j++ ) |
|
339 { |
|
340 iAtMessageArray.Remove( 0 ); |
|
341 } |
|
342 C_TRACE(( _T("<<CModemAtSrv::CancelFifoRequests()") )); |
|
343 } |
|
344 |
|
345 TInt CModemAtSrv::SessionCount() |
|
346 { |
|
347 C_TRACE(( _T("CModemAtSrv::SessionCount() %d"), iSessions.Count() )); |
|
348 return iSessions.Count(); |
|
349 } |
|
350 |