32 // --------------------------------------------------------------------------- |
32 // --------------------------------------------------------------------------- |
33 // |
33 // |
34 TInt CMmCallGsmWcdmaExt::SwapL(TInt aCallId) |
34 TInt CMmCallGsmWcdmaExt::SwapL(TInt aCallId) |
35 { |
35 { |
36 TInt ret = KErrNone; |
36 TInt ret = KErrNone; |
37 |
37 const TInt KInvalidCallId = -1; |
38 // CTSY supports RMobileCall::Swap where there are two calls (one held, one active) |
38 |
39 // and their states are swapped. Where Swap() is called on a single call, this is |
39 // CTSY supports RMobileCall::Swap when there are one or two calls. When Swap() is called |
40 // not supported. |
40 // on a single call, it's state is switched (active to held or held to active), when on two |
|
41 // calls(one held, one active) their states are swapped. |
41 CMmPhoneTsy& mmPhone = *iMmCallTsy->Phone(); |
42 CMmPhoneTsy& mmPhone = *iMmCallTsy->Phone(); |
42 CMmCallList& callList = *mmPhone.CallList(); |
43 CMmCallList& callList = *mmPhone.CallList(); |
|
44 |
|
45 CCallDataPackage package; |
|
46 |
|
47 if ( callList.GetNumberOfObjects() > 2 ) |
|
48 { |
|
49 // Swapping between calls only makes sense with one or two opened calls. |
|
50 return KErrNotSupported; |
|
51 } |
43 CMmCallTsy* call = callList.GetMmCallById(aCallId); |
52 CMmCallTsy* call = callList.GetMmCallById(aCallId); |
|
53 package.SetCallIdAndMode(aCallId, iSymbianCallMode); |
44 |
54 |
45 if (!call) |
55 if (!call) |
46 { |
56 { |
47 ret = KErrGeneral; |
57 ret = KErrGeneral; |
48 } |
58 } |
58 // Call status of held call in iCallId in CCallDataPackage |
68 // Call status of held call in iCallId in CCallDataPackage |
59 CCallDataPackage package; |
69 CCallDataPackage package; |
60 package.SetCallIdAndMode(aCallId, iSymbianCallMode); |
70 package.SetCallIdAndMode(aCallId, iSymbianCallMode); |
61 // Get connected call and pack its call ID |
71 // Get connected call and pack its call ID |
62 CMmCallTsy* connectedCall = callList.GetMmCallByStatus(RMobileCall::EStatusConnected); |
72 CMmCallTsy* connectedCall = callList.GetMmCallByStatus(RMobileCall::EStatusConnected); |
|
73 TInt connectedCallId = KInvalidCallId; |
63 if (connectedCall) |
74 if (connectedCall) |
64 { |
75 { |
65 TInt connectedCallId = connectedCall->CallId(); |
76 connectedCallId = connectedCall->CallId(); |
66 package.PackData(&connectedCallId); |
|
67 ret = iMessageManager->HandleRequestL(EMobileCallSwap, &package); |
|
68 } |
77 } |
69 else |
78 package.PackData(&connectedCallId); |
70 { |
79 ret = iMessageManager->HandleRequestL(EMobileCallSwap, &package); |
71 ret = KErrNotSupported; |
|
72 } |
|
73 |
80 |
74 break; |
81 break; |
75 } |
82 } |
76 |
83 |
77 case RMobileCall::EStatusConnected: |
84 case RMobileCall::EStatusConnected: |
78 { |
85 { |
79 // Pack the following to the dispatcher: |
86 // Pack the following to the dispatcher: |
80 // Call status of connected call in additional parameter slot in CCallDataPackage |
87 // Call status of connected call in additional parameter slot in CCallDataPackage |
81 CCallDataPackage package; |
88 CCallDataPackage package; |
|
89 |
82 package.PackData(&aCallId); |
90 package.PackData(&aCallId); |
83 // Get held call and pack its call ID |
91 // Get held call and pack its call ID |
84 CMmCallTsy* heldCall = callList.GetMmCallByStatus(RMobileCall::EStatusHold); |
92 CMmCallTsy* heldCall = callList.GetMmCallByStatus(RMobileCall::EStatusHold); |
85 if (heldCall) |
93 if (heldCall) |
86 { |
94 { |
87 package.SetCallIdAndMode(heldCall->CallId(), heldCall->CallMode()); |
95 package.SetCallIdAndMode(heldCall->CallId(), heldCall->CallMode()); |
88 ret = iMessageManager->HandleRequestL(EMobileCallSwap, &package); |
|
89 } |
96 } |
90 else |
97 ret = iMessageManager->HandleRequestL(EMobileCallSwap, &package); |
91 { |
|
92 ret = KErrNotSupported; |
|
93 } |
|
94 break; |
98 break; |
95 } |
99 } |
96 |
100 |
97 default: |
101 default: |
98 { |
102 { |