56
|
1 |
// Copyright (c) 2007-2010 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 |
// TraceCore configuration message subscriber
|
|
15 |
//
|
|
16 |
|
|
17 |
#include "TraceCoreInternalMessageHandler.h"
|
|
18 |
#include "TraceCoreConstants.h"
|
|
19 |
#include "TraceCoreDebug.h"
|
|
20 |
#include "TraceCore.h"
|
|
21 |
#include "TraceCoreMessageSender.h"
|
|
22 |
|
|
23 |
#include "OstTraceDefinitions.h"
|
|
24 |
#ifdef OST_TRACE_COMPILER_IN_USE
|
|
25 |
#include "TraceCoreInternalMessageHandlerTraces.h"
|
|
26 |
#endif
|
|
27 |
|
|
28 |
|
|
29 |
|
|
30 |
/**
|
|
31 |
* TraceCore protocol id
|
|
32 |
*/
|
|
33 |
const TInt KOSTTraceCoreProtocolId = 0x91;
|
|
34 |
|
|
35 |
/**
|
|
36 |
* Version for version query
|
|
37 |
*/
|
|
38 |
const TInt KOSTVersionForVersionQuery = 0x00;
|
|
39 |
|
|
40 |
/**
|
|
41 |
* Version / System protocol id
|
|
42 |
*/
|
|
43 |
const TInt KOSTVersionSystemProtocolId= 0x00;
|
|
44 |
|
|
45 |
/**
|
|
46 |
* Version align request
|
|
47 |
*/
|
|
48 |
const TInt KOSTAlignVersionRequest = 0x00;
|
|
49 |
|
|
50 |
/**
|
|
51 |
* Version align response
|
|
52 |
*/
|
|
53 |
const TInt KOSTAlignVersionResponse = 0x01;
|
|
54 |
|
|
55 |
/**
|
|
56 |
* Version unsupported version error
|
|
57 |
* const TInt KOSTUnsupportedVersionError = 0xFD;
|
|
58 |
*/
|
|
59 |
|
|
60 |
/**
|
|
61 |
* Version MessageSyntaxError
|
|
62 |
* const TInt KOSTMessageSyntaxError = 0xFE;
|
|
63 |
*/
|
|
64 |
|
|
65 |
/**
|
|
66 |
* Version UnknownMessageError
|
|
67 |
* const TInt KOSTUnknownMessageError = 0xFF;
|
|
68 |
*/
|
|
69 |
|
|
70 |
/**
|
|
71 |
* Version MessageSyntaxError
|
|
72 |
*/
|
|
73 |
const TInt KOSTNoMatchingVersion = 0xFE;
|
|
74 |
|
|
75 |
/**
|
|
76 |
* Version UnknownMessageError
|
|
77 |
* const TInt KOSTUnknownError = 0xFF;
|
|
78 |
*/
|
|
79 |
|
|
80 |
/**
|
|
81 |
* Higest supported version
|
|
82 |
*/
|
|
83 |
const TInt KOstHigestSupportedVersion = 0x01;
|
|
84 |
|
|
85 |
/**
|
|
86 |
* Version protocol's transaction id offset after length
|
|
87 |
* offset related to data after header(4bytes)
|
|
88 |
* (4) 0 transaction id
|
|
89 |
* (5) 1 Message id
|
|
90 |
* (6) 2 Result
|
|
91 |
* (7) 3 Filler
|
|
92 |
*/
|
|
93 |
const TInt KOstVersionProtocolTransactionIdOffset = 0x00;
|
|
94 |
|
|
95 |
/**
|
|
96 |
* Version protocol's message id offset after length
|
|
97 |
* offset related to data after header(4bytes)
|
|
98 |
*/
|
|
99 |
const TInt KOstVersionProtocolMessageIdOffset = 0x01;
|
|
100 |
|
|
101 |
/**
|
|
102 |
* Version protocol's Result offset after length
|
|
103 |
* offset related to data after header(4bytes)
|
|
104 |
* used only in response
|
|
105 |
*/
|
|
106 |
const TInt KOstVersionProtocolResultRespOffset = 0x02;
|
|
107 |
|
|
108 |
/**
|
|
109 |
* Version protocol's Filler offset after length
|
|
110 |
* offset related to data after header(4bytes)
|
|
111 |
* used only in response
|
|
112 |
*/
|
|
113 |
const TInt KOstVersionProtocolFillerRespOffset = 0x03;
|
|
114 |
|
|
115 |
/**
|
|
116 |
* Version protocol's Versions field offset after length
|
|
117 |
* offset related to data after header(4bytes)
|
|
118 |
* used only in request
|
|
119 |
*/
|
|
120 |
const TInt KOstVersionProtocolVersionsRequestOffset = 0x02;
|
|
121 |
|
|
122 |
/**
|
|
123 |
* Version protocol's Supported Version field offset after length
|
|
124 |
* offset related to data after header(4bytes)
|
|
125 |
* used only in response
|
|
126 |
*/
|
|
127 |
const TInt KOstVersionProtocolSupportedVersionsRespOffset = 0x04;
|
|
128 |
|
|
129 |
/**
|
|
130 |
* KAlignVersionResponseDataLength
|
|
131 |
*/
|
|
132 |
const TInt KAlignVersionResponseDataLength = 0x05;
|
|
133 |
|
|
134 |
/**
|
|
135 |
* Offset to message ID within configuration request
|
|
136 |
* const TInt KMessageIDOffset = 0;
|
|
137 |
*/
|
|
138 |
|
|
139 |
/**
|
|
140 |
* Media selection request length
|
|
141 |
*/
|
|
142 |
const TInt KPingReqLength = 1;
|
|
143 |
|
|
144 |
/**
|
|
145 |
* Data length of response
|
|
146 |
*/
|
|
147 |
const TInt KResponseDataLength = 4;
|
|
148 |
|
|
149 |
|
|
150 |
/**
|
|
151 |
* Offset to response message
|
|
152 |
*/
|
|
153 |
const TInt KRespMessageIdOffset = 0;
|
|
154 |
|
|
155 |
/**
|
|
156 |
* Offset to response code
|
|
157 |
*/
|
|
158 |
const TInt KRespCodeOffset = 1;
|
|
159 |
|
|
160 |
/**
|
|
161 |
* Offset to fillers
|
|
162 |
*/
|
|
163 |
const TInt KFillerOffset = 2;
|
|
164 |
|
|
165 |
/**
|
|
166 |
* Filler byte value
|
|
167 |
*/
|
|
168 |
const TUint8 KFiller = 0;
|
|
169 |
|
|
170 |
|
|
171 |
/**
|
|
172 |
* Constructor
|
|
173 |
*/
|
|
174 |
DTraceCoreInternalMessageHandler::DTraceCoreInternalMessageHandler()
|
|
175 |
{
|
|
176 |
}
|
|
177 |
|
|
178 |
|
|
179 |
/**
|
|
180 |
* Destructor
|
|
181 |
*/
|
|
182 |
DTraceCoreInternalMessageHandler::~DTraceCoreInternalMessageHandler()
|
|
183 |
{
|
|
184 |
}
|
|
185 |
|
|
186 |
|
|
187 |
/**
|
|
188 |
* Init configuration
|
|
189 |
*/
|
|
190 |
TInt DTraceCoreInternalMessageHandler::Init()
|
|
191 |
{
|
|
192 |
// Subscribe OST
|
|
193 |
TInt err = Subscribe( KOSTTraceCoreProtocolId, EMessageHeaderFormatOst );
|
|
194 |
if(err == KErrNone)
|
|
195 |
{
|
|
196 |
err = Subscribe( KOSTVersionSystemProtocolId, EMessageHeaderFormatOst );
|
|
197 |
}
|
|
198 |
TC_TRACE( ETraceLevelFlow, Kern::Printf( "< DTraceCoreInternalMessageHandler::Init - ret: %d", err ) );
|
|
199 |
return err;
|
|
200 |
}
|
|
201 |
|
|
202 |
|
|
203 |
/**
|
|
204 |
* Callback when a trace activation message is received
|
|
205 |
*
|
|
206 |
* @param aMsg Reference to message
|
|
207 |
*/
|
|
208 |
void DTraceCoreInternalMessageHandler::MessageReceived( TTraceMessage &aMsg )
|
|
209 |
{
|
|
210 |
OstTrace1( TRACE_FLOW, DTraceCoreInternalMessageHandler_MESSAGERECEIVED_ENTRY, "> DTraceCoreInternalMessageHandler::MessageReceived - %d", aMsg.iMessageId);
|
|
211 |
TInt aVersion( ( *aMsg.iHeader )[ 0 ] );
|
|
212 |
|
|
213 |
if (aVersion > KOSTVersionForVersionQuery)
|
|
214 |
{
|
|
215 |
// Add version check later and return KOSTUnsupportedVersionError if version not supported
|
|
216 |
|
|
217 |
//Check that there is enough data
|
|
218 |
if ( aMsg.iData->Length() >= KPingReqLength )
|
|
219 |
{
|
|
220 |
TInt messageID( ( *aMsg.iData )[ 0 ] );
|
|
221 |
|
|
222 |
// Select media request message
|
|
223 |
if ( messageID == 0x00 /* ping subprotocolId 0x00 in side TraceCore protocol 0x91 */ )
|
|
224 |
{
|
|
225 |
SendResponse( aMsg, messageID );
|
|
226 |
}
|
|
227 |
}
|
|
228 |
}
|
|
229 |
else
|
|
230 |
{
|
|
231 |
// Version query
|
|
232 |
HandleOstVersionQuery( aMsg, 0 );
|
|
233 |
}
|
|
234 |
}
|
|
235 |
|
|
236 |
|
|
237 |
/**
|
|
238 |
* Sends a response message
|
|
239 |
*
|
|
240 |
* @param aMsg the incoming message
|
|
241 |
* @param aResult the result code
|
|
242 |
*/
|
|
243 |
void DTraceCoreInternalMessageHandler::SendResponse( TTraceMessage& aMsg, TInt aMessageId )
|
|
244 |
{
|
|
245 |
OstTrace1( TRACE_FLOW, DTraceCoreInternalMessageHandler_SENDRESPONSE_ENTRY, "> DTraceCoreInternalMessageHandler::SendResponse - Msg.id %d", aMsg.iMessageId);
|
|
246 |
TUint8 respCode;
|
|
247 |
if ( aMessageId == 0x00 )
|
|
248 |
{
|
|
249 |
respCode = 0x01;
|
|
250 |
}
|
|
251 |
else
|
|
252 |
{
|
|
253 |
respCode = 0x02;
|
|
254 |
}
|
|
255 |
|
|
256 |
TTraceMessage resp;
|
|
257 |
TBuf8< KResponseDataLength > respData;
|
|
258 |
respData.SetLength( KResponseDataLength );
|
|
259 |
respData[ KRespMessageIdOffset ] = aMessageId;
|
|
260 |
respData[ KRespCodeOffset ] = respCode;
|
|
261 |
for ( TInt i = KFillerOffset; i < KResponseDataLength; i++ )
|
|
262 |
{
|
|
263 |
respData[ i ] = KFiller;
|
|
264 |
}
|
|
265 |
// The original header from the request is set back to the message
|
|
266 |
// -> Media API takes care of formatting the header
|
|
267 |
resp.iHeader = aMsg.iHeader;
|
|
268 |
resp.iData = &respData;
|
|
269 |
resp.iMessageId = KOSTTraceCoreProtocolId;
|
|
270 |
resp.iMsgFormat = aMsg.iMsgFormat;
|
|
271 |
iMessageSender->SendMessage( resp );
|
|
272 |
}
|
|
273 |
|
|
274 |
/**
|
|
275 |
* Handle version query
|
|
276 |
*
|
|
277 |
* @param aMsg the incoming message
|
|
278 |
* @param aResult the result code
|
|
279 |
*/
|
|
280 |
void DTraceCoreInternalMessageHandler::HandleOstVersionQuery( TTraceMessage& aMsg, TInt /*aMessageId*/ )
|
|
281 |
{
|
|
282 |
OstTrace1( TRACE_NORMAL, DTraceCoreInternalMessageHandler_HandleOstVersionQuery_entry, "DTraceCoreInternalMessageHandler::HandleOstVersionQuery Msg.id - %d", aMsg.iMessageId);
|
|
283 |
// Check if align request (should be! not other request under version protocol)
|
|
284 |
TInt higestSupportedVersion( 0x00 ); // 0x00 is sent if no supported version
|
|
285 |
TInt messageId( ( *aMsg.iData )[ KOstVersionProtocolMessageIdOffset ] );
|
|
286 |
|
|
287 |
if( messageId == KOSTAlignVersionRequest)
|
|
288 |
{
|
|
289 |
// Read the list of supported versions in sender side and compare to phone side version
|
|
290 |
TInt versions = aMsg.iData->Length() - 2;
|
|
291 |
for( TInt i = 0; i < versions ; i++ )
|
|
292 |
{
|
|
293 |
TInt version( ( *aMsg.iData )[ KOstVersionProtocolVersionsRequestOffset+i ] );
|
|
294 |
|
|
295 |
// Compare versions to supported version
|
|
296 |
// (When more version supported, create list and compare to it)
|
|
297 |
if ( version == KOstHigestSupportedVersion )
|
|
298 |
{
|
|
299 |
// Supported version found
|
|
300 |
higestSupportedVersion = version;
|
|
301 |
}
|
|
302 |
}
|
|
303 |
|
|
304 |
TUint8 respResult = KOSTNoMatchingVersion;
|
|
305 |
|
|
306 |
if ( higestSupportedVersion != 0x00)
|
|
307 |
{
|
|
308 |
// Supported version found
|
|
309 |
respResult = 0x00; // Succeed
|
|
310 |
}
|
|
311 |
|
|
312 |
TTraceMessage resp;
|
|
313 |
TBuf8< KAlignVersionResponseDataLength > respData;
|
|
314 |
respData.SetLength( KAlignVersionResponseDataLength ); // AlignVersionResponseDataLength
|
|
315 |
respData[ KOstVersionProtocolTransactionIdOffset ] = 0x00;
|
|
316 |
respData[ KOstVersionProtocolMessageIdOffset ] = KOSTAlignVersionResponse;
|
|
317 |
respData[ KOstVersionProtocolResultRespOffset ] = respResult;
|
|
318 |
respData[ KOstVersionProtocolFillerRespOffset ] = 0x00; // Filler
|
|
319 |
respData[ KOstVersionProtocolSupportedVersionsRespOffset ] = higestSupportedVersion;
|
|
320 |
|
|
321 |
// The original header from the request is set back to the message
|
|
322 |
// -> Media API takes care of formatting the header
|
|
323 |
resp.iHeader = aMsg.iHeader;
|
|
324 |
resp.iData = &respData;
|
|
325 |
resp.iMessageId = KOSTVersionSystemProtocolId;
|
|
326 |
resp.iMsgFormat = aMsg.iMsgFormat;
|
|
327 |
|
|
328 |
iMessageSender->SendMessage( resp );
|
|
329 |
|
|
330 |
}
|
|
331 |
}
|
|
332 |
|
|
333 |
// End of File
|