|
1 // ssyreferencecmdhandler.cpp |
|
2 |
|
3 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 // All rights reserved. |
|
5 // This component and the accompanying materials are made available |
|
6 // under the terms of "Eclipse Public License v1.0" |
|
7 // which accompanies this distribution, and is available |
|
8 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
9 // |
|
10 // Initial Contributors: |
|
11 // Nokia Corporation - initial contribution. |
|
12 // |
|
13 // Contributors: |
|
14 // |
|
15 // Description: |
|
16 // |
|
17 |
|
18 |
|
19 |
|
20 #include <e32property.h> |
|
21 #include "ssyreferencecmdhandler.h" |
|
22 #include "ssyreferencecontrol.h" |
|
23 #include "ssyreferencechannel.h" |
|
24 #include "ssyreferencetrace.h" |
|
25 |
|
26 // ======== CONSTANTS ======== |
|
27 const TInt KSsyRefShortDelay = 100; |
|
28 |
|
29 // ======== MEMBER FUNCTIONS ======== |
|
30 |
|
31 // --------------------------------------------------------------------------- |
|
32 // CSsyReferenceCmdHandler C++ constructor |
|
33 // --------------------------------------------------------------------------- |
|
34 // |
|
35 CSsyReferenceCmdHandler::CSsyReferenceCmdHandler( CSsyReferenceChannel& aSsyChannel ) : |
|
36 CActive( EPriorityNormal ), |
|
37 iSsyChannel( aSsyChannel ) |
|
38 { |
|
39 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::CSsyReferenceCmdHandler()" ) ) ); |
|
40 CActiveScheduler::Add( this ); |
|
41 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::CSsyReferenceCmdHandler() - return" ) ) ); |
|
42 } |
|
43 |
|
44 |
|
45 // --------------------------------------------------------------------------- |
|
46 // Symbian 2nd phase constructor |
|
47 // --------------------------------------------------------------------------- |
|
48 // |
|
49 void CSsyReferenceCmdHandler::ConstructL() |
|
50 { |
|
51 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ConstructL()" ) ) ); |
|
52 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ConstructL() - return" ) ) ); |
|
53 } |
|
54 |
|
55 |
|
56 // --------------------------------------------------------------------------- |
|
57 // CSsyReferenceCmdHandler::NewL |
|
58 // --------------------------------------------------------------------------- |
|
59 // |
|
60 CSsyReferenceCmdHandler* CSsyReferenceCmdHandler::NewL( CSsyReferenceChannel& aSsyChannel ) |
|
61 { |
|
62 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::NewL()" ) ) ); |
|
63 CSsyReferenceCmdHandler* self = new ( ELeave ) CSsyReferenceCmdHandler( aSsyChannel ); |
|
64 CleanupStack::PushL( self ); |
|
65 self->ConstructL(); |
|
66 CleanupStack::Pop( self ); |
|
67 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::NewL() - return" ) ) ); |
|
68 return self; |
|
69 } |
|
70 |
|
71 // --------------------------------------------------------------------------- |
|
72 // Destructor |
|
73 // --------------------------------------------------------------------------- |
|
74 // |
|
75 CSsyReferenceCmdHandler::~CSsyReferenceCmdHandler() |
|
76 { |
|
77 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::~CSsyReferenceCmdHandler()" ) ) ); |
|
78 |
|
79 if ( iMessage ) |
|
80 { |
|
81 // Send ProcessResponse |
|
82 iMessage->SetError( KErrCancel ); |
|
83 iSsyChannel.ProcessResponse( iMessage ); |
|
84 delete iMessage; |
|
85 iMessage = NULL; |
|
86 } |
|
87 |
|
88 if ( iTimer ) |
|
89 { |
|
90 iTimer->Cancel(); |
|
91 delete iTimer; |
|
92 } |
|
93 |
|
94 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::~CSsyReferenceCmdHandler() - return" ) ) ); |
|
95 } |
|
96 |
|
97 // --------------------------------------------------------------------------- |
|
98 // CSsyReferenceCmdHandler::ProcessCommand |
|
99 // --------------------------------------------------------------------------- |
|
100 // |
|
101 TInt CSsyReferenceCmdHandler::ProcessCommand( TSsyReferenceMsg aMessage ) |
|
102 { |
|
103 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand()" ) ) ); |
|
104 TInt err( KErrAlreadyExists ); |
|
105 |
|
106 // Special case, when channel is reciving, iMessage is not deleted after ProcessCommand |
|
107 if ( aMessage.Function() == ESsyReferenceStopChannelData ) |
|
108 { |
|
109 // Stop 'receiving'. No need to handle this asynchronously |
|
110 if ( iTimer ) |
|
111 { |
|
112 iTimer->Cancel(); |
|
113 delete iTimer; |
|
114 iTimer = NULL; |
|
115 } |
|
116 |
|
117 iDataItemArray.Reset(); |
|
118 iDataItemPtr = 0; |
|
119 err = KErrNone; |
|
120 // No need to send ProcessResponse either |
|
121 delete iMessage; |
|
122 iMessage = NULL; |
|
123 } |
|
124 else if ( !iMessage ) |
|
125 { |
|
126 iMessage = new TSsyReferenceMsg( aMessage ); |
|
127 if(iMessage) |
|
128 { |
|
129 switch( aMessage.Function() ) |
|
130 { |
|
131 case ESsyReferenceStartChannelData: |
|
132 { |
|
133 // Get channel data items and start 'receiving' |
|
134 IssueRequest(); |
|
135 err = KErrNone; |
|
136 break; |
|
137 } |
|
138 case ESsyReferenceOpenChannel: |
|
139 { |
|
140 // Open channel specific handling here |
|
141 IssueRequest(); |
|
142 err = KErrNone; |
|
143 break; |
|
144 } |
|
145 case ESsyReferenceCloseChannel: |
|
146 { |
|
147 // Close channel specific handling here |
|
148 IssueRequest(); |
|
149 err = KErrNone; |
|
150 break; |
|
151 } |
|
152 default: |
|
153 { |
|
154 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand() - Unknown function" ) ) ); |
|
155 err = KErrNotFound; |
|
156 } |
|
157 } |
|
158 } |
|
159 else |
|
160 { |
|
161 err = KErrNoMemory; |
|
162 } |
|
163 } |
|
164 else |
|
165 { |
|
166 err = KErrUnknown; |
|
167 } |
|
168 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand() - return" ) ) ); |
|
169 return err; |
|
170 } |
|
171 |
|
172 // --------------------------------------------------------------------------- |
|
173 // CSsyReferenceCmdHandler::IssueRequest |
|
174 // --------------------------------------------------------------------------- |
|
175 // |
|
176 void CSsyReferenceCmdHandler::IssueRequest( TInt aError ) |
|
177 { |
|
178 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::IssueRequest()" ) ) ); |
|
179 // Provides synchronous function calls to be handled as asynchronous |
|
180 if ( !IsActive() ) |
|
181 { |
|
182 TRequestStatus *s = &iStatus; |
|
183 User::RequestComplete( s, aError ); |
|
184 SetActive(); |
|
185 } |
|
186 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::IssueRequest() - return" ) ) ); |
|
187 } |
|
188 |
|
189 // --------------------------------------------------------------------------- |
|
190 // CSsyReferenceCmdHandler::SendResponse |
|
191 // --------------------------------------------------------------------------- |
|
192 // |
|
193 void CSsyReferenceCmdHandler::SendResponse( TInt aError ) |
|
194 { |
|
195 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::SendResponse()" ) ) ); |
|
196 // Send response to channel |
|
197 if ( iMessage ) |
|
198 { |
|
199 iMessage->SetError( aError ); |
|
200 iSsyChannel.ProcessResponse( iMessage ); |
|
201 delete iMessage; |
|
202 iMessage = NULL; |
|
203 } |
|
204 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::SendResponse() - return" ) ) ); |
|
205 } |
|
206 |
|
207 // --------------------------------------------------------------------------- |
|
208 // CSsyReferenceCmdHandler::RunL |
|
209 // --------------------------------------------------------------------------- |
|
210 // |
|
211 void CSsyReferenceCmdHandler::RunL() |
|
212 { |
|
213 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunL() - %i" ), iStatus.Int() ) ); |
|
214 |
|
215 TInt err( iStatus.Int() ); |
|
216 |
|
217 if ( iMessage ) |
|
218 { |
|
219 switch( iMessage->Function() ) |
|
220 { |
|
221 case ESsyReferenceStartChannelData: |
|
222 { |
|
223 TInt startInterval( 0 ); |
|
224 |
|
225 // Get all Channel data information from config file |
|
226 iSsyChannel.SsyControl().SsyConfig(). |
|
227 GetChannelDataInformationL( iMessage->ChannelId(), iDataItemArray, startInterval ); |
|
228 |
|
229 // Check that channel data items were found |
|
230 if ( iDataItemArray.Count() ) |
|
231 { |
|
232 // If interval is zero, set small interval |
|
233 if ( startInterval == 0 ) |
|
234 { |
|
235 startInterval = KSsyRefShortDelay; |
|
236 } |
|
237 |
|
238 // wait that interval |
|
239 if ( iTimer ) |
|
240 { |
|
241 iTimer->Cancel(); |
|
242 delete iTimer; |
|
243 iTimer = NULL; |
|
244 } |
|
245 |
|
246 // Reset pointer |
|
247 iDataItemPtr = 0; |
|
248 |
|
249 // Start timer and continue processing in callback function |
|
250 iTimer = CPeriodic::NewL( EPriorityNormal ); |
|
251 iTimer->Start( startInterval * 1000, 0, TCallBack( DataItemCallback, this ) ); |
|
252 } |
|
253 break; |
|
254 } |
|
255 case ESsyReferenceOpenChannel: |
|
256 { |
|
257 // Open channel response specific handling here |
|
258 iMessage->SetFunction( ESsyReferenceOpenChannelResp ); |
|
259 SendResponse(); |
|
260 break; |
|
261 } |
|
262 case ESsyReferenceCloseChannel: |
|
263 { |
|
264 // Close channel response specific handling here |
|
265 iMessage->SetFunction( ESsyReferenceCloseChannelResp ); |
|
266 SendResponse(); |
|
267 break; |
|
268 } |
|
269 default: |
|
270 { |
|
271 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::ProcessCommand() - Unknown function" ) ) ); |
|
272 err = KErrNotFound; |
|
273 } |
|
274 } |
|
275 } |
|
276 |
|
277 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunL() - return" ) ) ); |
|
278 } |
|
279 |
|
280 // --------------------------------------------------------------------------- |
|
281 // CSsyReferenceCmdHandler::DoCancel |
|
282 // --------------------------------------------------------------------------- |
|
283 // |
|
284 void CSsyReferenceCmdHandler::DoCancel() |
|
285 { |
|
286 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::DoCancel()" ) ) ); |
|
287 |
|
288 // Handle cancel for this channel. Cancel any ongoing requests |
|
289 |
|
290 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::DoCancel() - return" ) ) ); |
|
291 } |
|
292 |
|
293 // --------------------------------------------------------------------------- |
|
294 // CSsyReferenceCmdHandler::RunError |
|
295 // --------------------------------------------------------------------------- |
|
296 // |
|
297 TInt CSsyReferenceCmdHandler::RunError( TInt /*aError*/ ) |
|
298 { |
|
299 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunError()" ) ) ); |
|
300 |
|
301 // Handle possible errors here and return KErrNone to prevent SSY from panic |
|
302 |
|
303 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::RunError() - return" ) ) ); |
|
304 return KErrNone; |
|
305 } |
|
306 |
|
307 // --------------------------------------------------------------------------- |
|
308 // CSsyReferenceCmdHandler::DataItemCallback |
|
309 // --------------------------------------------------------------------------- |
|
310 // |
|
311 TInt CSsyReferenceCmdHandler::DataItemCallback( TAny* aThis ) |
|
312 { |
|
313 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::DataItemCallback()" ) ) ); |
|
314 return static_cast<CSsyReferenceCmdHandler*>( aThis )->GenerateChannelDataItem(); |
|
315 } |
|
316 |
|
317 // --------------------------------------------------------------------------- |
|
318 // CSsyReferenceCmdHandler::GenerateChannelDataItem |
|
319 // --------------------------------------------------------------------------- |
|
320 // |
|
321 TInt CSsyReferenceCmdHandler::GenerateChannelDataItem() |
|
322 { |
|
323 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::GenerateChannelDataItem()" ) ) ); |
|
324 |
|
325 // Get next item from list and set pointer to next item |
|
326 TSsyRefChannelDataBase dataItem = iDataItemArray[iDataItemPtr++]; |
|
327 |
|
328 // Get next item interval from data item |
|
329 TInt nextInterval( dataItem.Interval() ); |
|
330 |
|
331 // Set timestamp to data item |
|
332 TTime time; |
|
333 time.HomeTime(); |
|
334 dataItem.SetTimestamp( time ); |
|
335 |
|
336 // If interval is zero, set small interval |
|
337 if ( nextInterval == 0 ) |
|
338 { |
|
339 nextInterval = KSsyRefShortDelay; |
|
340 } |
|
341 |
|
342 // Add data item to message |
|
343 iMessage->SetDataItem( &dataItem ); |
|
344 |
|
345 // If in last data item, set pointer back to first item |
|
346 if ( iDataItemArray.Count() == iDataItemPtr ) |
|
347 { |
|
348 iDataItemPtr = 0; |
|
349 } |
|
350 |
|
351 // Send response and start new timer |
|
352 iMessage->SetFunction( ESsyReferenceDataItemReceived ); |
|
353 iSsyChannel.ProcessResponse( iMessage ); |
|
354 |
|
355 if ( iTimer ) |
|
356 { |
|
357 delete iTimer; |
|
358 iTimer = NULL; |
|
359 } |
|
360 |
|
361 TRAP_IGNORE( iTimer = CPeriodic::NewL( EPriorityNormal ); |
|
362 iTimer->Start( nextInterval * 1000, 0, TCallBack( DataItemCallback, this ) ); ) |
|
363 |
|
364 COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceCmdHandler::GenerateChannelDataItem() - return" ) ) ); |
|
365 return KErrNone; |
|
366 } |
|
367 |