author | mikaruus |
Tue, 19 Oct 2010 13:16:20 +0300 | |
changeset 9 | 8486d82aef45 |
parent 5 | 8ccc39f9d787 |
permissions | -rw-r--r-- |
0 | 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 "cmmdtmfmesshandler.h" |
|
22 |
#include "cmmcallmesshandler.h" |
|
23 |
#include "cmmphonetsender.h" |
|
24 |
#include "cmmstaticutility.h" |
|
25 |
#include "cmmmessagerouter.h" |
|
26 |
#include "tsylogger.h" // logging |
|
5
8ccc39f9d787
New release based on our 2010wk02 release
mikaruus <mika.a.ruuskanen@nokia.com>
parents:
0
diff
changeset
|
27 |
#include "OstTraceDefinitions.h" |
0 | 28 |
#ifdef OST_TRACE_COMPILER_IN_USE |
5
8ccc39f9d787
New release based on our 2010wk02 release
mikaruus <mika.a.ruuskanen@nokia.com>
parents:
0
diff
changeset
|
29 |
#include "cmmdtmfmesshandlerTraces.h" |
0 | 30 |
#endif |
31 |
||
32 |
#include <etelmm.h> |
|
33 |
#include <ctsy/pluginapi/cmmdatapackage.h> |
|
34 |
#include <ctsy/serviceapi/mmtsy_defaults.h> // KDtmfStringMaxLength constant needed |
|
35 |
#include <ctsy/rmmcustomapi.h> // Custom API's NotifyDtmfEvent implemented here |
|
36 |
#include <tisi.h> |
|
37 |
#include <call_modemisi.h> |
|
38 |
||
39 |
||
40 |
||
41 |
// EXTERNAL DATA STRUCTURES |
|
42 |
//none |
|
43 |
||
44 |
// EXTERNAL FUNCTION PROTOTYPES |
|
45 |
//none |
|
46 |
||
47 |
// CONSTANTS |
|
48 |
// hard-coded transaction id for ISA messages |
|
49 |
const TUint8 KDtmfTransId = 3; |
|
50 |
const TUint8 KDtmfPadding = 0x00; |
|
51 |
||
52 |
// For shifting by one byte |
|
53 |
const TUint8 KShiftByOneByte = 8; |
|
54 |
||
55 |
// MACROS |
|
56 |
//none |
|
57 |
||
58 |
// LOCAL CONSTANTS AND MACROS |
|
59 |
//none |
|
60 |
||
61 |
// MODULE DATA STRUCTURES |
|
62 |
//none |
|
63 |
||
64 |
// LOCAL FUNCTION PROTOTYPES |
|
65 |
//none |
|
66 |
||
67 |
// FORWARD DECLARATIONS |
|
68 |
//none |
|
69 |
||
70 |
// ============================= LOCAL FUNCTIONS =============================== |
|
71 |
//none |
|
72 |
||
73 |
// ============================ MEMBER FUNCTIONS =============================== |
|
74 |
||
75 |
// ----------------------------------------------------------------------------- |
|
76 |
// CMmDtmfMessHandler::CMmDtmfMessHandler |
|
77 |
// C++ default constructor |
|
78 |
// ----------------------------------------------------------------------------- |
|
79 |
// |
|
80 |
CMmDtmfMessHandler::CMmDtmfMessHandler() |
|
81 |
{ |
|
82 |
//none |
|
83 |
||
84 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::CMmDtmfMessHandler"); |
|
9 | 85 |
OstTrace0( TRACE_NORMAL, CMMDTMFMESSHANDLER_CMMDTMFMESSHANDLER_TD, "CMmDtmfMessHandler::CMmDtmfMessHandler" ); |
0 | 86 |
|
87 |
} |
|
88 |
||
89 |
// ----------------------------------------------------------------------------- |
|
90 |
// CMmDtmfMessHandler::ConstructL |
|
91 |
// Symbian 2nd phase constructor. Initialises internal attributes. |
|
92 |
// ----------------------------------------------------------------------------- |
|
93 |
// |
|
94 |
void CMmDtmfMessHandler::ConstructL() |
|
95 |
{ |
|
96 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ConstructL"); |
|
9 | 97 |
OstTrace0( TRACE_NORMAL, CMMDTMFMESSHANDLER_CONSTRUCTL_TD, "CMmDtmfMessHandler::ConstructL" ); |
0 | 98 |
iDTMFStringAfterW.Zero(); |
99 |
} |
|
100 |
||
101 |
// ----------------------------------------------------------------------------- |
|
102 |
// CMmDtmfMessHandler::NewL |
|
103 |
// Two-phased constructor. |
|
104 |
// ----------------------------------------------------------------------------- |
|
105 |
// |
|
106 |
CMmDtmfMessHandler* CMmDtmfMessHandler::NewL( |
|
107 |
CMmPhoNetSender* aPhoNetSender, //pointer to the phonet sender |
|
108 |
CMmPhoNetReceiver* aPhoNetReceiver, // pointer to the phoner receiver |
|
109 |
CMmMessageRouter* aMessageRouter ) // pointer to the message router |
|
110 |
{ |
|
111 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::NewL"); |
|
9 | 112 |
OstTrace0( TRACE_NORMAL, CMMDTMFMESSHANDLER_NEWL_TD, "CMmDtmfMessHandler::NewL" ); |
0 | 113 |
|
114 |
CMmDtmfMessHandler* dtmfMessHandler = |
|
115 |
new ( ELeave ) CMmDtmfMessHandler(); |
|
116 |
||
117 |
CleanupStack::PushL( dtmfMessHandler ); |
|
118 |
dtmfMessHandler->iPhoNetSender = aPhoNetSender; |
|
119 |
dtmfMessHandler->iMessageRouter = aMessageRouter; |
|
120 |
dtmfMessHandler->ConstructL(); |
|
121 |
||
122 |
aPhoNetReceiver->RegisterL( dtmfMessHandler, PN_MODEM_CALL, CALL_MODEM_DTMF_STATUS_IND ); |
|
123 |
aPhoNetReceiver->RegisterL( dtmfMessHandler, PN_MODEM_CALL, CALL_MODEM_DTMF_SEND_RESP ); |
|
124 |
aPhoNetReceiver->RegisterL( dtmfMessHandler, PN_MODEM_CALL, CALL_MODEM_DTMF_STOP_RESP ); |
|
125 |
aPhoNetReceiver->RegisterL( dtmfMessHandler, PN_MODEM_CALL, CALL_MODEM_DTMF_TONE_IND ); |
|
126 |
||
127 |
CleanupStack::Pop( dtmfMessHandler ); |
|
128 |
||
129 |
return dtmfMessHandler; |
|
130 |
} |
|
131 |
||
132 |
||
133 |
||
134 |
// ----------------------------------------------------------------------------- |
|
135 |
// CMmDtmfMessHandler::~CMmDtmfMessHandler |
|
136 |
// Destructor |
|
137 |
// ----------------------------------------------------------------------------- |
|
138 |
// |
|
139 |
||
140 |
CMmDtmfMessHandler::~CMmDtmfMessHandler() |
|
141 |
{ |
|
142 |
||
143 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::~CMmDtmfMessHandler"); |
|
9 | 144 |
OstTrace0( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_CMMDTMFMESSHANDLER_TD, "CMmDtmfMessHandler::~CMmDtmfMessHandler" ); |
0 | 145 |
} |
146 |
||
147 |
// ----------------------------------------------------------------------------- |
|
148 |
// CMmDtmfMessHandler::ExtFuncL |
|
149 |
// Forwards requests coming from the Symbian OS layer to the |
|
150 |
// specific method. |
|
151 |
// ----------------------------------------------------------------------------- |
|
152 |
// |
|
153 |
TInt CMmDtmfMessHandler::ExtFuncL( |
|
154 |
TInt aIpc, // request ipc |
|
155 |
const CMmDataPackage* aDataPackage ) //request data |
|
156 |
{ |
|
157 |
||
158 |
TFLOGSTRING2("TSY: CMmDtmfMessHandler::ExtFuncL. IPC:%d", aIpc); |
|
9 | 159 |
OstTrace1( TRACE_NORMAL, CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL;aIpc=%d", aIpc ); |
0 | 160 |
|
161 |
//*************************************************************// |
|
162 |
// NOTE: |
|
163 |
// |
|
164 |
// LICENSEE SPECIFIC MESSAGE HANDLER IMPLEMENTATION STARTS HERE |
|
165 |
// |
|
166 |
//*************************************************************// |
|
167 |
||
168 |
TInt ret( KErrNone ); |
|
169 |
||
170 |
TUint8 transId( KDtmfTransId ); |
|
171 |
||
172 |
switch ( aIpc ) |
|
173 |
{ |
|
174 |
case EMobilePhoneStartDTMFTone: |
|
175 |
{ |
|
176 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ExtFuncL -- EMobilePhoneStartDTMFTone"); |
|
9 | 177 |
OstTrace0( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL, EMobilePhoneStartDTMFTone" ); |
0 | 178 |
//unpack parameter: DTMF tone to be sent |
179 |
TChar* tone( NULL ); |
|
180 |
aDataPackage->UnPackData ( &tone ); |
|
181 |
// CallDtmfSendReq needs a descriptor of length one |
|
182 |
// instead of a TChar |
|
183 |
TBuf<1> toneDes; |
|
184 |
toneDes.SetLength(0); |
|
185 |
toneDes.Append(*tone); |
|
186 |
//forward the request to the specific method |
|
187 |
ret = CallDtmfSendReqL ( transId, &toneDes, EDtmfTypeDigit ); |
|
188 |
break; |
|
189 |
} |
|
190 |
case EMobilePhoneStopDTMFTone: |
|
191 |
{ |
|
192 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ExtFuncL -- EMobilePhoneStopDTMFTone"); |
|
9 | 193 |
OstTrace0( TRACE_NORMAL, DUP2_CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL, EMobilePhoneStopDTMFTone" ); |
0 | 194 |
//no packed parameters |
195 |
//forward the request to the specific method |
|
196 |
CallDtmfStopReq ( transId ); |
|
197 |
break; |
|
198 |
} |
|
199 |
||
200 |
case EMobilePhoneContinueDTMFStringSending: |
|
201 |
{ |
|
202 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ExtFuncL -- EMobilePhoneContinueDTMFStringSending"); |
|
9 | 203 |
OstTrace0( TRACE_NORMAL, DUP3_CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL, EMobilePhoneContinueDTMFStringSending" ); |
0 | 204 |
} |
205 |
case EMobilePhoneSendDTMFTones: |
|
206 |
{ |
|
207 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ExtFuncL -- EMobilePhoneSendDTMFTones"); |
|
9 | 208 |
OstTrace0( TRACE_NORMAL, DUP4_CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL, EMobilePhoneSendDTMFTones" ); |
0 | 209 |
if ( !iDtmfSendOngoing || EMobilePhoneContinueDTMFStringSending == aIpc ) |
210 |
{ |
|
211 |
//unpack parameter: DTMF tones to be sent |
|
212 |
TDesC* tonesDes ( NULL ); |
|
213 |
aDataPackage->UnPackData ( &tonesDes ); |
|
214 |
//forward the request to the specific method |
|
215 |
ret = CallDtmfSendReqL ( transId, tonesDes, EDtmfTypeString ); |
|
216 |
if ( KErrNone == ret && EMobilePhoneSendDTMFTones == aIpc ) |
|
217 |
{ |
|
218 |
iDtmfSendOngoing = ETrue; |
|
219 |
} |
|
220 |
//no else |
|
221 |
} |
|
222 |
else |
|
223 |
{ |
|
224 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ExtFuncL -- dtmf send already ongoing"); |
|
9 | 225 |
OstTrace0( TRACE_NORMAL, DUP5_CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL, DTMF sending already ongoing" ); |
0 | 226 |
ret = KErrServerBusy; |
227 |
} |
|
228 |
break; |
|
229 |
} |
|
230 |
case EMobilePhoneSendDTMFTonesCancel: |
|
231 |
{ |
|
232 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ExtFuncL -- EMobilePhoneSendDTMFTonesCancel"); |
|
9 | 233 |
OstTrace0( TRACE_NORMAL, DUP6_CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL, EMobilePhoneSendDTMFTonesCancel" ); |
0 | 234 |
iDtmfSendOngoing = EFalse; |
235 |
//no packed parameters |
|
236 |
//forward the request to the specific method |
|
237 |
ret = CallDtmfStopReq( transId ); |
|
238 |
break; |
|
239 |
} |
|
240 |
default: |
|
241 |
{ |
|
242 |
// this method should only be called for DTMF cases |
|
243 |
TFLOGSTRING2("TSY: CMmDtmfMessHandler::ExtFuncL - Unknown IPC: %d", aIpc); |
|
9 | 244 |
OstTrace1( TRACE_NORMAL, DUP7_CMMDTMFMESSHANDLER_EXTFUNCL_TD, "CMmDtmfMessHandler::ExtFuncL;Unknown IPC=%d", aIpc ); |
0 | 245 |
ret = KErrArgument; |
246 |
break; |
|
247 |
} |
|
248 |
} |
|
249 |
||
250 |
return ret; |
|
251 |
} |
|
252 |
||
253 |
// ----------------------------------------------------------------------------- |
|
254 |
// CMmDtmfMessHandler::ReceiveMessageL |
|
255 |
// Called when an ISI message has been received. |
|
256 |
// ----------------------------------------------------------------------------- |
|
257 |
// |
|
258 |
void CMmDtmfMessHandler::ReceiveMessageL( |
|
259 |
const TIsiReceiveC &aIsiMessage ) //received ISI message |
|
260 |
{ |
|
261 |
TInt resource (aIsiMessage.Get8bit( ISI_HEADER_OFFSET_RESOURCEID )); |
|
262 |
TInt messageId(aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID )); |
|
263 |
||
264 |
TFLOGSTRING3("TSY: CMmDtmfMessHandler::ReceiveMessageL. Resource:%d. MsgId:%d",resource, messageId); |
|
9 | 265 |
OstTraceExt2( TRACE_NORMAL, CMMDTMFMESSHANDLER_RECEIVEMESSAGEL_TD, "CMmDtmfMessHandler::ReceiveMessageL;resource=%d;messageId=%d", resource, messageId ); |
0 | 266 |
|
267 |
// DTMF functionality is implemented in CALL server |
|
268 |
if ( PN_MODEM_CALL == resource ) |
|
269 |
{ |
|
270 |
switch ( messageId ) |
|
271 |
{ |
|
272 |
case CALL_MODEM_DTMF_STATUS_IND: |
|
273 |
{ |
|
274 |
CallDtmfStatusInd( aIsiMessage ); |
|
275 |
break; |
|
276 |
} |
|
277 |
case CALL_MODEM_DTMF_SEND_RESP: |
|
278 |
{ |
|
279 |
CallDtmfSendResp( aIsiMessage ); |
|
280 |
break; |
|
281 |
} |
|
282 |
case CALL_MODEM_DTMF_STOP_RESP: |
|
283 |
{ |
|
284 |
CallDtmfStopResp( aIsiMessage ); |
|
285 |
break; |
|
286 |
} |
|
287 |
case CALL_MODEM_DTMF_TONE_IND: |
|
288 |
{ |
|
289 |
CallDtmfToneInd( aIsiMessage ); |
|
290 |
break; |
|
291 |
} |
|
292 |
default: |
|
293 |
{ |
|
294 |
||
295 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::ReceiveMessageL. PN_MODEM_CALL: Switch messageID case default"); |
|
9 | 296 |
OstTrace0( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_RECEIVEMESSAGEL_TD, "CMmDtmfMessHandler::ReceiveMessageL,PN_MODEM_CALL: Switch messageID case default" ); |
0 | 297 |
|
298 |
break; |
|
299 |
} |
|
300 |
} // switch( messageId ) |
|
301 |
} // if ( PN_MODEM_CALL == resource ) |
|
302 |
} |
|
303 |
||
304 |
// ----------------------------------------------------------------------------- |
|
305 |
// CMmDtmfMessHandler::SendPostAddressL |
|
306 |
// Called by call message handler when a call goes active and there |
|
307 |
// is a post address string to send. |
|
308 |
// ----------------------------------------------------------------------------- |
|
309 |
// |
|
310 |
void CMmDtmfMessHandler::SendPostAddressL( |
|
311 |
const TDesC* aDtmfString ) //dtmf character(s) to be sent |
|
312 |
{ |
|
313 |
||
314 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::SendPostAddressL"); |
|
9 | 315 |
OstTrace0( TRACE_NORMAL, CMMDTMFMESSHANDLER_SENDPOSTADDRESSL_TD, "CMmDtmfMessHandler::SendPostAddressL" ); |
0 | 316 |
|
317 |
if ( !iDtmfSendOngoing ) |
|
318 |
{ |
|
319 |
iDtmfSendOngoing = ETrue; |
|
320 |
CallDtmfSendReqL( KDtmfTransId, aDtmfString, EDtmfTypeString ); |
|
321 |
} |
|
322 |
} |
|
323 |
||
324 |
// ----------------------------------------------------------------------------- |
|
325 |
// CMmDtmfMessHandler::CallDtmfSendReq |
|
326 |
// Called by MmDtmfTsy to construct a CALL_MODEM_DTMF_SEND_REQ ISI |
|
327 |
// message and to send it to Phonet. Can be used with strings and single |
|
328 |
// digits. |
|
329 |
// ----------------------------------------------------------------------------- |
|
330 |
// |
|
331 |
TInt CMmDtmfMessHandler::CallDtmfSendReqL( |
|
332 |
TUint8 aTransactionId, //transaction id |
|
333 |
const TDesC* aDtmfString, //dtmf character(s) to be sent |
|
334 |
TNOSDtmfType aDtmfType ) // Type of dtmf to send |
|
335 |
{ |
|
336 |
TFLOGSTRING3("TSY: CMmDtmfMessHandler::CallDtmfSendReqL. TransId:%d, DtmfString:%S", aTransactionId, aDtmfString); |
|
9 | 337 |
OstTraceExt2( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_CALLDTMFSENDREQL_TD, "CMmDtmfMessHandler::CallDtmfSendReqL;aTransactionId=%hhu;aDtmfString=%s", aTransactionId, ( TUint )( aDtmfString ) ); |
0 | 338 |
|
339 |
TInt ret( KErrNone ); |
|
340 |
||
341 |
// Get dtmf character(s) length |
|
342 |
TInt length( aDtmfString->Length() ); |
|
343 |
||
344 |
if ( ( KDtmfStringMaxLength >= length ) && ( 0 < length ) ) |
|
345 |
{ |
|
346 |
// Create isi message |
|
347 |
TIsiSend callDtmfSendReq( iPhoNetSender->SendBufferDes() ); |
|
348 |
callDtmfSendReq.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_MODEM_CALL ); |
|
349 |
||
350 |
// Set the call Dtmf Send Req data |
|
351 |
callDtmfSendReq.Set8bit( |
|
352 |
ISI_HEADER_OFFSET_TRANSID, aTransactionId ); |
|
353 |
callDtmfSendReq.Set8bit( |
|
354 |
ISI_HEADER_OFFSET_MESSAGEID, CALL_MODEM_DTMF_SEND_REQ ); |
|
355 |
callDtmfSendReq.Set8bit( |
|
356 |
ISI_HEADER_SIZE + CALL_MODEM_DTMF_SEND_REQ_OFFSET_CALLID, |
|
357 |
CALL_MODEM_ID_ACTIVE ); |
|
358 |
||
359 |
// Initialize message offset and subblock count |
|
360 |
TUint currentMsgOffset( |
|
361 |
ISI_HEADER_SIZE + SIZE_CALL_MODEM_DTMF_SEND_REQ ); |
|
362 |
TUint8 numOfSbInMessage( 0 ); |
|
363 |
||
364 |
iDtmfType = aDtmfType; |
|
365 |
||
366 |
//get call dtmf send req sub blocks |
|
367 |
TBool createReq( GetCallDtmfSendReqSubBlockL( |
|
368 |
aDtmfString, |
|
369 |
callDtmfSendReq, |
|
370 |
currentMsgOffset, |
|
371 |
numOfSbInMessage ) ); |
|
372 |
||
373 |
callDtmfSendReq.Set8bit( |
|
374 |
ISI_HEADER_SIZE + CALL_MODEM_DTMF_SEND_REQ_OFFSET_SUBBLOCKS, |
|
375 |
numOfSbInMessage ); |
|
376 |
||
377 |
//createReq flag is set to TRUE so request will be sent |
|
378 |
if ( createReq ) |
|
379 |
{ |
|
380 |
//send message via phonet |
|
381 |
ret = iPhoNetSender->Send( callDtmfSendReq.Complete() ); |
|
382 |
} |
|
383 |
} |
|
384 |
else |
|
385 |
{ |
|
386 |
ret = KErrArgument; |
|
387 |
} |
|
388 |
||
389 |
return ret; |
|
390 |
} |
|
391 |
||
392 |
// ----------------------------------------------------------------------------- |
|
393 |
// CMmDtmfMessHandler::CallDtmfSendResp |
|
394 |
// Breaks a CALL_MODEM_DTMF_SEND_RESP ISI-message. Handles error |
|
395 |
// situations of DTMF sending. |
|
396 |
// ----------------------------------------------------------------------------- |
|
397 |
// |
|
398 |
void CMmDtmfMessHandler::CallDtmfSendResp( |
|
399 |
const TIsiReceiveC &aIsiMessage ) //received ISI message |
|
400 |
{ |
|
401 |
||
402 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::CallDtmfSendResp"); |
|
9 | 403 |
OstTrace0( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_CALLDTMFSENDRESP_TD, "CMmDtmfMessHandler::CallDtmfSendResp" ); |
0 | 404 |
|
405 |
TUint sbStartOffSet( 0 ); |
|
406 |
||
407 |
if( KErrNone == aIsiMessage.FindSubBlockOffsetById( |
|
408 |
ISI_HEADER_SIZE + SIZE_CALL_MODEM_DTMF_SEND_RESP, CALL_MODEM_SB_CAUSE, |
|
409 |
EIsiSubBlockTypeId8Len8, sbStartOffSet ) ) |
|
410 |
{ |
|
411 |
//get cause type |
|
412 |
TUint8 causeType( aIsiMessage.Get8bit( sbStartOffSet + |
|
413 |
CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE) ); |
|
414 |
||
415 |
//get cause value |
|
416 |
TUint8 causeValue( aIsiMessage.Get8bit( sbStartOffSet + |
|
417 |
CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ) ); |
|
418 |
||
419 |
if ( ( EDtmfTypeString == iDtmfType ) && ( !iCharWFound ) ) |
|
420 |
{ |
|
421 |
iDtmfSendOngoing = EFalse; |
|
422 |
TInt result( CMmStaticUtility::CSCauseToEpocError( |
|
423 |
PN_MODEM_CALL, causeType, causeValue ) ); |
|
424 |
iMessageRouter->Complete( |
|
425 |
EMobilePhoneSendDTMFTones, |
|
426 |
result ); |
|
427 |
} |
|
428 |
} |
|
429 |
} |
|
430 |
||
431 |
// ----------------------------------------------------------------------------- |
|
432 |
// CMmDtmfMessHandler::CallDtmfStopReq |
|
433 |
// Called by CMmDtmfTsy to construct a CALL_MODEM_DTMF_STOP_REQ ISI |
|
434 |
// message |
|
435 |
// ----------------------------------------------------------------------------- |
|
436 |
// |
|
437 |
TInt CMmDtmfMessHandler::CallDtmfStopReq( |
|
438 |
TUint8 aTransactionId ) //transaction id |
|
439 |
{ |
|
440 |
||
441 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::CallDtmfStopReq"); |
|
9 | 442 |
OstTrace0( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_CALLDTMFSTOPREQ_TD, "CMmDtmfMessHandler::CallDtmfStopReq" ); |
0 | 443 |
|
444 |
//create dtmf stop request message |
|
445 |
//Append data for ISI message |
|
446 |
TBuf8<2> data; |
|
447 |
data.Append( CALL_MODEM_ID_ACTIVE ); // CallId |
|
448 |
data.Append( 0x00 ); // Number of Subblocks |
|
449 |
||
450 |
// Send Isi message via Phonet |
|
451 |
return iPhoNetSender->Send( PN_MODEM_CALL, aTransactionId, CALL_MODEM_DTMF_STOP_REQ, data ); |
|
452 |
} |
|
453 |
||
454 |
// ----------------------------------------------------------------------------- |
|
455 |
// CMmDtmfMessHandler::CallDtmfStopResp |
|
456 |
// Breaks a CALL_MODEM_DTMF_STOP_RESP ISI message |
|
457 |
// ----------------------------------------------------------------------------- |
|
458 |
// |
|
459 |
void CMmDtmfMessHandler::CallDtmfStopResp( |
|
460 |
const TIsiReceiveC &aIsiMessage ) //received ISI message |
|
461 |
{ |
|
462 |
||
463 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::CallDtmfStopResp"); |
|
9 | 464 |
OstTrace0( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_CALLDTMFSTOPRESP_TD, "CMmDtmfMessHandler::CallDtmfStopResp" ); |
0 | 465 |
|
466 |
TUint8 nbrOfsubBlocks( aIsiMessage.Get8bit( ISI_HEADER_SIZE + |
|
467 |
CALL_MODEM_DTMF_STOP_RESP_OFFSET_SUBBLOCKS ) ); |
|
468 |
||
469 |
if ( 0 < nbrOfsubBlocks ) |
|
470 |
{ |
|
471 |
TUint sbStartOffSet( 0 ); |
|
472 |
||
473 |
//check that is this response to Cancel request |
|
474 |
if( KErrNone == aIsiMessage.FindSubBlockOffsetById( |
|
475 |
ISI_HEADER_SIZE + SIZE_CALL_MODEM_DTMF_STOP_RESP, CALL_MODEM_SB_DTMF_STRING, |
|
476 |
EIsiSubBlockTypeId8Len8, sbStartOffSet ) ) |
|
477 |
{ |
|
478 |
iMessageRouter->Complete( |
|
479 |
EMobilePhoneStopDTMFTone, |
|
480 |
KErrNone ); |
|
481 |
} |
|
482 |
} |
|
483 |
} |
|
484 |
||
485 |
// ----------------------------------------------------------------------------- |
|
486 |
// CMmDtmfMessHandler::CallDtmfStatusInd |
|
487 |
// Called by PhonetReceiver to break a CALL_MODEM_DTMF_STATUS_IND |
|
488 |
// ISI message. |
|
489 |
// ----------------------------------------------------------------------------- |
|
490 |
// |
|
491 |
void CMmDtmfMessHandler::CallDtmfStatusInd( |
|
492 |
const TIsiReceiveC &aIsiMessage ) // Received ISI message |
|
493 |
{ |
|
494 |
||
495 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::CallDtmfStatusInd"); |
|
9 | 496 |
OstTrace0( TRACE_NORMAL, DUP2_CMMDTMFMESSHANDLER_CALLDTMFSTATUSIND_TD, "CMmDtmfMessHandler::CallDtmfStatusInd" ); |
0 | 497 |
|
498 |
TUint sbStartOffSet( 0 ); |
|
499 |
||
500 |
//get call dtmf status sub block |
|
501 |
if( KErrNone == aIsiMessage.FindSubBlockOffsetById( |
|
502 |
ISI_HEADER_SIZE + CALL_MODEM_DTMF_STATUS_IND_OFFSET_STATUS, CALL_MODEM_SB_DTMF_STATUS, |
|
503 |
EIsiSubBlockTypeId8Len8, sbStartOffSet ) ) |
|
504 |
{ |
|
505 |
// DTMF event information |
|
506 |
RMobilePhone::TMobilePhoneDTMFEvent event; |
|
507 |
CMmDataPackage eventDataPackage; |
|
508 |
//get dtmf status |
|
509 |
TUint8 dtmfStatus( aIsiMessage.Get8bit( sbStartOffSet + |
|
510 |
CALL_MODEM_SB_DTMF_STATUS_OFFSET_STATUS) ); |
|
511 |
||
512 |
TFLOGSTRING2("TSY: CMmDtmfMessHandler::CallDtmfStatusInd. dtmfStatus:%d",dtmfStatus); |
|
9 | 513 |
OstTraceExt1( TRACE_NORMAL, DUP3_CMMDTMFMESSHANDLER_CALLDTMFSTATUSIND_TD, "CMmDtmfMessHandler::CallDtmfStatusInd;dtmfStatus=%hhu", dtmfStatus ); |
0 | 514 |
|
515 |
if( CALL_MODEM_DTMF_IDLE == dtmfStatus ) |
|
516 |
{ |
|
517 |
if( EDtmfTypeUnknown != iDtmfType ) |
|
518 |
{ |
|
519 |
TUint8 causeType( 0 ); |
|
520 |
TUint8 causeValue( 0 ); |
|
521 |
||
522 |
if( KErrNone == aIsiMessage.FindSubBlockOffsetById( |
|
523 |
ISI_HEADER_SIZE + SIZE_CALL_MODEM_DTMF_STATUS_IND, CALL_MODEM_SB_CAUSE, |
|
524 |
EIsiSubBlockTypeId8Len8, sbStartOffSet ) ) |
|
525 |
{ |
|
526 |
//Get Cause Type |
|
527 |
causeType = aIsiMessage.Get8bit( sbStartOffSet + |
|
528 |
CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE); |
|
529 |
//Get Cause Value |
|
530 |
causeValue = aIsiMessage.Get8bit( sbStartOffSet + |
|
531 |
CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ); |
|
532 |
} |
|
533 |
||
534 |
//If sub block found, DTMF string sending has been pause with 'w' |
|
535 |
//mark in the DTMF string |
|
536 |
if ( iCharWFound ) |
|
537 |
{ |
|
538 |
CMmDataPackage dataPackage; |
|
539 |
dataPackage.PackData( &iDTMFStringAfterW ); |
|
540 |
iMessageRouter->Complete( |
|
541 |
EMobilePhoneNotifyStopInDTMFString, |
|
542 |
&dataPackage, |
|
543 |
KErrNone ); |
|
544 |
||
545 |
// Set iCharWFound flag to False |
|
546 |
iCharWFound = EFalse; |
|
547 |
iDTMFStringAfterW.Zero(); |
|
548 |
} |
|
549 |
//Complete sending DTMF string |
|
550 |
else if ( EDtmfTypeString == iDtmfType ) |
|
551 |
{ |
|
552 |
iDtmfSendOngoing = EFalse; |
|
553 |
TInt result( CMmStaticUtility::CSCauseToEpocError( |
|
554 |
PN_MODEM_CALL, causeType, causeValue ) ); |
|
555 |
||
556 |
CMmDataPackage dataPackage; |
|
557 |
iMessageRouter->Complete( |
|
558 |
EMobilePhoneSendDTMFTones, |
|
559 |
&dataPackage, |
|
560 |
result ); |
|
561 |
} |
|
562 |
} |
|
563 |
iDtmfType = EDtmfTypeUnknown; |
|
564 |
iDtmfDigitSent = 0; |
|
565 |
event = RMobilePhone::EStopDtmfTone; |
|
566 |
} |
|
567 |
else |
|
568 |
{ |
|
569 |
event = RMobilePhone::EStartDtmfTone; |
|
570 |
} |
|
571 |
// Complete DTMF Event |
|
572 |
eventDataPackage.PackData( &event ); |
|
573 |
iMessageRouter->Complete( |
|
574 |
EMobilePhoneNotifyDTMFEvent, |
|
575 |
&eventDataPackage, |
|
576 |
KErrNone ); |
|
577 |
} |
|
578 |
} |
|
579 |
||
580 |
// ----------------------------------------------------------------------------- |
|
581 |
// CMmDtmfMessHandler::GetCallDtmfSendReqSubBlock |
|
582 |
// Appends the sub blocks for CALL_MODEM_DTMF_SEND_REQ ISI message. |
|
583 |
// if iDtmfType is DTMF_TYPE_DIGIT |
|
584 |
// append digit to temporary buffer |
|
585 |
// append callDtmfSubBlock subblock to the message using the temporary |
|
586 |
// buffer |
|
587 |
// set iDtmfDigitSent to point to the aDtmfString (input parameter) |
|
588 |
// else |
|
589 |
// append dtmf timer sub block (minimum duration and gap) |
|
590 |
// append DTMF string to temporary buffer |
|
591 |
// append callDtmfSubBlock subblock to the message using the temporary |
|
592 |
// buffer |
|
593 |
// ----------------------------------------------------------------------------- |
|
594 |
// |
|
595 |
TBool CMmDtmfMessHandler::GetCallDtmfSendReqSubBlockL( |
|
596 |
const TDesC* aDtmfString, //dtmf character(s) |
|
597 |
TIsiSend &aIsiMessage, //IsiMsg to be build |
|
598 |
TUint &aCurrentMsgOffset, |
|
599 |
TUint8 &aNumOfSbInMessage ) |
|
600 |
{ |
|
601 |
TFLOGSTRING2("TSY: CMmDtmfMessHandler::GetCallDtmfSendReqSubBlockL. DtmfType:%d", iDtmfType ); |
|
9 | 602 |
OstTrace1( TRACE_NORMAL, CMMDTMFMESSHANDLER_GETCALLDTMFSENDREQSUBBLOCKL_TD, "CMmDtmfMessHandler::GetCallDtmfSendReqSubBlockL;iDtmfType=%d", iDtmfType ); |
0 | 603 |
// createReq flag is set to 'false' only in case the first character is 'w' |
604 |
// in DTMF string. If 'true' CALL_DTMF_SEND_REQ will be sent. |
|
605 |
TBool createReq( ETrue ); |
|
606 |
||
607 |
if( EDtmfTypeDigit == iDtmfType ) |
|
608 |
{ |
|
609 |
TBuf8< SIZE_CALL_MODEM_SB_DTMF_DIGIT > callDtmfDigitBuf( 0 ); |
|
610 |
TIsiSubBlock dtmfDigitSubBlock( callDtmfDigitBuf, |
|
611 |
CALL_MODEM_SB_DTMF_DIGIT, EIsiSubBlockTypeId8Len8 ); |
|
612 |
||
613 |
TIsiUtility::CopyToBigEndian( *aDtmfString, callDtmfDigitBuf ); |
|
614 |
||
615 |
aIsiMessage.CopyData( |
|
616 |
aCurrentMsgOffset, dtmfDigitSubBlock.CompleteSubBlock() ); |
|
617 |
||
618 |
// Set new offset and increase subblock count |
|
619 |
aCurrentMsgOffset = |
|
620 |
aCurrentMsgOffset + SIZE_CALL_MODEM_SB_DTMF_DIGIT; |
|
621 |
aNumOfSbInMessage++; |
|
622 |
||
623 |
iDtmfDigitSent = *aDtmfString->Ptr(); |
|
624 |
} |
|
625 |
else |
|
626 |
{ |
|
627 |
// This flag indicates is 'w' found in DTMF string. |
|
628 |
iCharWFound = EFalse; |
|
629 |
||
630 |
// Buffer length for pause length, string length(unicode) |
|
631 |
// and 16-bit data. |
|
632 |
TBuf8<KAddressSubBlockMaxLength> dataString( 0 ); |
|
633 |
TIsiSubBlock callDtmfStringSubBlock( dataString, |
|
634 |
CALL_MODEM_SB_DTMF_STRING, EIsiSubBlockTypeId8Len8 ); |
|
635 |
||
636 |
// Pause length |
|
637 |
dataString.Append( CALL_MODEM_DTMF_PAUSE_3S ); |
|
638 |
||
639 |
// Get dtmf character(s) length |
|
640 |
TInt length( aDtmfString->Length() ); |
|
641 |
||
642 |
// Check if character 'w' is found in the DTMF string |
|
643 |
TInt positionCharW( aDtmfString->Locate('w') ); |
|
644 |
||
645 |
// Character 'w' was found, the string after 'w' must must be stored, |
|
646 |
// it will be sent back to client when CALL_DTMF_STATUS_IND with |
|
647 |
// CALL_DTMF_IDLE is received. |
|
648 |
if ( KErrNotFound != positionCharW ) |
|
649 |
{ |
|
650 |
// Copy string after 'w' for later use. |
|
651 |
iDTMFStringAfterW.Copy( |
|
652 |
aDtmfString->Right( length - ( positionCharW + 1 ) ) ); |
|
653 |
||
654 |
// If 'w' was received as the first character, complete |
|
655 |
// immediately with remaining string. |
|
656 |
if ( 0 == positionCharW ) |
|
657 |
{ |
|
658 |
// Notify about the stop mark in the DTMF string. |
|
659 |
CMmDataPackage dataPackage; |
|
660 |
dataPackage.PackData( &iDTMFStringAfterW ); |
|
661 |
iMessageRouter->Complete( |
|
662 |
EMobilePhoneNotifyStopInDTMFString, |
|
663 |
&dataPackage, |
|
664 |
KErrNone ); |
|
665 |
iDTMFStringAfterW.Zero(); |
|
666 |
// Don't send the request in this case. |
|
667 |
createReq = EFalse; |
|
668 |
} |
|
669 |
else |
|
670 |
{ |
|
671 |
// Length of the datastring including character 'w'. |
|
672 |
length = positionCharW + 1; |
|
673 |
// 'w' was found, set the flag. |
|
674 |
iCharWFound = ETrue; |
|
675 |
} |
|
676 |
} |
|
677 |
// No else. If 'w' was not found, iCreateReq is set to 'true' by |
|
678 |
// default and iCharWFound to 'false'. Whole string will be sent. |
|
679 |
||
680 |
// First append number length |
|
681 |
dataString.Append( length ); // DTMF length |
|
682 |
||
683 |
// Create buffer for dtmf data. Max data buffer size is 256. |
|
684 |
TBuf8<KMaxDataBufferSize> tempdata; |
|
685 |
// Copy 16 to 8 |
|
686 |
TIsiUtility::CopyToBigEndian( *aDtmfString, tempdata ); |
|
687 |
// Append data to the buffer which contains unicode string |
|
688 |
dataString.Append( tempdata.Left( length * 2 ) ); |
|
689 |
||
690 |
aIsiMessage.CopyData( aCurrentMsgOffset, |
|
691 |
callDtmfStringSubBlock.CompleteSubBlock() ); |
|
692 |
||
693 |
// Set new offset and increase subblock count |
|
694 |
aCurrentMsgOffset = |
|
695 |
aCurrentMsgOffset + dataString.Length(); |
|
696 |
aNumOfSbInMessage++; |
|
697 |
||
698 |
//Sub Block CALL_MODEM_SB_DTMF_TIMERS |
|
699 |
TBuf8< SIZE_CALL_MODEM_SB_DTMF_TIMERS > dataTimers( 0 ); //data timers is a unicode character |
|
700 |
TIsiSubBlock callDtmfTimersSubBlock( dataTimers, |
|
701 |
CALL_MODEM_SB_DTMF_TIMERS, EIsiSubBlockTypeId8Len8 ); |
|
702 |
||
703 |
//DTFM duration in milliseconds |
|
704 |
dataTimers.Append( static_cast<TUint8>( CALL_MODEM_DTMF_NO_DELAY >> KShiftByOneByte ) ); |
|
705 |
dataTimers.Append( static_cast<TUint8>( CALL_MODEM_DTMF_NO_DELAY ) ); |
|
706 |
//DTMF gap in milliseconds |
|
707 |
dataTimers.Append( static_cast<TUint8>( CALL_MODEM_DTMF_NO_DELAY >> KShiftByOneByte ) ); |
|
708 |
dataTimers.Append( static_cast<TUint8>( CALL_MODEM_DTMF_NO_DELAY ) ); |
|
709 |
//append padding |
|
710 |
dataTimers.AppendFill( KDtmfPadding, 2 ); |
|
711 |
||
712 |
aIsiMessage.CopyData( aCurrentMsgOffset, |
|
713 |
callDtmfTimersSubBlock.CompleteSubBlock() ); |
|
714 |
||
715 |
// Set new offset and increase subblock count |
|
716 |
aCurrentMsgOffset = |
|
717 |
aCurrentMsgOffset + SIZE_CALL_MODEM_SB_DTMF_TIMERS; |
|
718 |
aNumOfSbInMessage++; |
|
719 |
} |
|
720 |
||
721 |
return createReq; |
|
722 |
} |
|
723 |
||
724 |
// NOTE: |
|
725 |
// The following methods are part of Custom Tsy |
|
726 |
// |
|
727 |
||
728 |
// ----------------------------------------------------------------------------- |
|
729 |
// CMmDtmfMessHandler::CallDtmfToneInd |
|
730 |
// Breaks a CALL_MODEM_DTMF_TONE_IND ISI message and completes NotifyDtmfEvent |
|
731 |
// with gathered data. |
|
732 |
// ----------------------------------------------------------------------------- |
|
733 |
// |
|
734 |
void CMmDtmfMessHandler::CallDtmfToneInd( |
|
735 |
const TIsiReceiveC &aIsiMessage ) //received ISI message |
|
736 |
{ |
|
737 |
||
738 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::CallDtmfToneInd"); |
|
9 | 739 |
OstTrace0( TRACE_NORMAL, CMMDTMFMESSHANDLER_CALLDTMFTONEIND_TD, "CMmDtmfMessHandler::CallDtmfToneInd" ); |
0 | 740 |
|
741 |
//create and initialize TDtmfInfo |
|
742 |
RMmCustomAPI::TDtmfInfo dtmfInfo; |
|
743 |
dtmfInfo.iType = RMmCustomAPI::EDtmfSequence; |
|
744 |
dtmfInfo.iEvent = RMmCustomAPI::EDtmfAbort; |
|
745 |
dtmfInfo.iTone = CALL_MODEM_DTMF_NO_TONE; |
|
746 |
||
747 |
TUint sbStartOffSet( 0 ); |
|
748 |
||
749 |
// get dtmf tone sub block |
|
750 |
TInt returnValue( aIsiMessage.FindSubBlockOffsetById( |
|
751 |
ISI_HEADER_SIZE + CALL_MODEM_DTMF_TONE_IND_OFFSET_TONE, CALL_MODEM_SB_DTMF_TONE, |
|
752 |
EIsiSubBlockTypeId8Len8, sbStartOffSet ) ); |
|
753 |
||
754 |
// if subblock was found |
|
755 |
if ( KErrNone == returnValue ) |
|
756 |
{ |
|
757 |
// get DTMF tone |
|
758 |
TUint16 dtmfTone ( aIsiMessage.Get16bit( sbStartOffSet + |
|
759 |
CALL_MODEM_SB_DTMF_TONE_OFFSET_TONE ) ); |
|
760 |
||
761 |
//map the values into a TDtmfInfo |
|
762 |
//set the event type |
|
763 |
switch ( iDtmfType ) |
|
764 |
{ |
|
765 |
case EDtmfTypeString: |
|
766 |
{ |
|
767 |
//dtmfInfo.iType already initialized as EDtmfSequence |
|
768 |
break; |
|
769 |
} |
|
770 |
case EDtmfTypeDigit: |
|
771 |
{ |
|
772 |
dtmfInfo.iType = RMmCustomAPI::EDtmfManual; |
|
773 |
break; |
|
774 |
} |
|
775 |
default: |
|
776 |
{ |
|
777 |
returnValue = KErrGeneral; |
|
778 |
break; |
|
779 |
} |
|
780 |
} |
|
781 |
//set the event |
|
782 |
if ( CALL_MODEM_DTMF_NO_TONE == dtmfTone ) |
|
783 |
{ |
|
784 |
dtmfInfo.iEvent = RMmCustomAPI::EDtmfStop; |
|
785 |
//valus of dtmfInfo.iTone has been already set as KCallDtmfNoTone; |
|
786 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::CallDtmfToneInd-> No Tone"); |
|
9 | 787 |
OstTrace0( TRACE_NORMAL, DUP1_CMMDTMFMESSHANDLER_CALLDTMFTONEIND_TD, "CMmDtmfMessHandler::CallDtmfToneInd, No Tone" ); |
0 | 788 |
} |
789 |
else |
|
790 |
{ |
|
791 |
dtmfInfo.iEvent = RMmCustomAPI::EDtmfStart; |
|
792 |
dtmfInfo.iTone = dtmfTone; |
|
793 |
//In this logging the MSB are not wanted to be shown. This clarifies testing. |
|
794 |
TFLOGSTRING2("TSY: CMmDtmfMessHandler::CallDtmfToneInd. Tone: %x", 0x0F&dtmfTone); |
|
795 |
// following lines flagged out just get rid of |
|
796 |
// compiler warning when trace compiler is not |
|
797 |
// in use. |
|
798 |
#ifdef OST_TRACE_COMPILER_IN_USE |
|
799 |
||
800 |
TUint16 tempDtmfTone( 0x0F&dtmfTone ); // Parameter just for tracing |
|
9 | 801 |
OstTraceExt1( TRACE_NORMAL, DUP2_CMMDTMFMESSHANDLER_CALLDTMFTONEIND_TD, "CMmDtmfMessHandler::CallDtmfToneInd;dtmfTone=%hx",tempDtmfTone ); |
0 | 802 |
#endif // OST_TRACE_COMPILER_IN_USE |
803 |
} |
|
804 |
} |
|
805 |
// complete with return value |
|
806 |
// parameter for SOS layer: a RMmCustomAPI::TDtmfInfo |
|
807 |
CMmDataPackage dataPackage; |
|
808 |
dataPackage.PackData( &dtmfInfo ); |
|
809 |
iMessageRouter->Complete( ECustomNotifyDtmfEventIPC, &dataPackage, returnValue ); |
|
810 |
} |
|
811 |
||
812 |
// ----------------------------------------------------------------------------- |
|
813 |
// CMmDtmfMessHandler::HandleError |
|
814 |
// Handles CMmDtmfMessHandler's errors that comes via PhoNetReceiver RunError |
|
815 |
// method. |
|
816 |
// ----------------------------------------------------------------------------- |
|
817 |
// |
|
818 |
void CMmDtmfMessHandler::HandleError( |
|
819 |
const TIsiReceiveC& /*aIsiMessage*/, // Isi message |
|
820 |
TInt /*aError*/ ) // Error code |
|
821 |
{ |
|
822 |
||
823 |
TFLOGSTRING("TSY: CMmDtmfMessHandler::HandleError"); |
|
9 | 824 |
OstTrace0( TRACE_NORMAL, CMMDTMFMESSHANDLER_HANDLEERROR_TD, "CMmDtmfMessHandler::HandleError" ); |
0 | 825 |
|
826 |
} |
|
827 |
||
828 |
// End of File |
|
829 |