|
1 // Copyright (c) 2002-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 // Name : CServerTransport.cpp |
|
15 // Part of : ConnectionMgr |
|
16 // Version : SIP/4.0 |
|
17 // |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 #include "CServerTransport.h" |
|
23 #include "MServerTransportOwner.h" |
|
24 #include "CSender.h" |
|
25 #include "CSenderTcp.h" |
|
26 #include "CReceiverTcp.h" |
|
27 #include "sipmessage.h" |
|
28 #include "CommonConsts.h" |
|
29 #include "CSocketContainer.h" |
|
30 #include "MSIPTransportRemovalObserver.h" |
|
31 #include "siperr.h" |
|
32 #include <sipnattraversalcontroller.h> |
|
33 |
|
34 const TInt CServerTransport::iOffset = _FOFF(CServerTransport, iLink); |
|
35 |
|
36 // ----------------------------------------------------------------------------- |
|
37 // CServerTransport::NewL |
|
38 // ----------------------------------------------------------------------------- |
|
39 // |
|
40 CServerTransport* CServerTransport::NewL( |
|
41 RSocketServ& aServer, |
|
42 MServerTransportOwner& aMyOwner, |
|
43 MTimerManager& aTimer, |
|
44 TUint aTOne, |
|
45 CSIPNATTraversalController& aNATTraversal, |
|
46 COwnerSettingsList& aSettingsList ) |
|
47 { |
|
48 CServerTransport* self = NewLC( aServer, |
|
49 aMyOwner, |
|
50 aTimer, |
|
51 aTOne, |
|
52 aNATTraversal, |
|
53 aSettingsList ); |
|
54 CleanupStack::Pop( self ); |
|
55 return self; |
|
56 } |
|
57 |
|
58 // ----------------------------------------------------------------------------- |
|
59 // CServerTransport::NewLC |
|
60 // ----------------------------------------------------------------------------- |
|
61 // |
|
62 CServerTransport* CServerTransport::NewLC( |
|
63 RSocketServ& aServer, |
|
64 MServerTransportOwner& aMyOwner, |
|
65 MTimerManager& aTimer, |
|
66 TUint aTOne, |
|
67 CSIPNATTraversalController& aNATTraversal, |
|
68 COwnerSettingsList& aSettingsList ) |
|
69 { |
|
70 CServerTransport* self = new (ELeave) CServerTransport( aMyOwner, |
|
71 aTimer, |
|
72 aNATTraversal, |
|
73 aSettingsList ); |
|
74 CleanupStack::PushL( self ); |
|
75 self->ConstructL( aServer, aTOne ); |
|
76 return self; |
|
77 } |
|
78 |
|
79 // ----------------------------------------------------------------------------- |
|
80 // CServerTransport::SendL |
|
81 // ----------------------------------------------------------------------------- |
|
82 // |
|
83 void CServerTransport::SendL( const TSIPTransportParams& aParams, |
|
84 CSIPMessage& aMessage, |
|
85 TRequestStatus &aStatus ) |
|
86 { |
|
87 if ( iAccepted && iSender ) |
|
88 { |
|
89 // Remember currently used tpparams |
|
90 iTransportParams = aParams; |
|
91 |
|
92 iSender->SendL( aParams, aMessage, aStatus ); |
|
93 StartTimerL(); |
|
94 } |
|
95 } |
|
96 |
|
97 // ----------------------------------------------------------------------------- |
|
98 // CServerTransport::Handle |
|
99 // ----------------------------------------------------------------------------- |
|
100 // |
|
101 TBool CServerTransport::Handle( const TInetAddr& aRemoteAddr ) |
|
102 { |
|
103 if ( iAccepted ) |
|
104 { |
|
105 TInetAddr connect; |
|
106 iSocket.RemoteName( connect ); |
|
107 if ( connect.CmpAddr( aRemoteAddr ) ) |
|
108 { |
|
109 return ETrue; |
|
110 } |
|
111 } |
|
112 return EFalse; |
|
113 } |
|
114 |
|
115 // ----------------------------------------------------------------------------- |
|
116 // CServerTransport::AcceptedL |
|
117 // ----------------------------------------------------------------------------- |
|
118 // |
|
119 void CServerTransport::AcceptedL() |
|
120 { |
|
121 __ASSERT_ALWAYS( !iSender && !iReceiver, User::Leave( KErrInUse ) ); |
|
122 |
|
123 iSocket.RemoteName( iRemoteAddr ); |
|
124 |
|
125 iReceiver = CReceiverTcp::NewL( *this ); |
|
126 iSender = CSenderTcp::NewL( *this, iSettingsList ); |
|
127 |
|
128 iReceiver->ReceiveDataL(); |
|
129 iAccepted = ETrue; |
|
130 } |
|
131 |
|
132 // ----------------------------------------------------------------------------- |
|
133 // CServerTransport::TransportParams |
|
134 // ----------------------------------------------------------------------------- |
|
135 // |
|
136 TSIPTransportParams& CServerTransport::TransportParams() |
|
137 { |
|
138 return iTransportParams; |
|
139 } |
|
140 |
|
141 // ----------------------------------------------------------------------------- |
|
142 // CServerTransport::CancelAllRequests |
|
143 // ----------------------------------------------------------------------------- |
|
144 // |
|
145 void CServerTransport::CancelAllRequests( TInt aReason ) |
|
146 { |
|
147 if ( iSender ) |
|
148 { |
|
149 iSender->CancelAllRequests( aReason ); |
|
150 } |
|
151 } |
|
152 |
|
153 // ----------------------------------------------------------------------------- |
|
154 // CServerTransport::Sender |
|
155 // ----------------------------------------------------------------------------- |
|
156 // |
|
157 CSender* CServerTransport::Sender() |
|
158 { |
|
159 return iSender; |
|
160 } |
|
161 |
|
162 // ----------------------------------------------------------------------------- |
|
163 // CServerTransport::SetPersistency |
|
164 // ----------------------------------------------------------------------------- |
|
165 // |
|
166 void CServerTransport::SetPersistency( TBool aIsPersistent ) |
|
167 { |
|
168 iIsPersistent = aIsPersistent; |
|
169 } |
|
170 |
|
171 // ----------------------------------------------------------------------------- |
|
172 // CServerTransport::IsPersistent |
|
173 // ----------------------------------------------------------------------------- |
|
174 // |
|
175 TBool CServerTransport::IsPersistent() const |
|
176 { |
|
177 return iIsPersistent; |
|
178 } |
|
179 |
|
180 // ----------------------------------------------------------------------------- |
|
181 // CServerTransport::InformSendingStatus |
|
182 // ----------------------------------------------------------------------------- |
|
183 // |
|
184 void CServerTransport::InformSendingStatus() |
|
185 { |
|
186 iNATTraversal.SocketIdle( !iIsSending, iSocket ); |
|
187 } |
|
188 |
|
189 // ----------------------------------------------------------------------------- |
|
190 // CServerTransport::Removal |
|
191 // ----------------------------------------------------------------------------- |
|
192 // |
|
193 TBool CServerTransport::Removal( MSIPNATBindingObserver& aBindingObserver ) |
|
194 { |
|
195 return ( iTransportParams.NATBindingObserver() == &aBindingObserver && |
|
196 IsPersistent() && |
|
197 !iMyOwner.IsReservedTransportOwner() ); |
|
198 } |
|
199 |
|
200 // ----------------------------------------------------------------------------- |
|
201 // CServerTransport::Shutdown |
|
202 // ----------------------------------------------------------------------------- |
|
203 // |
|
204 TBool CServerTransport::Shutdown( |
|
205 MSIPTransportRemovalObserver* aRemovalObserver ) |
|
206 { |
|
207 if ( iSender && iReceiver && aRemovalObserver ) |
|
208 { |
|
209 SetShutdownObserver( aRemovalObserver ); |
|
210 iReceiver->Cancel(); |
|
211 iSender->Cancel(); |
|
212 iReceiver->Shutdown(); |
|
213 return ETrue; |
|
214 } |
|
215 |
|
216 return EFalse; |
|
217 } |
|
218 |
|
219 // ----------------------------------------------------------------------------- |
|
220 // CServerTransport::TimerExpiredL |
|
221 // ----------------------------------------------------------------------------- |
|
222 // |
|
223 void CServerTransport::TimerExpiredL( TTimerId /*aTimerId*/, |
|
224 TAny* /*aTimerParam*/ ) |
|
225 { |
|
226 // Reserved transport uses persistent tcp connection and therefore |
|
227 // only send operations are cleared when timer expires |
|
228 if ( iMyOwner.IsReservedTransportOwner() || IsPersistent() ) |
|
229 { |
|
230 CancelAllRequests( KErrSIPTransportFailure ); |
|
231 } |
|
232 else |
|
233 { |
|
234 RemoveL(); |
|
235 } |
|
236 } |
|
237 |
|
238 // ----------------------------------------------------------------------------- |
|
239 // CServerTransport::SocketContainer |
|
240 // ----------------------------------------------------------------------------- |
|
241 // |
|
242 CSocketContainer& CServerTransport::SocketContainer() |
|
243 { |
|
244 return *iSocketContainer; |
|
245 } |
|
246 // ----------------------------------------------------------------------------- |
|
247 // CServerTransport::SocketContainer |
|
248 // ----------------------------------------------------------------------------- |
|
249 // |
|
250 CSocketContainer* CServerTransport::SocketContainer( |
|
251 TUint /*aIPAddrFamily*/) |
|
252 { |
|
253 return iSocketContainer; |
|
254 } |
|
255 |
|
256 // ----------------------------------------------------------------------------- |
|
257 // CServerTransport::ReceivedDataL |
|
258 // ----------------------------------------------------------------------------- |
|
259 // |
|
260 void CServerTransport::ReceivedDataL( CSIPMessage* aMessage, |
|
261 const TInetAddr& aRemoteAddr, |
|
262 TInt aError, |
|
263 TBool aCompressed ) |
|
264 { |
|
265 // As starting timer can leave, do it before passing ownership of aMessage |
|
266 StartTimerL(); |
|
267 iMyOwner.ReceiveL( aMessage, aRemoteAddr, aError, aCompressed ); |
|
268 } |
|
269 |
|
270 // ----------------------------------------------------------------------------- |
|
271 // CServerTransport::CancelSend |
|
272 // ----------------------------------------------------------------------------- |
|
273 // |
|
274 TBool CServerTransport::CancelSend( TRequestStatus& aStatus ) |
|
275 { |
|
276 if ( iSender ) |
|
277 { |
|
278 return iSender->FindAndCancel( aStatus ); |
|
279 } |
|
280 return EFalse; |
|
281 } |
|
282 |
|
283 // ----------------------------------------------------------------------------- |
|
284 // CServerTransport::Remove |
|
285 // Timer will remove this CServerTransport asynchronously |
|
286 // ----------------------------------------------------------------------------- |
|
287 // |
|
288 TInt CServerTransport::Remove() |
|
289 { |
|
290 TRAP_IGNORE( StartTimerL() ) |
|
291 return KErrNone; |
|
292 } |
|
293 |
|
294 // ----------------------------------------------------------------------------- |
|
295 // CServerTransport::StartTimerL |
|
296 // As starting new timer may fail, do it before stopping old timer |
|
297 // ----------------------------------------------------------------------------- |
|
298 // |
|
299 void CServerTransport::StartTimerL() |
|
300 { |
|
301 TTimerId timerId = iTimer.StartL( this, iTimerValue ); |
|
302 StopTimer(); |
|
303 iTimerId = timerId; |
|
304 } |
|
305 |
|
306 // ----------------------------------------------------------------------------- |
|
307 // CServerTransport::StopTimer |
|
308 // ----------------------------------------------------------------------------- |
|
309 // |
|
310 void CServerTransport::StopTimer() |
|
311 { |
|
312 iTimer.Stop( iTimerId ); |
|
313 } |
|
314 |
|
315 // ----------------------------------------------------------------------------- |
|
316 // CServerTransport::ReRouteL |
|
317 // ----------------------------------------------------------------------------- |
|
318 // |
|
319 void CServerTransport::ReRouteL( TUint /*aProtocol*/, |
|
320 COutgoingData* /*aData*/ ) |
|
321 { |
|
322 } |
|
323 |
|
324 // ----------------------------------------------------------------------------- |
|
325 // CServerTransport::DisconnectedL |
|
326 // ----------------------------------------------------------------------------- |
|
327 // |
|
328 TBool CServerTransport::DisconnectedL() |
|
329 { |
|
330 __ASSERT_ALWAYS( iReceiver && iSender, User::Leave( KErrNotFound ) ); |
|
331 |
|
332 iReceiver->Cancel(); |
|
333 iSender->Cancel(); |
|
334 COutgoingData* data( NULL ); |
|
335 while ( ( data = iSender->Data() ) != 0 ) |
|
336 { |
|
337 if ( !data->Message().IsRequest() ) |
|
338 { |
|
339 CleanupStack::PushL( data ); |
|
340 iMyOwner.ReRouteL( data ); |
|
341 CleanupStack::Pop( data ); |
|
342 } |
|
343 else |
|
344 { |
|
345 TRequestStatus* stat = data->Status(); |
|
346 User::RequestComplete( stat, KErrCouldNotConnect ); |
|
347 delete data; |
|
348 } |
|
349 } |
|
350 |
|
351 RemoveL(); |
|
352 |
|
353 return ETrue; |
|
354 } |
|
355 |
|
356 // ----------------------------------------------------------------------------- |
|
357 // CServerTransport::SigCompHandler |
|
358 // ----------------------------------------------------------------------------- |
|
359 // |
|
360 MSigCompController* CServerTransport::SigCompHandler() |
|
361 { |
|
362 return iMyOwner.SigCompHandler(); |
|
363 } |
|
364 |
|
365 // ----------------------------------------------------------------------------- |
|
366 // CServerTransport::IapId |
|
367 // ----------------------------------------------------------------------------- |
|
368 // |
|
369 TUint32 CServerTransport::IapId() |
|
370 { |
|
371 return iMyOwner.IapId(); |
|
372 } |
|
373 |
|
374 // ----------------------------------------------------------------------------- |
|
375 // CServerTransport::Sending |
|
376 // ----------------------------------------------------------------------------- |
|
377 // |
|
378 void CServerTransport::Sending( TBool aIsSending ) |
|
379 { |
|
380 iIsSending = aIsSending; |
|
381 iNATTraversal.SocketIdle( !iIsSending, iSocket ); |
|
382 } |
|
383 |
|
384 // ----------------------------------------------------------------------------- |
|
385 // CServerTransport::SetShutdownObserver |
|
386 // ----------------------------------------------------------------------------- |
|
387 // |
|
388 void CServerTransport::SetShutdownObserver( |
|
389 MSIPTransportRemovalObserver* aRemovalObserver ) |
|
390 { |
|
391 iShutdownObserver = aRemovalObserver; |
|
392 } |
|
393 |
|
394 // ----------------------------------------------------------------------------- |
|
395 // CServerTransport::HandleShutdownCompletion |
|
396 // ----------------------------------------------------------------------------- |
|
397 // |
|
398 void CServerTransport::HandleShutdownCompletion() |
|
399 { |
|
400 if ( iShutdownObserver ) |
|
401 { |
|
402 iShutdownObserver->RemovalCompleted( iTransportParams.TransportId() ); |
|
403 iShutdownObserver = 0; |
|
404 } |
|
405 } |
|
406 |
|
407 // ----------------------------------------------------------------------------- |
|
408 // CServerTransport::RemoveL |
|
409 // ----------------------------------------------------------------------------- |
|
410 // |
|
411 void CServerTransport::RemoveL() |
|
412 { |
|
413 MSIPTransportRemovalObserver* shutdownObserver = iShutdownObserver; |
|
414 iShutdownObserver = 0; |
|
415 iMyOwner.RemoveL( this, iRemoteAddr, shutdownObserver ); |
|
416 } |
|
417 |
|
418 // ----------------------------------------------------------------------------- |
|
419 // CServerTransport::~CServerTransport |
|
420 // ----------------------------------------------------------------------------- |
|
421 // |
|
422 CServerTransport::~CServerTransport() |
|
423 { |
|
424 HandleShutdownCompletion(); |
|
425 StopTimer(); |
|
426 delete iReceiver; |
|
427 delete iSender; |
|
428 delete iSocketContainer; |
|
429 iSocket.Close(); |
|
430 } |
|
431 |
|
432 // ----------------------------------------------------------------------------- |
|
433 // CServerTransport::CServerTransport |
|
434 // ----------------------------------------------------------------------------- |
|
435 // |
|
436 CServerTransport::CServerTransport( |
|
437 MServerTransportOwner& aMyOwner, |
|
438 MTimerManager& aTimer, |
|
439 CSIPNATTraversalController& aNATTraversal, |
|
440 COwnerSettingsList& aSettingsList ) : |
|
441 iMyOwner( aMyOwner ), |
|
442 iTimer( aTimer ), |
|
443 iNATTraversal( aNATTraversal ), |
|
444 iSettingsList( aSettingsList ), |
|
445 iTransportParams( KDefaultOwnerId, iMyOwner.IapId() ), |
|
446 iIsPersistent( EFalse ), |
|
447 iIsSending( EFalse ), |
|
448 iShutdownObserver( 0 ) |
|
449 { |
|
450 } |
|
451 |
|
452 // ----------------------------------------------------------------------------- |
|
453 // CServerTransport::ConstructL |
|
454 // ----------------------------------------------------------------------------- |
|
455 // |
|
456 void CServerTransport::ConstructL( RSocketServ& aServer, TUint aTOne ) |
|
457 { |
|
458 iTimerValue = ( 64 * aTOne ); |
|
459 iAccepted = EFalse; |
|
460 User::LeaveIfError( iSocket.Open( aServer ) ); |
|
461 iSocketContainer = CSocketContainer::NewL( iSocket ); |
|
462 } |