|
1 /* |
|
2 * Copyright (c) 2007-2008 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 FILES |
|
21 #include "cmmphonetsender.h" |
|
22 #include "cmmconferencecallmesshandler.h" |
|
23 #include "cmmstaticutility.h" |
|
24 #include "cmmcallmesshandler.h" |
|
25 #include "cmmmessagerouter.h" |
|
26 #include "tsylogger.h" |
|
27 #include "osttracedefinitions.h" |
|
28 |
|
29 #include <etelmm.h> |
|
30 #include <tisi.h> |
|
31 #include <call_modemisi.h> |
|
32 #include <ctsy/pluginapi/cmmdatapackage.h> |
|
33 |
|
34 #ifdef OST_TRACE_COMPILER_IN_USE |
|
35 #include "cmmconferencecallmesshandlertraces.h" |
|
36 #endif |
|
37 |
|
38 // EXTERNAL DATA STRUCTURES |
|
39 // None |
|
40 |
|
41 // EXTERNAL FUNCTION PROTOTYPES |
|
42 // None |
|
43 |
|
44 // CONSTANTS |
|
45 const TUint8 KConfCallPadding = 0x00; // Filler byte for ISI messages |
|
46 |
|
47 // MACROS |
|
48 // None |
|
49 |
|
50 // LOCAL CONSTANTS AND MACROS |
|
51 // None |
|
52 |
|
53 // MODULE DATA STRUCTURES |
|
54 // None |
|
55 |
|
56 // LOCAL FUNCTION PROTOTYPES |
|
57 // None |
|
58 |
|
59 // ======================= LOCAL FUNCTIONS ===================================== |
|
60 // None |
|
61 |
|
62 // ==================== MEMBER FUNCTIONS ======================================= |
|
63 |
|
64 // ----------------------------------------------------------------------------- |
|
65 // CMmConferenceCallMessHandler::CMmConferenceCallMessHandler |
|
66 // C++ default constructor |
|
67 // ----------------------------------------------------------------------------- |
|
68 // |
|
69 CMmConferenceCallMessHandler::CMmConferenceCallMessHandler() |
|
70 { |
|
71 // None |
|
72 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CMmConferenceCallMessHandler"); |
|
73 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CMMCONFERENCECALLMESSHANDLER, "CMmConferenceCallMessHandler::CMmConferenceCallMessHandler" ); |
|
74 } |
|
75 |
|
76 // ----------------------------------------------------------------------------- |
|
77 // CMmConferenceCallMessHandler::NewL |
|
78 // Creates a new CMmConferenceCallMessHandler object instance. |
|
79 // ----------------------------------------------------------------------------- |
|
80 // |
|
81 CMmConferenceCallMessHandler* CMmConferenceCallMessHandler::NewL( |
|
82 CMmPhoNetSender* aPhoNetSender, //pointer to the phonet sender |
|
83 CMmPhoNetReceiver* aPhoNetReceiver, //pointer to the phonet receiver |
|
84 CMmMessageRouter* aMessageRouter// pointer to the message router |
|
85 ) |
|
86 { |
|
87 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::NewL"); |
|
88 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_NEWL, "CMmConferenceCallMessHandler::NewL" ); |
|
89 |
|
90 CMmConferenceCallMessHandler* conferenceCallMessHandler = |
|
91 new ( ELeave ) CMmConferenceCallMessHandler(); |
|
92 |
|
93 CleanupStack::PushL( conferenceCallMessHandler ); |
|
94 conferenceCallMessHandler->iPhoNetSender = aPhoNetSender; |
|
95 conferenceCallMessHandler->iMessageRouter = aMessageRouter; |
|
96 conferenceCallMessHandler->ConstructL(); |
|
97 |
|
98 aPhoNetReceiver->RegisterL( |
|
99 conferenceCallMessHandler, |
|
100 PN_MODEM_CALL, |
|
101 CALL_MODEM_CONTROL_IND ); |
|
102 aPhoNetReceiver->RegisterL( |
|
103 conferenceCallMessHandler, |
|
104 PN_MODEM_CALL, |
|
105 CALL_MODEM_CONTROL_RESP ); |
|
106 aPhoNetReceiver->RegisterL( |
|
107 conferenceCallMessHandler, |
|
108 PN_MODEM_CALL, |
|
109 CALL_MODEM_RELEASE_RESP ); |
|
110 |
|
111 CleanupStack::Pop( conferenceCallMessHandler ); |
|
112 |
|
113 return conferenceCallMessHandler; |
|
114 } |
|
115 |
|
116 // ----------------------------------------------------------------------------- |
|
117 // CMmConferenceCallMessHandler::ConstructL |
|
118 // Initialises object attributes. |
|
119 // ----------------------------------------------------------------------------- |
|
120 // |
|
121 void CMmConferenceCallMessHandler::ConstructL() |
|
122 { |
|
123 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ConstructL"); |
|
124 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CONSTRUCTL, "CMmConferenceCallMessHandler::ConstructL" ); |
|
125 |
|
126 iIsCreateConference = EFalse; |
|
127 iLastOperation = 0; |
|
128 } |
|
129 |
|
130 // ----------------------------------------------------------------------------- |
|
131 // CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler |
|
132 // C++ destructor |
|
133 // ----------------------------------------------------------------------------- |
|
134 // |
|
135 CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler() |
|
136 { |
|
137 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler"); |
|
138 OstTrace0( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_CMMCONFERENCECALLMESSHANDLER, "CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler" ); |
|
139 } |
|
140 |
|
141 // ----------------------------------------------------------------------------- |
|
142 // CMmConferenceCallMessHandler::ExtFuncL |
|
143 // Forwards requests coming from the Symbian OS layer to the |
|
144 // specific method. |
|
145 // ----------------------------------------------------------------------------- |
|
146 // |
|
147 TInt CMmConferenceCallMessHandler::ExtFuncL( |
|
148 TInt aIpc, |
|
149 const CMmDataPackage* aDataPackage ) |
|
150 { |
|
151 TFLOGSTRING2("TSY: CMmConferenceCallMessHandler::ExtFuncL. Ipc:%d", aIpc); |
|
152 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_EXTFUNCL, "CMmConferenceCallMessHandler::ExtFuncL" ); |
|
153 |
|
154 TInt ret( KErrNone ); |
|
155 TUint8 transId( KConferenceCallTransId ); |
|
156 |
|
157 switch( aIpc ) |
|
158 { |
|
159 case EMobileConferenceCallAddCall: |
|
160 { |
|
161 // A CCallDataPackage is expected here |
|
162 const CCallDataPackage* callDataPackage = |
|
163 static_cast<const CCallDataPackage*>( aDataPackage ); |
|
164 |
|
165 TUint8 isaCallId( CALL_MODEM_ID_NONE ); |
|
166 TInt eTelCallId( KSymbianCallIdNone ); |
|
167 RMobilePhone::TMobileService service( |
|
168 RMobilePhone::EServiceUnspecified ); |
|
169 // Unpack ETel call ID parameter |
|
170 callDataPackage->GetCallIdAndMode( eTelCallId, service ); |
|
171 // Map to ISA call ID |
|
172 isaCallId = MapETelCallIdToISACallId( eTelCallId ); |
|
173 if ( CALL_MODEM_ID_NONE == isaCallId ) |
|
174 { |
|
175 ret = KErrArgument; |
|
176 } |
|
177 else |
|
178 { |
|
179 ret = CallControlReq( |
|
180 transId, |
|
181 isaCallId, |
|
182 CALL_MODEM_OP_CONFERENCE_BUILD, |
|
183 EFalse ); |
|
184 } |
|
185 break; |
|
186 } |
|
187 case EMobileConferenceCallCreateConference: |
|
188 { |
|
189 // No data to unpack |
|
190 ret = CallControlReq( |
|
191 transId, |
|
192 CALL_MODEM_ID_ACTIVE, |
|
193 CALL_MODEM_OP_CONFERENCE_BUILD, |
|
194 ETrue ); |
|
195 break; |
|
196 } |
|
197 case EMobileConferenceCallSwap: |
|
198 { |
|
199 // No data to unpack |
|
200 ret = CallControlReq( |
|
201 transId, |
|
202 CALL_MODEM_ID_ACTIVE, |
|
203 CALL_MODEM_OP_SWAP, |
|
204 EFalse ); |
|
205 break; |
|
206 } |
|
207 case EMobileConferenceCallHangUp: |
|
208 { |
|
209 // No data to unpack |
|
210 ret = CallReleaseReq( |
|
211 transId, |
|
212 CALL_MODEM_ID_CONFERENCE, |
|
213 CALL_MODEM_CAUSE_RELEASE_BY_USER ); |
|
214 break; |
|
215 } |
|
216 // No DOS call is required for the following Conference Call IPCs: |
|
217 // Notifications |
|
218 case EMobileConferenceCallNotifyCapsChange: |
|
219 case EMobileConferenceCallNotifyConferenceStatusChange: |
|
220 case EMobileConferenceCallNotifyConferenceEvent: |
|
221 // Cancellations |
|
222 case EMobileConferenceCallNotifyCapsChangeCancel: |
|
223 case EMobileConferenceCallCreateConferenceCancel: |
|
224 case EMobileConferenceCallAddCallCancel: |
|
225 case EMobileConferenceCallSwapCancel: |
|
226 case EMobileConferenceCallHangUpCancel: |
|
227 case EMobileConferenceCallNotifyConferenceStatusChangeCancel: |
|
228 case EMobileConferenceCallNotifyConferenceEventCancel: |
|
229 // Query methods (do not change any state) |
|
230 case EMobileConferenceCallGetCaps: |
|
231 case EMobileConferenceCallEnumerateCalls: |
|
232 case EMobileConferenceCallGetMobileCallInfo: |
|
233 case EMobileConferenceCallGetConferenceStatus: |
|
234 default: |
|
235 { |
|
236 TFLOGSTRING2("TSY: CMmConferenceCallMessHandler::ExtFuncL - Unknown IPC: %d", aIpc); |
|
237 OstTrace1( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_EXTFUNCL, "CMmConferenceCallMessHandler::ExtFuncL - Unknown IPC=%d", aIpc ); |
|
238 ret = KErrNotSupported; |
|
239 break; |
|
240 } |
|
241 } |
|
242 return ret; |
|
243 } |
|
244 |
|
245 // ----------------------------------------------------------------------------- |
|
246 // CMmConferenceCallMessHandler::MapETelCallIdToISACallId |
|
247 // Utility function that maps an ETel call id to a call id |
|
248 // in ISA Call Server's format. |
|
249 // ----------------------------------------------------------------------------- |
|
250 // |
|
251 TUint8 CMmConferenceCallMessHandler::MapETelCallIdToISACallId( |
|
252 const TInt aETelCallId ) |
|
253 { |
|
254 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::MapETelCallIdToISACallId"); |
|
255 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_MAPETELCALLIDTOISACALLID, "CMmConferenceCallMessHandler::MapETelCallIdToISACallId" ); |
|
256 |
|
257 TUint8 callId( CALL_MODEM_ID_NONE ); |
|
258 |
|
259 if ( CALL_MODEM_ID_1 > aETelCallId || CALL_MODEM_ID_7 < aETelCallId ) |
|
260 { |
|
261 callId = CALL_MODEM_ID_NONE; |
|
262 } |
|
263 else |
|
264 { |
|
265 callId = static_cast<TUint8>( aETelCallId ); |
|
266 } |
|
267 |
|
268 return callId; |
|
269 } |
|
270 |
|
271 // ----------------------------------------------------------------------------- |
|
272 // CMmConferenceCallMessHandler::ReceiveMessageL |
|
273 // Called when an ISI message has been received. |
|
274 // ----------------------------------------------------------------------------- |
|
275 // |
|
276 void CMmConferenceCallMessHandler::ReceiveMessageL( |
|
277 const TIsiReceiveC& aIsiMsg ) |
|
278 { |
|
279 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ReceiveMessageL."); |
|
280 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_RECEIVEMESSAGEL, "CMmConferenceCallMessHandler::ReceiveMessageL" ); |
|
281 |
|
282 TInt resource( aIsiMsg.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) ); |
|
283 TInt messageId( aIsiMsg.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) ); |
|
284 |
|
285 switch( resource ) |
|
286 { |
|
287 case PN_MODEM_CALL: |
|
288 { |
|
289 switch( messageId ) |
|
290 { |
|
291 case CALL_MODEM_CONTROL_IND: |
|
292 { |
|
293 CallControlInd( aIsiMsg ); |
|
294 break; |
|
295 } |
|
296 case CALL_MODEM_CONTROL_RESP: |
|
297 { |
|
298 CallControlResp( aIsiMsg ); |
|
299 break; |
|
300 } |
|
301 case CALL_MODEM_RELEASE_RESP: |
|
302 { |
|
303 CallReleaseResp( aIsiMsg ); |
|
304 break; |
|
305 } |
|
306 default: |
|
307 { |
|
308 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ReceiveMessageL. PN_CALL Switch messageID case default."); |
|
309 OstTrace0( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_RECEIVEMESSAGEL, "CMmConferenceCallMessHandler::ReceiveMessageL. PN_CALL Switch messageID case default" ); |
|
310 break; |
|
311 } |
|
312 } |
|
313 break; // Case PN_CALL |
|
314 } |
|
315 default: |
|
316 { |
|
317 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ReceiveMessageL. Switch resource case default."); |
|
318 OstTrace0( TRACE_NORMAL, DUP2_CMMCONFERENCECALLMESSHANDLER_RECEIVEMESSAGEL, "CMmConferenceCallMessHandler::ReceiveMessageL. Switch resource case default" ); |
|
319 break; |
|
320 } |
|
321 } |
|
322 } |
|
323 |
|
324 // ----------------------------------------------------------------------------- |
|
325 // CMmConferenceCallMessHandler::CallControlReq |
|
326 // Sends Conference call related control requests to the Phonet |
|
327 // ----------------------------------------------------------------------------- |
|
328 // |
|
329 TInt CMmConferenceCallMessHandler::CallControlReq( |
|
330 TUint8 aTransactionId, |
|
331 TUint8 aCallId, |
|
332 TUint8 aOperation, |
|
333 TBool aIsCreateConference ) |
|
334 { |
|
335 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallControlReq"); |
|
336 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLCONTROLREQ, "CMmConferenceCallMessHandler::CallControlReq" ); |
|
337 |
|
338 // Data for ISI message |
|
339 TBuf8<2 + SIZE_CALL_MODEM_SB_OPERATION> messageBuf; |
|
340 |
|
341 messageBuf.Append( aCallId ); |
|
342 |
|
343 messageBuf.Append( 1 ); // Number of Subblocks |
|
344 |
|
345 // Set value if this is conference call creation request or not. |
|
346 iIsCreateConference = aIsCreateConference; |
|
347 |
|
348 // Save control operation |
|
349 iLastOperation = aOperation; |
|
350 |
|
351 // Call control request sub blocks |
|
352 messageBuf.Append( CALL_MODEM_SB_OPERATION ); |
|
353 messageBuf.Append( SIZE_CALL_MODEM_SB_OPERATION ); |
|
354 messageBuf.Append( aOperation ); |
|
355 // Call operation sub block, no operation info used |
|
356 messageBuf.Append( KConfCallPadding ); // Padding |
|
357 |
|
358 // Call conrol req |
|
359 // Send message via phonet |
|
360 return iPhoNetSender->Send( |
|
361 PN_MODEM_CALL, |
|
362 aTransactionId, |
|
363 CALL_MODEM_CONTROL_REQ, |
|
364 messageBuf ); |
|
365 } |
|
366 |
|
367 // ----------------------------------------------------------------------------- |
|
368 // CMmConferenceCallMessHandler::CallControlResp |
|
369 // Breaks a CALL_MODEM_CONTROL_RESP ISI-message. Completes failed |
|
370 // CreateConference, AddCall or Swap API request if there is a cause sub |
|
371 // block in this response |
|
372 // ----------------------------------------------------------------------------- |
|
373 // |
|
374 void CMmConferenceCallMessHandler::CallControlResp( |
|
375 const TIsiReceiveC& aIsiMsg ) |
|
376 { |
|
377 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallControlResp"); |
|
378 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLCONTROLRESP, "CMmConferenceCallMessHandler::CallControlResp" ); |
|
379 |
|
380 TUint sbStartOffSet( 0 ); |
|
381 |
|
382 // Try to find CALL_MODEM_SB_CAUSE subblock. If found something has gone wrong. |
|
383 if ( KErrNone == aIsiMsg.FindSubBlockOffsetById( |
|
384 ISI_HEADER_SIZE + SIZE_CALL_MODEM_CONTROL_RESP, |
|
385 CALL_MODEM_SB_CAUSE, |
|
386 EIsiSubBlockTypeId8Len8, |
|
387 sbStartOffSet ) ) |
|
388 { |
|
389 // CALL_CAUSE sub block found, something has gone wrong. |
|
390 // Get cause type |
|
391 TUint8 causeType( aIsiMsg.Get8bit( |
|
392 sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE ) ); |
|
393 // Get cause value |
|
394 TUint8 causeValue( aIsiMsg.Get8bit( |
|
395 sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ) ); |
|
396 |
|
397 // Get Symbian OS error value |
|
398 TInt result( CMmStaticUtility::CSCauseToEpocError( |
|
399 PN_MODEM_CALL, |
|
400 causeType, |
|
401 causeValue ) ); |
|
402 |
|
403 // If last operation was build, CreateConference or AddCall was asked |
|
404 if ( CALL_MODEM_OP_CONFERENCE_BUILD == iLastOperation ) |
|
405 { |
|
406 // Has CreateConference been requested last. |
|
407 if ( iIsCreateConference ) |
|
408 { |
|
409 // Complete with error |
|
410 iMessageRouter->Complete( |
|
411 EMobileConferenceCallCreateConference, |
|
412 result ); |
|
413 // Reset flag |
|
414 iIsCreateConference = EFalse; |
|
415 } |
|
416 else |
|
417 { |
|
418 // Must be response to AddCall request |
|
419 iMessageRouter->Complete( |
|
420 EMobileConferenceCallAddCall, |
|
421 result ); |
|
422 } |
|
423 iLastOperation = 0; |
|
424 } |
|
425 // If last operation was hold or retrieve |
|
426 else if ( CALL_MODEM_OP_HOLD == iLastOperation || |
|
427 CALL_MODEM_OP_RETRIEVE == iLastOperation ) |
|
428 { |
|
429 // Complete swap with error |
|
430 iMessageRouter->Complete( |
|
431 EMobileConferenceCallSwap, |
|
432 result ); |
|
433 } |
|
434 // No else |
|
435 } |
|
436 // No else |
|
437 } |
|
438 |
|
439 // ----------------------------------------------------------------------------- |
|
440 // CMmConferenceCallMessHandler::CallControlInd |
|
441 // Breaks a CALL_CONTROL_IND ISI-message. Completes failed |
|
442 // CreateConference, AddCall or Swap API request if there is a cause sub |
|
443 // block in this response. In case that this message contains Split operation |
|
444 // sub block, inform ConferenceCallTsy that GoOneToOne handling has started |
|
445 // ----------------------------------------------------------------------------- |
|
446 // |
|
447 void CMmConferenceCallMessHandler::CallControlInd( |
|
448 const TIsiReceiveC& aIsiMsg ) |
|
449 { |
|
450 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallControlInd"); |
|
451 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLCONTROLIND, "CMmConferenceCallMessHandler::CallControlInd" ); |
|
452 |
|
453 TUint sbStartOffSet( 0 ); |
|
454 |
|
455 // Try to find CALL_MODEM_SB_CAUSE subblock. If found something has gone wrong |
|
456 if( KErrNone == aIsiMsg.FindSubBlockOffsetById( |
|
457 ISI_HEADER_SIZE + SIZE_CALL_MODEM_CONTROL_IND, |
|
458 CALL_MODEM_SB_CAUSE, |
|
459 EIsiSubBlockTypeId8Len8, |
|
460 sbStartOffSet ) ) |
|
461 { |
|
462 // CALL_MODEM_SB_CAUSE sub block found, something has gone wrong. |
|
463 // Get cause type |
|
464 TUint8 causeType( aIsiMsg.Get8bit( |
|
465 sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE ) ); |
|
466 // Get cause value |
|
467 TUint8 causeValue( aIsiMsg.Get8bit( |
|
468 sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ) ); |
|
469 |
|
470 // Get Symbian OS error value |
|
471 TInt result( CMmStaticUtility::CSCauseToEpocError( |
|
472 PN_MODEM_CALL, |
|
473 causeType, |
|
474 causeValue ) ); |
|
475 |
|
476 // If last operation was build, CreateConference or AddCall was asked |
|
477 if ( CALL_MODEM_OP_CONFERENCE_BUILD == iLastOperation ) |
|
478 { |
|
479 // Has CreateConference been requested last. |
|
480 if ( iIsCreateConference ) |
|
481 { |
|
482 // Complete with error |
|
483 iMessageRouter->Complete( |
|
484 EMobileConferenceCallCreateConference, |
|
485 result); |
|
486 // Reset flag |
|
487 iIsCreateConference = EFalse; |
|
488 } |
|
489 else |
|
490 { |
|
491 // Must be response to AddCall request |
|
492 iMessageRouter->Complete( |
|
493 EMobileConferenceCallAddCall, |
|
494 result ); |
|
495 } |
|
496 iLastOperation = 0; |
|
497 } |
|
498 // if last operation was hold or retrieve |
|
499 else if ( CALL_MODEM_OP_HOLD == iLastOperation || |
|
500 CALL_MODEM_OP_RETRIEVE == iLastOperation ) |
|
501 { |
|
502 // Complete swap with error |
|
503 iMessageRouter->Complete( |
|
504 EMobileConferenceCallSwap, |
|
505 result ); |
|
506 } |
|
507 // No else |
|
508 } |
|
509 // Successful operation handling for operations |
|
510 // Initiated bypassing the ETel (ghost operetion). |
|
511 else if ( !iIsCreateConference && 0 == iLastOperation ) |
|
512 { |
|
513 TUint8 callOperation( 0 ); |
|
514 // Get call Id (three bits (1-3) contain unique call ID) |
|
515 TInt uniqueCallId( static_cast<TInt>( aIsiMsg.Get8bit( |
|
516 ISI_HEADER_SIZE + CALL_MODEM_CONTROL_IND_OFFSET_CALLID ) |
|
517 & KMaskBits1to3 ) ); |
|
518 |
|
519 // Get call operation sub block |
|
520 if ( KErrNone == aIsiMsg.FindSubBlockOffsetById( |
|
521 ISI_HEADER_SIZE + CALL_MODEM_CONTROL_IND_OFFSET_OPERATION, |
|
522 CALL_MODEM_SB_OPERATION, |
|
523 EIsiSubBlockTypeId8Len8, |
|
524 sbStartOffSet ) ) |
|
525 { |
|
526 TInt symbianConferenceEvent( -1 ); |
|
527 // Get call operation |
|
528 callOperation = aIsiMsg.Get8bit( |
|
529 sbStartOffSet + CALL_MODEM_SB_OPERATION_OFFSET_OPERATION ); |
|
530 |
|
531 TFLOGSTRING2("TSY: CMmConferenceCallMessHandler::CallControlInd - Call operation: %d", callOperation); |
|
532 OstTraceExt1( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_CALLCONTROLIND, "CMmConferenceCallMessHandler::CallControlInd;callOperation=%hhu", callOperation ); |
|
533 // Purpose of this case is to prepare handling of externally |
|
534 // controlled conference call |
|
535 switch ( callOperation ) |
|
536 { |
|
537 case CALL_MODEM_OP_CONFERENCE_BUILD: |
|
538 { |
|
539 symbianConferenceEvent = |
|
540 RMobileConferenceCall::EConferenceBuilt; |
|
541 break; |
|
542 } |
|
543 case CALL_MODEM_OP_HOLD: |
|
544 case CALL_MODEM_OP_SWAP: |
|
545 { |
|
546 symbianConferenceEvent = |
|
547 RMobileConferenceCall::EConferenceSwapped; |
|
548 break; |
|
549 } |
|
550 case CALL_MODEM_OP_CONFERENCE_SPLIT: |
|
551 { |
|
552 symbianConferenceEvent = |
|
553 RMobileConferenceCall::EConferenceSplit; |
|
554 break; |
|
555 } |
|
556 default: |
|
557 { |
|
558 // Nothing to do |
|
559 break; |
|
560 } |
|
561 } |
|
562 |
|
563 // Update the information to Conference call |
|
564 if ( 0 <= symbianConferenceEvent ) |
|
565 { |
|
566 // Create call package |
|
567 CCallDataPackage callData; |
|
568 // Pack the data for sending to the manager |
|
569 callData.SetCallIdAndMode( |
|
570 uniqueCallId, |
|
571 RMobilePhone::EVoiceService ); |
|
572 // Pack conference event |
|
573 callData.PackData( &symbianConferenceEvent ); |
|
574 // Pass call information to the Symbian OS layer |
|
575 // complete mobile call info change |
|
576 iMessageRouter->Complete( |
|
577 EMobileConferenceCallNotifyConferenceEvent, |
|
578 &callData, |
|
579 KErrNone ); |
|
580 } |
|
581 // No else |
|
582 } |
|
583 // No else |
|
584 } |
|
585 // No else |
|
586 |
|
587 iIsCreateConference = EFalse; |
|
588 iLastOperation = 0; |
|
589 } |
|
590 |
|
591 // ----------------------------------------------------------------------------- |
|
592 // CMmConferenceCallMessHandler::CallReleaseReq |
|
593 // Called by conference call Tsy to construct a |
|
594 // CALL_MODEM_RELEASE_REQ ISI message. Releases whole Conference call. |
|
595 // ----------------------------------------------------------------------------- |
|
596 // |
|
597 TInt CMmConferenceCallMessHandler::CallReleaseReq( |
|
598 TUint8 aTransactionId, |
|
599 TUint8 aCallId, |
|
600 TUint8 aCause ) |
|
601 { |
|
602 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallReleaseReq"); |
|
603 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLRELEASEREQ, "CMmConferenceCallMessHandler::CallReleaseReq" ); |
|
604 |
|
605 // Create isi message |
|
606 TIsiSend callreleaseReq( iPhoNetSender->SendBufferDes() ); |
|
607 callreleaseReq.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_MODEM_CALL ); |
|
608 |
|
609 // Set the Call Release Req data |
|
610 callreleaseReq.Set8bit( |
|
611 ISI_HEADER_OFFSET_TRANSID, |
|
612 aTransactionId ); |
|
613 callreleaseReq.Set8bit( |
|
614 ISI_HEADER_OFFSET_MESSAGEID, |
|
615 CALL_MODEM_RELEASE_REQ ); |
|
616 callreleaseReq.Set8bit( |
|
617 ISI_HEADER_SIZE + CALL_MODEM_RELEASE_REQ_OFFSET_CALLID, |
|
618 aCallId ); |
|
619 |
|
620 // Initialize message offset |
|
621 TInt currentMsgOffset( |
|
622 ISI_HEADER_SIZE + CALL_MODEM_RELEASE_REQ_OFFSET_CAUSE ); |
|
623 |
|
624 iReleaseCauseValueSent = aCause; |
|
625 |
|
626 // Number of subblocks |
|
627 TUint8 numOfSbInMessage( 0 ); |
|
628 |
|
629 // CALL_MODEM_SB_CAUSE Sub block |
|
630 TBuf8< SIZE_CALL_MODEM_SB_CAUSE > callCauseBuf( 0 ); |
|
631 TIsiSubBlock callCauseSb( |
|
632 callCauseBuf, |
|
633 CALL_MODEM_SB_CAUSE, |
|
634 EIsiSubBlockTypeId8Len8 ); |
|
635 |
|
636 callCauseBuf.Append( CALL_MODEM_CAUSE_TYPE_CLIENT ); |
|
637 callCauseBuf.Append( aCause ); |
|
638 callreleaseReq.CopyData( |
|
639 currentMsgOffset, |
|
640 callCauseSb.CompleteSubBlock() ); |
|
641 |
|
642 // Increase subblock count |
|
643 numOfSbInMessage++; |
|
644 |
|
645 // Set new offset |
|
646 currentMsgOffset = currentMsgOffset + SIZE_CALL_MODEM_SB_CAUSE; |
|
647 |
|
648 // CALL_MODEM_SB_STATE_AUTO_CHANGE subblock |
|
649 TBuf8< SIZE_CALL_MODEM_SB_STATE_AUTO_CHANGE > callStateAutoChangeBuf( 0 ); |
|
650 TIsiSubBlock callStateAutoChangeSb( |
|
651 callStateAutoChangeBuf, |
|
652 CALL_MODEM_SB_STATE_AUTO_CHANGE, |
|
653 EIsiSubBlockTypeId8Len8 ); |
|
654 |
|
655 // Disables auto retrieve when a waiting call exists. |
|
656 callStateAutoChangeBuf.Append( CALL_MODEM_AUTO_ST_CHANGE_DISABLE ); |
|
657 callStateAutoChangeBuf.Append( KConfCallPadding ); |
|
658 |
|
659 callreleaseReq.CopyData( |
|
660 currentMsgOffset, |
|
661 callStateAutoChangeSb.CompleteSubBlock() ); |
|
662 |
|
663 // Increase subblock count |
|
664 numOfSbInMessage++; |
|
665 |
|
666 // Set number of subblocs in CALL_MODEM_RELEASE_REQ message |
|
667 callreleaseReq.Set8bit( |
|
668 ISI_HEADER_SIZE + CALL_MODEM_RELEASE_REQ_OFFSET_SUBBLOCKS, |
|
669 numOfSbInMessage ); |
|
670 |
|
671 // Send CALL_MODEM_RELEASE_REQ message |
|
672 return iPhoNetSender->Send( callreleaseReq.Complete() ); |
|
673 } |
|
674 |
|
675 // ----------------------------------------------------------------------------- |
|
676 // CMmConferenceCallMessHandler::CallReleaseResp |
|
677 // Breaks a CALL_MODEM_RELEASE_RESP ISI-message. This handles the |
|
678 // situation where Conference call releasing has failed. |
|
679 // ----------------------------------------------------------------------------- |
|
680 // |
|
681 void CMmConferenceCallMessHandler::CallReleaseResp( |
|
682 const TIsiReceiveC& aIsiMsg ) |
|
683 { |
|
684 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallReleaseResp"); |
|
685 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLRELEASERESP, "CMmConferenceCallMessHandler::CallReleaseResp" ); |
|
686 |
|
687 TUint sbStartOffSet( 0 ); |
|
688 |
|
689 // Try to find CALL_MODEM_SB_CAUSE subblock. If found something has gone wrong |
|
690 if ( KErrNone == aIsiMsg.FindSubBlockOffsetById( |
|
691 ISI_HEADER_SIZE + SIZE_CALL_MODEM_RELEASE_RESP, |
|
692 CALL_MODEM_SB_CAUSE, |
|
693 EIsiSubBlockTypeId8Len8, |
|
694 sbStartOffSet ) ) |
|
695 { |
|
696 // Get cause type |
|
697 TUint8 causeType( aIsiMsg.Get8bit( |
|
698 sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE ) ); |
|
699 |
|
700 // Get cause value |
|
701 TUint8 causeValue( aIsiMsg.Get8bit( |
|
702 sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ) ); |
|
703 |
|
704 // Get Symbian OS error value |
|
705 TInt result( CMmStaticUtility::CSCauseToEpocError( |
|
706 PN_MODEM_CALL, |
|
707 causeType, |
|
708 causeValue ) ); |
|
709 |
|
710 // Complete conference call hangup |
|
711 if ( iReleaseCauseValueSent != causeValue ) |
|
712 { |
|
713 // Error occurred. Route the error value up. |
|
714 iMessageRouter->Complete( |
|
715 EMobileConferenceCallHangUp, |
|
716 result ); |
|
717 } |
|
718 // No else |
|
719 iReleaseCauseValueSent = 0; |
|
720 } |
|
721 // No else |
|
722 } |
|
723 |
|
724 // ----------------------------------------------------------------------------- |
|
725 // CMmConferenceCallMessHandler::HandleError |
|
726 // Handles CMmConferenceCallMessHandler's errors that comes |
|
727 // via PhoNetReceiver RunError method. |
|
728 // ----------------------------------------------------------------------------- |
|
729 // |
|
730 void CMmConferenceCallMessHandler::HandleError( |
|
731 const TIsiReceiveC& /*aIsiMsg*/, |
|
732 TInt /*aError*/ ) |
|
733 { |
|
734 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::HandleError"); |
|
735 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_HANDLEERROR, "CMmConferenceCallMessHandler::HandleError" ); |
|
736 |
|
737 // None |
|
738 } |
|
739 |
|
740 // ========================== OTHER EXPORTED FUNCTIONS ========================= |
|
741 // None |
|
742 |
|
743 // End of File |