|
1 /* |
|
2 * Copyright (c) 2005 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 "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 |
|
21 #include <sipdialogassocbase.h> |
|
22 #include <sipdialog.h> |
|
23 #include "mcestateestablished.h" |
|
24 #include "mcesipsession.h" |
|
25 #include "mceactionset.h" |
|
26 #include "mcefcactionset.h" |
|
27 #include "mcenatmacros.h" |
|
28 #include "mcesdpsession.h" |
|
29 #include "mcesrvlogs.h" |
|
30 |
|
31 |
|
32 // ----------------------------------------------------------------------------- |
|
33 // CMceStateEstablished::CMceStateEstablished |
|
34 // ----------------------------------------------------------------------------- |
|
35 // |
|
36 CMceStateEstablished::CMceStateEstablished () |
|
37 : CMceState( KMceStateEstablished ) |
|
38 { |
|
39 } |
|
40 |
|
41 // ----------------------------------------------------------------------------- |
|
42 // CMceStateEstablished::~CMceStateEstablished |
|
43 // ----------------------------------------------------------------------------- |
|
44 // |
|
45 CMceStateEstablished::~CMceStateEstablished() |
|
46 { |
|
47 } |
|
48 |
|
49 // ----------------------------------------------------------------------------- |
|
50 // CMceStateEstablished::DoAcceptL |
|
51 // ----------------------------------------------------------------------------- |
|
52 // |
|
53 TBool CMceStateEstablished::DoAcceptL( TMceStateTransitionEvent& aEvent ) |
|
54 { |
|
55 if ( !IsExtensionRequestEvent( aEvent ) && |
|
56 aEvent.Code() == EMceResponse && |
|
57 MceSip::ResponseCode( aEvent.Session().Response() ) == KMceSipOK ) |
|
58 { |
|
59 return EFalse; |
|
60 } |
|
61 |
|
62 User::LeaveIfError( |
|
63 aEvent.Code() == EMceItcTerminateSession || |
|
64 aEvent.Code() == EMceItcUpdate || |
|
65 aEvent.Code() == EMceItcEnable || |
|
66 aEvent.Code() == EMceItcDisable || |
|
67 aEvent.Code() == EMceMediaSessionStopped || |
|
68 aEvent.Code() == EMceInvite || |
|
69 aEvent.Code() == EMceUpdate || |
|
70 aEvent.Code() == EMceBye || |
|
71 aEvent.Code() == EMceSessionExpired || |
|
72 aEvent.Code() == EMceSessionRefresh || |
|
73 aEvent.Code() == EMceSessionPending || |
|
74 aEvent.Code() == EMceErrorResponse || // 487 for CANCEL |
|
75 IsExtensionRequestEvent( aEvent ) |
|
76 |
|
77 ? KErrNone : KErrTotalLossOfPrecision ); |
|
78 |
|
79 return ETrue; |
|
80 } |
|
81 |
|
82 // ----------------------------------------------------------------------------- |
|
83 // CMceStateEstablished::StateEntry |
|
84 // ----------------------------------------------------------------------------- |
|
85 // |
|
86 void CMceStateEstablished::StateEntry( TMceStateTransitionEvent& aEvent ) |
|
87 { |
|
88 CMceState::StateEntry( aEvent ); |
|
89 |
|
90 CMceSipSession& session = aEvent.Session(); |
|
91 |
|
92 TBool clearSubState = ETrue; |
|
93 |
|
94 if ( &session.Response() ) |
|
95 { |
|
96 TUint code = MceSip::ResponseCode( session.Response() ); |
|
97 if ( code != KMceSipRequestPending ) |
|
98 { |
|
99 session.Actions().StopPendingTimer(); |
|
100 } |
|
101 else |
|
102 { |
|
103 clearSubState = EFalse; |
|
104 } |
|
105 } |
|
106 if ( clearSubState ) |
|
107 { |
|
108 session.SetSubState( CMceSipSession::ENone ); |
|
109 } |
|
110 |
|
111 session.CloseBodyBucket(); |
|
112 |
|
113 session.RemoveCompletedRequests( ETrue ); |
|
114 |
|
115 session.ResetSdpCounts(); |
|
116 |
|
117 } |
|
118 |
|
119 // ----------------------------------------------------------------------------- |
|
120 // CMceStateEstablished::EntryL |
|
121 // ----------------------------------------------------------------------------- |
|
122 // |
|
123 void CMceStateEstablished::EntryL( TMceStateTransitionEvent& aEvent ) |
|
124 { |
|
125 |
|
126 if ( IsExtensionRequestEvent( aEvent )) |
|
127 { |
|
128 HandleExtensionRequestEventL( aEvent ); |
|
129 } |
|
130 |
|
131 else |
|
132 { |
|
133 |
|
134 CMceSipSession& session = aEvent.Session(); |
|
135 |
|
136 switch ( aEvent.Code() ) |
|
137 { |
|
138 //client has been asked to update session |
|
139 case EMceItcUpdate: |
|
140 { |
|
141 EntryUpdateL( aEvent ); |
|
142 break; |
|
143 } |
|
144 //INVITE has been received due session update or refresh |
|
145 case EMceInvite: |
|
146 { |
|
147 EntryInviteL( aEvent ); |
|
148 break; |
|
149 } |
|
150 //UPDATE has been received for instance for session expires |
|
151 // or media update |
|
152 case EMceUpdate: |
|
153 { |
|
154 EntryInUpdateL( aEvent ); |
|
155 break; |
|
156 } |
|
157 //client terminates session or session timer expires, |
|
158 //when session is not refresher BYE is sent and media |
|
159 //and FC are stopped |
|
160 case EMceSessionExpired: |
|
161 case EMceItcTerminateSession: |
|
162 { |
|
163 EntryTerminateSessionL( aEvent ); |
|
164 break; |
|
165 } |
|
166 //BYE has been received |
|
167 case EMceBye: |
|
168 { |
|
169 EntryByeL( aEvent ); |
|
170 break; |
|
171 } |
|
172 //media conrol |
|
173 case EMceItcEnable: |
|
174 case EMceItcDisable: |
|
175 { |
|
176 EntryMediaL( aEvent ); |
|
177 break; |
|
178 } |
|
179 //refresher's session timer fired |
|
180 //and thus, refresh is launched (INVITE) |
|
181 case EMceSessionRefresh: |
|
182 { |
|
183 session.Actions().EncodeL(); |
|
184 session.FCActions().UpdateFCOfferL( *session.Offer() ); |
|
185 session.Actions().SendSessionRefreshL(); |
|
186 break; |
|
187 } |
|
188 //pending timer fired, re-send re-INVITE |
|
189 case EMceSessionPending: |
|
190 { |
|
191 session.Actions().SendInviteL(); |
|
192 break; |
|
193 } |
|
194 //media has beed stopped or there is media error |
|
195 //session state is not affected, client is only informed |
|
196 case EMceMediaSessionStopped: |
|
197 { |
|
198 MediaErrorOccured( aEvent ); |
|
199 break; |
|
200 } |
|
201 |
|
202 default: |
|
203 { |
|
204 //NOP |
|
205 break; |
|
206 } |
|
207 } |
|
208 } |
|
209 |
|
210 } |
|
211 |
|
212 // ----------------------------------------------------------------------------- |
|
213 // CMceStateEstablished::EntryUpdateL |
|
214 // ----------------------------------------------------------------------------- |
|
215 // |
|
216 void CMceStateEstablished::EntryUpdateL( TMceStateTransitionEvent& aEvent ) |
|
217 { |
|
218 CMceSipSession& session = aEvent.Session(); |
|
219 |
|
220 // create body candidate |
|
221 session.Actions().CreateBodyCandidateL( CMceComSession::EOutSession ); |
|
222 // update body candidate |
|
223 session.Actions().UpdateBodyL( aEvent.ParamIDs(), |
|
224 aEvent.ParamClientMessage() ); |
|
225 session.BodyCandidate()->iFcSignallingRequired = |
|
226 session.FCActions().NeedToSendOffer(); |
|
227 |
|
228 if ( &session.Body()->SdpSession() && |
|
229 session.Body()->SdpSession().iOOldSchoolCompleted ) |
|
230 { |
|
231 session.BodyCandidate()->iRequireSignalling = ETrue; |
|
232 session.Body()->SdpSession().iOOldSchoolCompleted = 0; |
|
233 } |
|
234 |
|
235 //create updated session (body) candidate |
|
236 TMceReturnStatus status = session.Actions().UpdateL(); |
|
237 |
|
238 aEvent.ParamStatus() = status; |
|
239 //if creation fails candidate is rolled back to original |
|
240 if ( MCE_IS_ERROR( status ) ) |
|
241 { |
|
242 session.Actions().UpdateFailed(); |
|
243 } |
|
244 else if ( status == KMceReady ) |
|
245 { |
|
246 if ( MCE_NEED_TO_SEND( session, NULL ) ) |
|
247 { |
|
248 NAT_WAIT_NO_EXEC( session, session.Actions().EncodeL() ); |
|
249 session.FCActions().UpdateFCOfferL( *session.Offer() ); |
|
250 session.Actions().SendInviteL(); |
|
251 |
|
252 session.Actions().StateChanged( KMceStateOffering ); |
|
253 session.Actions().ClientStateChanged( aEvent.ParamIDs(), |
|
254 CMceSession::EOffering ); |
|
255 } |
|
256 else |
|
257 { |
|
258 session.Actions().UpdateSucceed(); |
|
259 } |
|
260 } |
|
261 else |
|
262 { |
|
263 // NOP |
|
264 } |
|
265 } |
|
266 |
|
267 // ----------------------------------------------------------------------------- |
|
268 // CMceStateEstablished::EntryInUpdateL |
|
269 // ----------------------------------------------------------------------------- |
|
270 // |
|
271 void CMceStateEstablished::EntryInUpdateL(TMceStateTransitionEvent& aEvent) |
|
272 { |
|
273 CMceSipSession& session = aEvent.Session(); |
|
274 CSIPServerTransaction& request = session.Request(); |
|
275 CSIPServerTransaction* requestPtr = &request; |
|
276 TBool isRefreshing = EFalse; |
|
277 |
|
278 session.Actions().CheckContactIsSecureL(request); |
|
279 |
|
280 if ( (requestPtr!=NULL) && !MceSip::HasContent(request) ) |
|
281 { |
|
282 isRefreshing = ETrue; |
|
283 } |
|
284 else |
|
285 { |
|
286 // update extension information |
|
287 session.Extensions().UpdateL(session.Request() ); |
|
288 // create SDP |
|
289 User::LeaveIfError(session.Actions().CreateSDP(session.Request() ) ); |
|
290 |
|
291 if ( !session.DoesMediaManagerNeedToNegotiate( session.Offer() ) ) |
|
292 { |
|
293 // SDP not changed |
|
294 isRefreshing = ETrue; |
|
295 } |
|
296 } |
|
297 |
|
298 if (isRefreshing) |
|
299 { |
|
300 //set substate to refreshing |
|
301 session.SetSubState(CMceSipSession::ERefreshing); |
|
302 //update timer data in body |
|
303 session.Actions().ProcessSessionTimerServerL(session.Request() ); |
|
304 |
|
305 // Use previous offer |
|
306 session.SdpCleanup(session.Offer(), session.PrevOffer() ); |
|
307 |
|
308 // encode |
|
309 session.Actions().EncodeL(); |
|
310 |
|
311 //update FC in answer |
|
312 session.FCActions().UpdateFCAnswerL( *session.Offer() ); |
|
313 |
|
314 //reset session timer if session is not refresher |
|
315 session.Actions().ResetSessionTimerL(); |
|
316 session.Actions().SendAnswerL(session.Request() ); |
|
317 |
|
318 session.Actions().StateChanged( KMceStateEstablished ); |
|
319 session.Actions().ClientStateChangedL( CMceSession::EEstablished, session.Request() ); |
|
320 } |
|
321 else |
|
322 { |
|
323 // create body candidate |
|
324 session.Actions().CreateBodyCandidateL(CMceComSession::EInSession); |
|
325 |
|
326 TMceReturnStatus status = KErrNone; |
|
327 |
|
328 // decode |
|
329 TMceSipWarningCode warning = session.Actions().DecodeL(); |
|
330 |
|
331 if ( !warning) |
|
332 { |
|
333 status = session.Actions().Update(); |
|
334 if (status == KErrNotSupported) |
|
335 { |
|
336 warning = KMceSipWarnSessionDescriptionParameterNotUnderstood; |
|
337 } |
|
338 } |
|
339 |
|
340 aEvent.ParamStatus() = status; |
|
341 |
|
342 if (warning) |
|
343 { |
|
344 session.Actions().UpdateFailed(); |
|
345 session.Actions().SendRejectOfferWithWarningL(warning, session.Request() ); |
|
346 aEvent.ParamStatus() = warning; |
|
347 } |
|
348 else |
|
349 if ( MCE_IS_ERROR( status )) |
|
350 { |
|
351 session.Actions().UpdateFailed(); |
|
352 User::Leave(status); |
|
353 } |
|
354 else |
|
355 { |
|
356 session.Actions().ClientUpdateSessionL(session.Request() ); |
|
357 } |
|
358 } |
|
359 } |
|
360 |
|
361 // ----------------------------------------------------------------------------- |
|
362 // CMceStateEstablished::EntryInviteL |
|
363 // ----------------------------------------------------------------------------- |
|
364 // |
|
365 void CMceStateEstablished::EntryInviteL( TMceStateTransitionEvent& aEvent ) |
|
366 { |
|
367 CMceSipSession& session = aEvent.Session(); |
|
368 CSIPServerTransaction& request = session.Request(); |
|
369 CSIPServerTransaction* requestPtr = &request; |
|
370 |
|
371 session.Actions().CheckContactIsSecureL( request ); |
|
372 |
|
373 if ( (requestPtr!=NULL) && !MceSip::HasContent( request ) ) |
|
374 { |
|
375 // Pull Mode |
|
376 session.Extensions().UpdateL( request ); |
|
377 if ( MCE_NEED_TO_SEND( session, session.Offer() ) ) // is session update |
|
378 { |
|
379 // create body candidate for Pull mode |
|
380 session.Actions().CreateBodyCandidateL( |
|
381 CMceComSession::EInSession ); |
|
382 } |
|
383 session.Actions().ProcessSessionTimerServerL( session.Request() ); |
|
384 session.Actions().ClientUpdateSessionL( request ); |
|
385 } |
|
386 else |
|
387 { |
|
388 // update extension information |
|
389 session.Extensions().UpdateL( session.Request() ); |
|
390 // create SDP |
|
391 User::LeaveIfError( session.Actions().CreateSDP( session.Request() ) ); |
|
392 |
|
393 if ( session.DoesMediaManagerNeedToNegotiate( session.Offer() ) ) |
|
394 { |
|
395 // create body candidate |
|
396 session.Actions().CreateBodyCandidateL( CMceComSession::EInSession ); |
|
397 |
|
398 TMceReturnStatus status = KErrNone; |
|
399 |
|
400 // decode |
|
401 TMceSipWarningCode warning = session.Actions().DecodeL(); |
|
402 |
|
403 if ( !warning ) |
|
404 { |
|
405 status = session.Actions().Update(); |
|
406 if ( status == KErrNotSupported ) |
|
407 { |
|
408 warning = KMceSipWarnSessionDescriptionParameterNotUnderstood; |
|
409 } |
|
410 } |
|
411 |
|
412 aEvent.ParamStatus() = status; |
|
413 |
|
414 if ( warning ) |
|
415 { |
|
416 session.Actions().UpdateFailed(); |
|
417 session.Actions().SendRejectOfferWithWarningL( warning, |
|
418 session.Request() ); |
|
419 aEvent.ParamStatus() = warning; |
|
420 } |
|
421 else if ( MCE_IS_ERROR( status ) ) |
|
422 { |
|
423 session.Actions().UpdateFailed(); |
|
424 User::Leave( status ); |
|
425 } |
|
426 else |
|
427 { |
|
428 session.Actions().ClientUpdateSessionL( session.Request() ); |
|
429 } |
|
430 } |
|
431 else // SDP not changed |
|
432 { |
|
433 //set substate to refreshing |
|
434 session.SetSubState( CMceSipSession::ERefreshing ); |
|
435 //update timer data in body |
|
436 session.Actions().ProcessSessionTimerServerL( session.Request() ); |
|
437 |
|
438 // Use previous offer |
|
439 session.SdpCleanup( session.Offer(), session.PrevOffer() ); |
|
440 |
|
441 // encode |
|
442 session.Actions().EncodeL(); |
|
443 |
|
444 //update FC in answer |
|
445 session.FCActions().UpdateFCAnswerL( *session.Offer() ); |
|
446 |
|
447 session.Actions().SendAnswerL( session.Request() ); |
|
448 |
|
449 session.Actions().StateChanged( KMceStateAnswering ); |
|
450 session.Actions().ClientStateChangedL( CMceSession::EAnswering, |
|
451 session.Request() ); |
|
452 } |
|
453 } |
|
454 //reset session timer |
|
455 session.Actions().ResetSessionTimerL(); |
|
456 } |
|
457 |
|
458 // ----------------------------------------------------------------------------- |
|
459 // CMceStateEstablished::EntryTerminateSessionL |
|
460 // ----------------------------------------------------------------------------- |
|
461 // |
|
462 void CMceStateEstablished::EntryTerminateSessionL( |
|
463 TMceStateTransitionEvent& aEvent ) |
|
464 { |
|
465 CMceSipSession& session = aEvent.Session(); |
|
466 |
|
467 session.Actions().SendBYEL( aEvent.ParamClientMessage() ); |
|
468 session.Actions().StopMedia(); |
|
469 session.FCActions().ReleaseFC(); |
|
470 } |
|
471 |
|
472 // ----------------------------------------------------------------------------- |
|
473 // CMceStateEstablished::EntryByeL |
|
474 // ----------------------------------------------------------------------------- |
|
475 // |
|
476 void CMceStateEstablished::EntryByeL( TMceStateTransitionEvent& aEvent ) |
|
477 { |
|
478 CMceSipSession& session = aEvent.Session(); |
|
479 |
|
480 //send 200OK and stop media and FC |
|
481 session.Actions().Send200OKL( session.Request() ); |
|
482 session.Actions().StopMedia(); |
|
483 session.FCActions().ReleaseFC(); |
|
484 } |
|
485 |
|
486 // ----------------------------------------------------------------------------- |
|
487 // CMceStateEstablished::EntryMediaL |
|
488 // ----------------------------------------------------------------------------- |
|
489 // |
|
490 void CMceStateEstablished::EntryMediaL( TMceStateTransitionEvent& aEvent ) |
|
491 { |
|
492 CMceSipSession& session = aEvent.Session(); |
|
493 |
|
494 session.Actions().ControlMediaL( aEvent.ParamIDs(), |
|
495 (TMceItcFunctions)aEvent.Code() ); |
|
496 } |
|
497 |
|
498 |
|
499 |
|
500 // ----------------------------------------------------------------------------- |
|
501 // CMceStateEstablished::MediaErrorOccured |
|
502 // ----------------------------------------------------------------------------- |
|
503 // |
|
504 void CMceStateEstablished::MediaErrorOccured( TMceStateTransitionEvent& aEvent ) |
|
505 { |
|
506 MCESRV_DEBUG( "CMceStateEstablished::MediaErrorOccured, Entry" ); |
|
507 CMceSipSession& session = aEvent.Session(); |
|
508 |
|
509 // If ClientMediaStateChangedL leaves while trying to pause the RTP sink, |
|
510 // just trap and log it. |
|
511 TRAPD( err, session.Actions().ClientMediaStateChangedL( |
|
512 aEvent.ParamMccEvent(), |
|
513 static_cast<TMceMediaEventCode>( aEvent.Code() ) ) ); |
|
514 |
|
515 if ( err != KErrNone ) |
|
516 { |
|
517 MCESRV_DEBUG_DVALUE( "ClientMediaStateChangedL leaves with error code", err ); |
|
518 } |
|
519 |
|
520 MCESRV_DEBUG( "CMceStateEstablished::MediaErrorOccured, Exit" ); |
|
521 } |
|
522 |
|
523 |
|
524 // ----------------------------------------------------------------------------- |
|
525 // CMceStateEstablished::ExitL |
|
526 // ----------------------------------------------------------------------------- |
|
527 // |
|
528 void CMceStateEstablished::ExitL( TMceStateTransitionEvent& aEvent ) |
|
529 { |
|
530 |
|
531 if ( IsExtensionRequestEvent( aEvent )) |
|
532 { |
|
533 //Do Nothing; |
|
534 } |
|
535 |
|
536 else |
|
537 { |
|
538 CMceSipSession& session = aEvent.Session(); |
|
539 TInt status = aEvent.ParamStatus(); |
|
540 |
|
541 switch ( aEvent.Code() ) |
|
542 { |
|
543 //received BYE causes server & client to terminated state |
|
544 case EMceBye: |
|
545 { |
|
546 session.Actions().StateChanged( KMceStateTerminated ); |
|
547 session.Actions().ClientStateChangedL( |
|
548 CMceSession::ETerminated, session.Request() ); |
|
549 break; |
|
550 } |
|
551 //client's session termination causes |
|
552 //server & client to terminating state |
|
553 case EMceItcTerminateSession: |
|
554 { |
|
555 session.Actions().StateChanged( KMceStateTerminating ); |
|
556 session.Actions().ClientStateChanged( |
|
557 aEvent.ParamIDs(), CMceSession::ETerminating ); |
|
558 break; |
|
559 } |
|
560 //timer expiration causes server & client to terminating state |
|
561 case EMceSessionExpired: |
|
562 { |
|
563 session.Actions().StateChanged( KMceStateTerminating ); |
|
564 session.Actions().ClientStateChangedL( CMceSession::ETerminating ); |
|
565 break; |
|
566 } |
|
567 //session refresh causes server & client to terminating state |
|
568 case EMceSessionRefresh: |
|
569 { |
|
570 session.Actions().StateChanged( KMceStateOffering ); |
|
571 session.Actions().ClientStateChangedL( CMceSession::EOffering ); |
|
572 break; |
|
573 } |
|
574 case EMceSessionPending: |
|
575 { |
|
576 session.Actions().StateChanged( KMceStateOffering ); |
|
577 session.Actions().ClientStateChangedL( CMceSession::EOffering ); |
|
578 break; |
|
579 } |
|
580 |
|
581 case EMceItcUpdate: |
|
582 { |
|
583 //client's update,if decoding has been failed |
|
584 //or update is not deeded, does not affect |
|
585 if ( MCE_IS_ERROR( status ) ) |
|
586 { |
|
587 //Client will fetch original session with ITC |
|
588 session.Actions().StateChanged( KMceStateEstablished ); |
|
589 session.Actions().ClientStateChanged( aEvent.ParamIDs(), |
|
590 CMceSession::EEstablished, |
|
591 status ); |
|
592 } |
|
593 else if ( status == KMceAsync ) |
|
594 { |
|
595 session.Actions().StateChanged( KMceStateClientEstablishing ); |
|
596 session.Actions().ClientStateChanged( aEvent.ParamIDs(), |
|
597 CMceSession::EOffering ); |
|
598 } |
|
599 else if ( status == KMceReady ) |
|
600 { |
|
601 session.Actions().StateChanged( KMceStateEstablished ); |
|
602 session.Actions().ClientStateChanged( |
|
603 aEvent.ParamIDs(), |
|
604 CMceSession::EEstablished ); |
|
605 } |
|
606 else |
|
607 { |
|
608 // NOP |
|
609 } |
|
610 break; |
|
611 } |
|
612 case EMceUpdate: |
|
613 { |
|
614 if ( session.SubState() == CMceSipSession::ERefreshing ) |
|
615 { |
|
616 session.Actions().StateChanged(KMceStateEstablished); |
|
617 |
|
618 // If warning occurred, client is not informed |
|
619 if ( MCE_IS_ERROR( status )) |
|
620 { |
|
621 session.Actions().ClientStateChangedL(CMceSession::EEstablished, status); |
|
622 } |
|
623 } |
|
624 else |
|
625 { |
|
626 session.Actions().StateChanged( KMceStateServerEstablishing ); |
|
627 } |
|
628 break; |
|
629 } |
|
630 case EMceInvite: |
|
631 { |
|
632 if ( status == KErrNone ) |
|
633 { |
|
634 session.Actions().StateChanged( KMceStateServerEstablishing ); |
|
635 } |
|
636 else |
|
637 { |
|
638 session.Actions().StateChanged( KMceStateEstablished ); |
|
639 |
|
640 // If warning occurred, client is not informed |
|
641 if ( MCE_IS_ERROR( status ) ) |
|
642 { |
|
643 session.Actions().ClientStateChangedL( |
|
644 CMceSession::EEstablished, status ); |
|
645 } |
|
646 } |
|
647 break; |
|
648 } |
|
649 default: |
|
650 { |
|
651 } |
|
652 } |
|
653 } |
|
654 } |
|
655 |
|
656 // End of File |