|
1 /* |
|
2 * Copyright (c) 2006 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 "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: MNcdProtocolDefaultObserverImpl implementation |
|
15 * |
|
16 */ |
|
17 |
|
18 |
|
19 #include <s32mem.h> |
|
20 #include <e32property.h> |
|
21 |
|
22 #include "catalogsdebug.h" |
|
23 #include "catalogsconstants.h" |
|
24 #include "catalogscontext.h" |
|
25 #include "ncd_cp_actionrequest.h" |
|
26 #include "ncd_cp_clientconfiguration.h" |
|
27 #include "ncd_cp_detail.h" |
|
28 #include "ncd_cp_query.h" |
|
29 #include "ncd_cp_serverdetails.h" |
|
30 #include "ncd_pp_error.h" |
|
31 #include "ncd_pp_datablock.h" |
|
32 #include "ncd_pp_information.h" |
|
33 #include "ncd_pp_subscription.h" |
|
34 #include "ncdprotocoldefaultobserverimpl.h" |
|
35 #include "ncdconfigurationmanager.h" |
|
36 #include "ncd_cp_cookie.h" |
|
37 #include "ncdserverdetails.h" |
|
38 #include "ncdproviderdefines.h" |
|
39 #include "ncdsubscriptionmanagerimpl.h" |
|
40 |
|
41 // Action targets |
|
42 _LIT( KNcdActionTargetMasterServerUri, "masterServerUri" ); |
|
43 _LIT( KNcdActionTargetSkin, "skin" ); |
|
44 _LIT( KNcdActionTargetClient, "client" ); |
|
45 |
|
46 |
|
47 |
|
48 CNcdProtocolDefaultObserver* CNcdProtocolDefaultObserver::NewL( |
|
49 MCatalogsContext& aContext, |
|
50 MNcdConfigurationManager& aConfigurationManager, |
|
51 CNcdSubscriptionManager& aSubscriptionManager, |
|
52 const TDesC& aServerUri ) |
|
53 { |
|
54 CNcdProtocolDefaultObserver* self = new(ELeave) |
|
55 CNcdProtocolDefaultObserver( aContext, |
|
56 aConfigurationManager, aSubscriptionManager ); |
|
57 CleanupStack::PushL( self ); |
|
58 self->ConstructL( aServerUri ); |
|
59 CleanupStack::Pop( self ); |
|
60 return self; |
|
61 } |
|
62 |
|
63 CNcdProtocolDefaultObserver::CNcdProtocolDefaultObserver( |
|
64 MCatalogsContext& aContext, |
|
65 MNcdConfigurationManager& aConfigurationManager, |
|
66 CNcdSubscriptionManager& aSubscriptionManager ) |
|
67 : iContext( aContext ), |
|
68 iConfigurationManager( aConfigurationManager ), |
|
69 iSubscriptionManager( aSubscriptionManager ) |
|
70 { |
|
71 } |
|
72 |
|
73 CNcdProtocolDefaultObserver::~CNcdProtocolDefaultObserver() |
|
74 { |
|
75 delete iServerUri; |
|
76 } |
|
77 |
|
78 |
|
79 void CNcdProtocolDefaultObserver::ConstructL( const TDesC& aServerUri ) |
|
80 { |
|
81 iServerUri = aServerUri.AllocL(); |
|
82 } |
|
83 |
|
84 //***************************************************************************** |
|
85 // MNcdParserConfigurationProtocolObserver |
|
86 //***************************************************************************** |
|
87 |
|
88 void CNcdProtocolDefaultObserver::ConfigurationBeginL( const TDesC& /*aVersion*/, |
|
89 TInt /*aExpirationDelta*/ ) |
|
90 { |
|
91 DLTRACEIN(("")); |
|
92 } |
|
93 |
|
94 void CNcdProtocolDefaultObserver::ConfigurationQueryL( |
|
95 MNcdConfigurationProtocolQuery* aQuery ) |
|
96 { |
|
97 DLTRACEIN(("")); |
|
98 // The queries by now should be handled by other interested parties. |
|
99 // Do nothing. |
|
100 delete aQuery; |
|
101 } |
|
102 |
|
103 void CNcdProtocolDefaultObserver::ClientConfigurationL( |
|
104 MNcdConfigurationProtocolClientConfiguration* aConfiguration ) |
|
105 { |
|
106 DLTRACEIN(("")); |
|
107 CleanupDeletePushL( aConfiguration ); |
|
108 |
|
109 // Should interpret details to grab master server validity information, |
|
110 // for example |
|
111 |
|
112 // pass cookies to cookie handler |
|
113 TInt cookieCount = aConfiguration->CookieCount(); |
|
114 DLINFO(("cookie count=%d",cookieCount)); |
|
115 |
|
116 // Get SSID |
|
117 const TDesC8& ssid( iConfigurationManager.SsidL( iContext ) ); |
|
118 |
|
119 MNcdServerDetails& details( |
|
120 iConfigurationManager.ServerDetailsL( iContext, |
|
121 *iServerUri, |
|
122 NcdProviderDefines::KConfigNamespace )); |
|
123 |
|
124 |
|
125 for ( TInt i = 0; i < cookieCount; ++i ) |
|
126 { |
|
127 const MNcdConfigurationProtocolCookie& cookie( |
|
128 aConfiguration->CookieL( i ) ); |
|
129 details.AddCookieL( cookie, ssid ); |
|
130 } |
|
131 |
|
132 CleanupStack::PopAndDestroy( aConfiguration ); |
|
133 DLTRACEOUT(("")); |
|
134 } |
|
135 |
|
136 void CNcdProtocolDefaultObserver::ConfigurationDetailsL( |
|
137 CArrayPtr<MNcdConfigurationProtocolDetail>* aDetails ) |
|
138 { |
|
139 DLTRACEIN(("")); |
|
140 aDetails->ResetAndDestroy(); |
|
141 delete aDetails; |
|
142 } |
|
143 |
|
144 void CNcdProtocolDefaultObserver::ConfigurationActionRequestL( |
|
145 MNcdConfigurationProtocolActionRequest* aActionRequest ) |
|
146 { |
|
147 DLTRACEIN(("")); |
|
148 |
|
149 CleanupDeletePushL( aActionRequest ); |
|
150 |
|
151 if( aActionRequest->Type() == MNcdConfigurationProtocolActionRequest::ETypeUpdate && |
|
152 aActionRequest->UpdateDetails() ) |
|
153 { |
|
154 DLTRACE(( "Update" )); |
|
155 |
|
156 DLINFO(( _L("Target: %S"), &aActionRequest->Target() )); |
|
157 DLINFO(( _L("Id: %S"), &aActionRequest->UpdateDetails()->Id() )); |
|
158 DLINFO(( _L("Version: %S"), &aActionRequest->UpdateDetails()->Version() )); |
|
159 DLINFO(( _L("Uri: %S"), &aActionRequest->UpdateDetails()->Uri() )); |
|
160 DLINFO(( "Forced: %d", aActionRequest->Force() )); |
|
161 |
|
162 DLINFO(( "Client SID %08x", iContext.SecureId().iId )); |
|
163 |
|
164 if ( aActionRequest->Target() == KNcdActionTargetMasterServerUri && |
|
165 aActionRequest->UpdateDetails()->Uri().Length() ) |
|
166 { |
|
167 const TDesC& currentMaster( iConfigurationManager.MasterServerAddressL( |
|
168 iContext ) ); |
|
169 |
|
170 // Ensure that request was received from the master server |
|
171 if ( *iServerUri == currentMaster ) |
|
172 { |
|
173 /** |
|
174 * @ Improve this check to notice missing '/' at the end of the URIs |
|
175 */ |
|
176 if ( aActionRequest->UpdateDetails()->Uri() != currentMaster ) |
|
177 { |
|
178 DLINFO(("Updating MasterServerUri")); |
|
179 |
|
180 iConfigurationManager.SetMasterServerAddressL( iContext, |
|
181 aActionRequest->UpdateDetails()->Uri(), 0 ); |
|
182 } |
|
183 else |
|
184 { |
|
185 DLINFO(("MasterServerUri didn't change")); |
|
186 } |
|
187 } |
|
188 else |
|
189 { |
|
190 DLERROR(( _L("Invalid update request source! Request source: %S"), |
|
191 iServerUri )); |
|
192 } |
|
193 } |
|
194 else if( aActionRequest->Target() == KNcdActionTargetSkin || |
|
195 aActionRequest->Target() == KNcdActionTargetClient ) |
|
196 { |
|
197 HBufC* msgQueueName = HBufC::NewLC( KCatalogsUpdateQueueNameFormat().Length() + 8 ); |
|
198 msgQueueName->Des().Format( KCatalogsUpdateQueueNameFormat, iContext.SecureId().iId ); |
|
199 |
|
200 DLINFO(( _L("Opening client's update message queue: %S"), msgQueueName )); |
|
201 RMsgQueueBase queue; |
|
202 |
|
203 TInt err = queue.OpenGlobal( *msgQueueName ); |
|
204 if( err == KErrNone ) |
|
205 { |
|
206 CleanupClosePushL( queue ); |
|
207 TInt msgSize = queue.MessageSize(); |
|
208 |
|
209 // Prepare a buffer to write to update information P&S variable. |
|
210 CBufFlat* buffer = CBufFlat::NewL( KCatalogsUpdateInformationMaxSize + msgSize ); |
|
211 CleanupStack::PushL( buffer ); |
|
212 |
|
213 // Externalize the info to the buffer. |
|
214 RBufWriteStream stream( *buffer ); |
|
215 CleanupClosePushL( stream ); |
|
216 stream << (TInt32)(aActionRequest->Target().Size() + |
|
217 aActionRequest->UpdateDetails()->Id().Size() + |
|
218 aActionRequest->UpdateDetails()->Version().Size() + |
|
219 aActionRequest->UpdateDetails()->Uri().Size() + |
|
220 sizeof( TInt32 )); |
|
221 stream << aActionRequest->Target(); |
|
222 stream << aActionRequest->UpdateDetails()->Id(); |
|
223 stream << aActionRequest->UpdateDetails()->Version(); |
|
224 stream << aActionRequest->UpdateDetails()->Uri(); |
|
225 stream << (TInt32)aActionRequest->Force(); |
|
226 |
|
227 // Write the update information to the client's update message queue. |
|
228 TInt bytesToSend = buffer->Size(); |
|
229 for( TInt sendPos = 0; sendPos < bytesToSend; sendPos += msgSize ) |
|
230 { |
|
231 const TUint8* sendPtr = buffer->Ptr( sendPos ).Ptr(); |
|
232 queue.SendBlocking( sendPtr, msgSize ); |
|
233 } |
|
234 |
|
235 DLINFO(( "Update information sent to message queue" )); |
|
236 |
|
237 CleanupStack::PopAndDestroy( 3, &queue ); // stream-close, buffer, queue |
|
238 } |
|
239 |
|
240 // Clean up the local info buffer. |
|
241 CleanupStack::PopAndDestroy( msgQueueName ); |
|
242 } |
|
243 else |
|
244 { |
|
245 DLINFO(("Unknown Action target")); |
|
246 } |
|
247 } |
|
248 // Action request no longer needed, delete it. |
|
249 CleanupStack::PopAndDestroy( aActionRequest ); |
|
250 } |
|
251 |
|
252 |
|
253 void CNcdProtocolDefaultObserver::ConfigurationServerDetailsL( |
|
254 MNcdConfigurationProtocolServerDetails* aServerDetails ) |
|
255 { |
|
256 DLTRACEIN(("")); |
|
257 DASSERT( aServerDetails ); |
|
258 DASSERT( iServerUri ); |
|
259 DLINFO(("Server supports %d capabilities", |
|
260 aServerDetails->CapabilityCount() )); |
|
261 |
|
262 CleanupDeletePushL( aServerDetails ); |
|
263 |
|
264 if ( aServerDetails->CapabilityCount() ) |
|
265 { |
|
266 DLTRACE(("Adding capabilities to server details")); |
|
267 MNcdServerDetails& details( |
|
268 iConfigurationManager.ServerDetailsL( iContext, |
|
269 *iServerUri, |
|
270 NcdProviderDefines::KConfigNamespace )); |
|
271 |
|
272 // Clear old caps so that we don't just keep on adding them. |
|
273 // AddCapabilityL does NOT check for duplicates |
|
274 details.ClearCapabilitiesL(); |
|
275 |
|
276 for ( TInt i = 0; i < aServerDetails->CapabilityCount(); ++i ) |
|
277 { |
|
278 details.AddCapabilityL( aServerDetails->CapabilityL( i ) ); |
|
279 } |
|
280 iConfigurationManager.SaveConfigurationToDbL( iContext ); |
|
281 } |
|
282 CleanupStack::PopAndDestroy( aServerDetails ); |
|
283 } |
|
284 |
|
285 void CNcdProtocolDefaultObserver::ConfigurationErrorL( |
|
286 MNcdConfigurationProtocolError* aError ) |
|
287 { |
|
288 DLTRACEIN(("")); |
|
289 delete aError; |
|
290 } |
|
291 |
|
292 void CNcdProtocolDefaultObserver::ConfigurationEndL() |
|
293 { |
|
294 DLTRACEIN(("")); |
|
295 } |
|
296 |
|
297 |
|
298 //***************************************************************************** |
|
299 // MNcdParserInformationObserver |
|
300 //***************************************************************************** |
|
301 |
|
302 void CNcdProtocolDefaultObserver::InformationL( |
|
303 MNcdPreminetProtocolInformation* aData ) |
|
304 { |
|
305 DLTRACEIN(( _L("Namespace: %S"), &aData->Namespace() )); |
|
306 CleanupDeletePushL( aData ); |
|
307 |
|
308 |
|
309 TInt cookieCount = aData->CookieCount(); |
|
310 DLINFO(("cookie count=%d",cookieCount)); |
|
311 |
|
312 MNcdServerDetails& details( |
|
313 iConfigurationManager.ServerDetailsL( iContext, *iServerUri, |
|
314 aData->Namespace() )); |
|
315 |
|
316 |
|
317 // Get SSID |
|
318 const TDesC8& ssid( iConfigurationManager.SsidL( iContext ) ); |
|
319 |
|
320 for ( TInt i = 0; i < cookieCount; ++i ) |
|
321 { |
|
322 const MNcdConfigurationProtocolCookie& cookie( aData->CookieL( i ) ); |
|
323 details.AddCookieL( cookie, ssid ); |
|
324 } |
|
325 |
|
326 |
|
327 // Handle server capabilities |
|
328 DLTRACE(("Handle server capabilities")); |
|
329 const MNcdConfigurationProtocolServerDetails* serverDetails = |
|
330 aData->ServerDetails(); |
|
331 |
|
332 DLTRACE(("ServerDetails-ptr: %x", serverDetails )); |
|
333 |
|
334 if ( serverDetails && serverDetails->CapabilityCount() ) |
|
335 { |
|
336 // Clear old caps so that we don't just keep on adding them. |
|
337 // AddCapabilityL does NOT check for duplicates |
|
338 details.ClearCapabilitiesL(); |
|
339 |
|
340 DLINFO(("Capabilities: %d", serverDetails->CapabilityCount() )); |
|
341 DLTRACE(("Adding capabilities to server details")); |
|
342 |
|
343 for ( TInt i = 0; i < serverDetails->CapabilityCount(); ++i ) |
|
344 { |
|
345 details.AddCapabilityL( serverDetails->CapabilityL( i ) ); |
|
346 } |
|
347 |
|
348 } |
|
349 iConfigurationManager.SaveConfigurationToDbL( iContext ); |
|
350 CleanupStack::PopAndDestroy( aData ); |
|
351 DLTRACEOUT(("Protocol information handled")); |
|
352 } |
|
353 |
|
354 //***************************************************************************** |
|
355 // MNcdParserDataBlocksObserver |
|
356 //***************************************************************************** |
|
357 |
|
358 void CNcdProtocolDefaultObserver::DataBlocksL( |
|
359 CArrayPtr<MNcdPreminetProtocolDataBlock>* aData ) |
|
360 { |
|
361 DLTRACEIN(("")); |
|
362 aData->ResetAndDestroy(); |
|
363 delete aData; |
|
364 } |
|
365 |
|
366 //***************************************************************************** |
|
367 // MNcdParserErrorObserver |
|
368 //***************************************************************************** |
|
369 |
|
370 void CNcdProtocolDefaultObserver::ErrorL( MNcdPreminetProtocolError* aData ) |
|
371 { |
|
372 DLTRACEIN(("")); |
|
373 delete aData; |
|
374 } |
|
375 |
|
376 |
|
377 //***************************************************************************** |
|
378 // MNcdParserQueryObserver |
|
379 //***************************************************************************** |
|
380 |
|
381 void CNcdProtocolDefaultObserver::QueryL( MNcdConfigurationProtocolQuery* aData ) |
|
382 { |
|
383 DLTRACEIN(("")); |
|
384 delete aData; |
|
385 } |
|
386 |
|
387 //***************************************************************************** |
|
388 // MNcdParserSubscriptionObserver |
|
389 //***************************************************************************** |
|
390 |
|
391 void CNcdProtocolDefaultObserver::ValidSubscriptionL( |
|
392 MNcdPreminetProtocolSubscription* aData ) |
|
393 { |
|
394 DLTRACEIN(("")); |
|
395 iSubscriptionManager.InternalizeSubscriptionL( |
|
396 iContext.FamilyId(), *iServerUri, *aData, &iContext, NULL ); |
|
397 delete aData; |
|
398 } |
|
399 |
|
400 void CNcdProtocolDefaultObserver::OldSubscriptionL( |
|
401 MNcdPreminetProtocolSubscription* aData ) |
|
402 { |
|
403 DLTRACEIN(("")); |
|
404 iSubscriptionManager.InternalizeSubscriptionL( |
|
405 iContext.FamilyId(), *iServerUri, *aData, &iContext, NULL ); |
|
406 delete aData; |
|
407 } |