|
1 /* |
|
2 * Copyright (c) 2005-2007 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: Phonebook 2 server app address select phase. |
|
15 * |
|
16 */ |
|
17 |
|
18 #include "CPbk2CommAddressSelectPhase.h" |
|
19 |
|
20 // Phonebook 2 |
|
21 #include "MPbk2ServicePhaseObserver.h" |
|
22 #include "CPbk2ServerAppAppUi.h" |
|
23 #include "CPbk2KeyEventDealer.h" |
|
24 #include <MPbk2DialogEliminator.h> |
|
25 #include <CPbk2AddressSelect.h> |
|
26 #include <TPbk2AddressSelectParams.h> |
|
27 #include <MPbk2ApplicationServices.h> |
|
28 #include <CPbk2PresenceIconInfo.h> |
|
29 #include <Pbk2UIControls.rsg> |
|
30 #include <Pbk2Commands.rsg> |
|
31 #include <CPbk2StoreManager.h> |
|
32 |
|
33 // Virtual Phonebook |
|
34 #include <MVPbkContactLink.h> |
|
35 #include <CVPbkContactLinkArray.h> |
|
36 #include <MVPbkContactOperationBase.h> |
|
37 #include <MVPbkStoreContact.h> |
|
38 #include <CVPbkContactManager.h> |
|
39 #include <VPbkFieldTypeSelectorFactory.h> |
|
40 #include <CVPbkxSPContacts.h> |
|
41 #include <MVPbkContactFieldData.h> |
|
42 #include <MVPbkContactFieldTextData.h> |
|
43 #include <MVPbkContactFieldUriData.h> |
|
44 #include <CVPbkFieldTypeRefsList.h> |
|
45 #include <CVPbkContactFieldIterator.h> |
|
46 #include <VPbkEng.rsg> |
|
47 |
|
48 // System includes |
|
49 #include <barsread.h> |
|
50 #include <avkon.rsg> |
|
51 #include <contactpresencefactory.h> |
|
52 #include <mcontactpresence.h> |
|
53 #include <aknlayoutscalable_avkon.cdl.h> |
|
54 #include <aknlists.h> |
|
55 |
|
56 /// Unnamed namespace for local definitions |
|
57 namespace { |
|
58 |
|
59 // Separator between service name and user's id in the service name returned |
|
60 // in presence icon info. |
|
61 _LIT( KServiceNameSeparator, ":"); |
|
62 |
|
63 const TInt KMaxXspServiceCount = 5; |
|
64 /** |
|
65 * Copies a link array to another. |
|
66 * |
|
67 * @param aSourceLinkArray Link array which is copied |
|
68 * @param aTargetLinkArray Links are copied to this |
|
69 */ |
|
70 void CopyContactLinksL( const MVPbkContactLinkArray& aSourceLinkArray, |
|
71 CVPbkContactLinkArray& aTargetLinkArray ) |
|
72 { |
|
73 const TInt count = aSourceLinkArray.Count(); |
|
74 for ( TInt i(0); i < count; ++i ) |
|
75 { |
|
76 const MVPbkContactLink& contactLink = aSourceLinkArray.At(i); |
|
77 aTargetLinkArray.AppendL( contactLink.CloneLC() ); |
|
78 CleanupStack::Pop(); // link |
|
79 } |
|
80 } |
|
81 |
|
82 struct TMap |
|
83 { |
|
84 VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector selector; |
|
85 TInt resId; |
|
86 }; |
|
87 |
|
88 const TMap KFieldMapTable[] = { |
|
89 { VPbkFieldTypeSelectorFactory::EVoiceCallSelector, R_PBK2_CALL_ITEM_NUMBER_SELECT }, |
|
90 { VPbkFieldTypeSelectorFactory::EUniEditorSelector, R_PBK2_GENERIC_ADDRESS_SELECT }, |
|
91 { VPbkFieldTypeSelectorFactory::EEmailEditorSelector, R_PBK2_EMAIL_ADDRESS_SELECT }, |
|
92 { VPbkFieldTypeSelectorFactory::EInstantMessagingSelector, R_PBK2_GENERIC_ADDRESS_SELECT }, |
|
93 { VPbkFieldTypeSelectorFactory::EVOIPCallSelector, R_PBK2_VOIP_ADDRESS_SELECT }, |
|
94 { VPbkFieldTypeSelectorFactory::EURLSelector, R_PBK2_URL_ADDRESS_SELECT }, |
|
95 { VPbkFieldTypeSelectorFactory::EVideoCallSelector, R_PBK2_VIDEO_NUMBER_SELECT }, |
|
96 { VPbkFieldTypeSelectorFactory::EPocSelector, R_PBK2_POC_ADDRESS_SELECT } |
|
97 }; |
|
98 const TInt KFieldMapTableLength = sizeof( KFieldMapTable ) / sizeof( TMap ); |
|
99 |
|
100 TInt AddressSelectResourceId |
|
101 ( VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aType ) |
|
102 { |
|
103 TInt resourceId = KErrNotFound; |
|
104 for( TInt i = 0; i < KFieldMapTableLength; i++ ) |
|
105 { |
|
106 if( aType == KFieldMapTable[i].selector ) |
|
107 { |
|
108 resourceId = KFieldMapTable[i].resId; |
|
109 break; |
|
110 } |
|
111 } |
|
112 |
|
113 return resourceId; |
|
114 } |
|
115 |
|
116 } /// namespace |
|
117 |
|
118 // -------------------------------------------------------------------------- |
|
119 // CPbk2CommAddressSelectPhase::CPbk2CommAddressSelectPhase |
|
120 // -------------------------------------------------------------------------- |
|
121 // |
|
122 CPbk2CommAddressSelectPhase::CPbk2CommAddressSelectPhase |
|
123 ( MPbk2ServicePhaseObserver& aObserver, |
|
124 RVPbkContactFieldDefaultPriorities& aPriorities, |
|
125 TBool aRskBack, |
|
126 CVPbkFieldTypeSelector& aFieldTypeSelector, |
|
127 VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector |
|
128 aCommSelector ) : |
|
129 iObserver( aObserver ), |
|
130 iPriorities( aPriorities ), |
|
131 iRskBack( aRskBack ), |
|
132 iFieldTypeSelector ( aFieldTypeSelector ), |
|
133 iCommMethod( aCommSelector ) |
|
134 { |
|
135 } |
|
136 |
|
137 // -------------------------------------------------------------------------- |
|
138 // CPbk2CommAddressSelectPhase::~CPbk2CommAddressSelectPhase |
|
139 // -------------------------------------------------------------------------- |
|
140 // |
|
141 CPbk2CommAddressSelectPhase::~CPbk2CommAddressSelectPhase() |
|
142 { |
|
143 if ( iAddressSelectEliminator != NULL ) |
|
144 { |
|
145 iAddressSelectEliminator->ForceExit(); |
|
146 } |
|
147 delete iStoreContact; |
|
148 delete iRetrieveOperation; |
|
149 delete iContactLink; |
|
150 delete iResults; |
|
151 delete iDealer; |
|
152 delete ixSPManager; |
|
153 delete ixSPContactOperation; |
|
154 delete ixSPContactsArray; |
|
155 ixSPStoreContactsArray.ResetAndDestroy(); |
|
156 delete iFieldContent; |
|
157 if( iContactPresence ) |
|
158 { |
|
159 iContactPresence->Close(); |
|
160 iContactPresence = NULL; |
|
161 } |
|
162 iPresenceIconArray.ResetAndDestroy(); |
|
163 } |
|
164 |
|
165 // -------------------------------------------------------------------------- |
|
166 // CPbk2CommAddressSelectPhase::ConstructL |
|
167 // -------------------------------------------------------------------------- |
|
168 // |
|
169 inline void CPbk2CommAddressSelectPhase::ConstructL |
|
170 ( const MVPbkContactLink& aContactLink ) |
|
171 { |
|
172 iEikenv = CEikonEnv::Static(); |
|
173 |
|
174 // Copy contact link provided by the client |
|
175 MVPbkContactLink* link = aContactLink.CloneLC(); |
|
176 User::LeaveIfNull( link ); |
|
177 CleanupStack::Pop(); //link |
|
178 iContactLink = link; |
|
179 |
|
180 iDealer = CPbk2KeyEventDealer::NewL( *this ); |
|
181 |
|
182 // Map TVPbkFieldTypeSelector to resource id |
|
183 iResourceId = AddressSelectResourceId( iCommMethod ); |
|
184 if ( iResourceId == KErrNotFound ) |
|
185 { |
|
186 User::LeaveIfError( KErrArgument ); |
|
187 } |
|
188 |
|
189 // Create xSP contacts manager |
|
190 CPbk2ServerAppAppUi& appUi = |
|
191 static_cast<CPbk2ServerAppAppUi&>(*CEikonEnv::Static()->EikAppUi()); |
|
192 |
|
193 ixSPManager = CVPbkxSPContacts::NewL( |
|
194 appUi.ApplicationServices().ContactManager() ); |
|
195 |
|
196 // Create contact presence manager if chat fields should be shown |
|
197 if ( ( iCommMethod == |
|
198 VPbkFieldTypeSelectorFactory::EInstantMessagingSelector ) || |
|
199 ( iCommMethod == |
|
200 VPbkFieldTypeSelectorFactory::EVOIPCallSelector ) ) |
|
201 |
|
202 { |
|
203 iContactPresence = TContactPresenceFactory::NewContactPresenceL( |
|
204 *this ); |
|
205 // ...and start presence icons retrieving |
|
206 HBufC8* packedLink = iContactLink->PackLC(); |
|
207 TInt opId = iContactPresence->GetPresenceInfoL( *packedLink ); |
|
208 CleanupStack::PopAndDestroy( packedLink ); |
|
209 } |
|
210 else |
|
211 { |
|
212 iPresenceIconsRetrieved = ETrue; |
|
213 } |
|
214 } |
|
215 |
|
216 // -------------------------------------------------------------------------- |
|
217 // CPbk2CommAddressSelectPhase::NewL |
|
218 // -------------------------------------------------------------------------- |
|
219 // |
|
220 CPbk2CommAddressSelectPhase* CPbk2CommAddressSelectPhase::NewL |
|
221 ( MPbk2ServicePhaseObserver& aObserver, |
|
222 const MVPbkContactLink& aContactLink, |
|
223 RVPbkContactFieldDefaultPriorities& aPriorities, |
|
224 CVPbkFieldTypeSelector& aFieldTypeSelector, |
|
225 VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector |
|
226 aCommSelector, |
|
227 TBool aRskBack ) |
|
228 { |
|
229 CPbk2CommAddressSelectPhase* self = new ( ELeave ) |
|
230 CPbk2CommAddressSelectPhase( aObserver, aPriorities, aRskBack, |
|
231 aFieldTypeSelector, aCommSelector ); |
|
232 CleanupStack::PushL( self ); |
|
233 self->ConstructL( aContactLink ); |
|
234 CleanupStack::Pop( self ); |
|
235 return self; |
|
236 } |
|
237 |
|
238 // -------------------------------------------------------------------------- |
|
239 // CPbk2CommAddressSelectPhase::LaunchServicePhaseL |
|
240 // -------------------------------------------------------------------------- |
|
241 // |
|
242 void CPbk2CommAddressSelectPhase::LaunchServicePhaseL() |
|
243 { |
|
244 // Start by retrieving first contact |
|
245 iState = EMainContactRetrieving; |
|
246 RetrieveContactL(); |
|
247 } |
|
248 |
|
249 // -------------------------------------------------------------------------- |
|
250 // CPbk2CommAddressSelectPhase::CancelServicePhase |
|
251 // -------------------------------------------------------------------------- |
|
252 // |
|
253 void CPbk2CommAddressSelectPhase::CancelServicePhase() |
|
254 { |
|
255 if ( iAddressSelectEliminator != NULL ) |
|
256 { |
|
257 iAddressSelectEliminator->ForceExit(); |
|
258 } |
|
259 |
|
260 delete iRetrieveOperation; |
|
261 iRetrieveOperation = NULL; |
|
262 |
|
263 iObserver.PhaseCanceled( *this ); |
|
264 } |
|
265 |
|
266 // -------------------------------------------------------------------------- |
|
267 // CPbk2CommAddressSelectPhase::RequestCancelL |
|
268 // -------------------------------------------------------------------------- |
|
269 // |
|
270 void CPbk2CommAddressSelectPhase::RequestCancelL( TInt aExitCommandId ) |
|
271 { |
|
272 if ( iAddressSelectEliminator != NULL ) |
|
273 { |
|
274 iAddressSelectEliminator->RequestExitL( aExitCommandId ); |
|
275 } |
|
276 |
|
277 // Withdraw our key event agent so that it does not react to |
|
278 // app shutter's escape key event simulation |
|
279 delete iDealer; |
|
280 iDealer = NULL; |
|
281 |
|
282 if ( aExitCommandId == EEikBidCancel ) |
|
283 { |
|
284 iObserver.PhaseAborted( *this ); |
|
285 } |
|
286 else |
|
287 { |
|
288 iObserver.PhaseCanceled( *this ); |
|
289 } |
|
290 } |
|
291 |
|
292 // -------------------------------------------------------------------------- |
|
293 // CPbk2CommAddressSelectPhase::AcceptDelayed |
|
294 // -------------------------------------------------------------------------- |
|
295 // |
|
296 void CPbk2CommAddressSelectPhase::AcceptDelayedL |
|
297 ( const TDesC8& /*aContactLinkBuffer*/ ) |
|
298 { |
|
299 // Nothing to accept |
|
300 } |
|
301 |
|
302 // -------------------------------------------------------------------------- |
|
303 // CPbk2CommAddressSelectPhase::Results |
|
304 // -------------------------------------------------------------------------- |
|
305 // |
|
306 MVPbkContactLinkArray* CPbk2CommAddressSelectPhase::Results() const |
|
307 { |
|
308 return iResults; |
|
309 } |
|
310 |
|
311 // -------------------------------------------------------------------------- |
|
312 // CPbk2CommAddressSelectPhase::ExtraResultData |
|
313 // -------------------------------------------------------------------------- |
|
314 // |
|
315 TInt CPbk2CommAddressSelectPhase::ExtraResultData() const |
|
316 { |
|
317 return KErrNotSupported; |
|
318 } |
|
319 |
|
320 // -------------------------------------------------------------------------- |
|
321 // CPbk2CommAddressSelectPhase::TakeStoreContact |
|
322 // -------------------------------------------------------------------------- |
|
323 // |
|
324 MVPbkStoreContact* CPbk2CommAddressSelectPhase::TakeStoreContact() |
|
325 { |
|
326 MVPbkStoreContact* contact = iStoreContact; |
|
327 iStoreContact = NULL; |
|
328 return contact; |
|
329 } |
|
330 |
|
331 // -------------------------------------------------------------------------- |
|
332 // CPbk2CommAddressSelectPhase::FieldContent |
|
333 // -------------------------------------------------------------------------- |
|
334 // |
|
335 HBufC* CPbk2CommAddressSelectPhase::FieldContent() const |
|
336 { |
|
337 return iFieldContent; |
|
338 } |
|
339 |
|
340 // -------------------------------------------------------------------------- |
|
341 // CPbk2CommAddressSelectPhase::VPbkSingleContactOperationComplete |
|
342 // -------------------------------------------------------------------------- |
|
343 // |
|
344 void CPbk2CommAddressSelectPhase::VPbkSingleContactOperationComplete |
|
345 ( MVPbkContactOperationBase& /*aOperation*/, |
|
346 MVPbkStoreContact* aContact ) |
|
347 { |
|
348 if ( iState == EMainContactRetrieving ) |
|
349 { |
|
350 // Contact retrieval complete, take contact ownership |
|
351 delete iStoreContact; |
|
352 iStoreContact = aContact; |
|
353 |
|
354 // Start fetching xSP contact links |
|
355 iState = ExSPLinksRetrieving; |
|
356 |
|
357 TRAPD( err, |
|
358 ixSPContactOperation = ixSPManager->GetxSPContactLinksL( |
|
359 *iStoreContact, *this, *this ); |
|
360 ); |
|
361 |
|
362 if ( err != KErrNone ) |
|
363 { |
|
364 // Run the address select dialog for the main contact at least |
|
365 TRAPD( err, DoSelectAddressesL() ); |
|
366 if ( err != KErrNone ) |
|
367 { |
|
368 iObserver.PhaseError( *this, err ); |
|
369 } |
|
370 iState = EDialogWaitsUserInput; |
|
371 } |
|
372 } |
|
373 |
|
374 if ( iState == ExSPContactsRetrieving ) |
|
375 { |
|
376 // xSP contact retrieval complete |
|
377 TInt err = ixSPStoreContactsArray.Append( aContact ); |
|
378 |
|
379 // If error, stop retrieving xSP contacts and show address select |
|
380 // dialog. |
|
381 |
|
382 // Start retrieving next xSP contact, if there are some contacts left |
|
383 if ( ixSPContactsArray->Count() != 0 && err == KErrNone ) |
|
384 { |
|
385 TRAP( err, RetrieveContactL(); ); |
|
386 if ( err != KErrNone ) |
|
387 { |
|
388 iState = EDialogWaitsUserInput; |
|
389 } |
|
390 } |
|
391 else |
|
392 { |
|
393 FilterXspContactsL(); |
|
394 // Run the address select, if no more contacts to retrieve |
|
395 TRAP( err, DoSelectAddressesL() ); |
|
396 if ( err != KErrNone ) |
|
397 { |
|
398 iObserver.PhaseError( *this, err ); |
|
399 } |
|
400 } |
|
401 } |
|
402 } |
|
403 |
|
404 // -------------------------------------------------------------------------- |
|
405 // CPbk2CommAddressSelectPhase::VPbkSingleContactOperationFailed |
|
406 // -------------------------------------------------------------------------- |
|
407 // |
|
408 void CPbk2CommAddressSelectPhase::VPbkSingleContactOperationFailed |
|
409 ( MVPbkContactOperationBase& /*aOperation*/, TInt aError ) |
|
410 { |
|
411 iObserver.PhaseError( *this, aError ); |
|
412 } |
|
413 |
|
414 // -------------------------------------------------------------------------- |
|
415 // CPbk2CommAddressSelectPhase::Pbk2ProcessKeyEventL |
|
416 // -------------------------------------------------------------------------- |
|
417 // |
|
418 TBool CPbk2CommAddressSelectPhase::Pbk2ProcessKeyEventL |
|
419 ( const TKeyEvent& aKeyEvent, TEventCode aType ) |
|
420 { |
|
421 TBool ret = EFalse; |
|
422 |
|
423 if ( aType == EEventKey && aKeyEvent.iCode == EKeyEscape ) |
|
424 { |
|
425 iObserver.PhaseOkToExit( *this, EEikBidCancel ); |
|
426 ret = ETrue; |
|
427 } |
|
428 |
|
429 return ret; |
|
430 } |
|
431 |
|
432 // -------------------------------------------------------------------------- |
|
433 // CPbk2CommAddressSelectPhase::VPbkOperationFailed |
|
434 // -------------------------------------------------------------------------- |
|
435 // |
|
436 void CPbk2CommAddressSelectPhase::VPbkOperationFailed( |
|
437 MVPbkContactOperationBase* /*aOperation*/, TInt /*aError*/ ) |
|
438 { |
|
439 // Ignore an error, xSP info can be omitted. Just run address select dialog |
|
440 TRAPD( err, DoSelectAddressesL() ); |
|
441 if ( err != KErrNone ) |
|
442 { |
|
443 iObserver.PhaseError( *this, err ); |
|
444 } |
|
445 |
|
446 iState = EDialogWaitsUserInput; |
|
447 } |
|
448 // -------------------------------------------------------------------------- |
|
449 // CPbk2CommAddressSelectPhase::VPbkOperationResultCompleted |
|
450 // -------------------------------------------------------------------------- |
|
451 // |
|
452 void CPbk2CommAddressSelectPhase::VPbkOperationResultCompleted( |
|
453 MVPbkContactOperationBase* /*aOperation*/, |
|
454 MVPbkContactLinkArray* aArray ) |
|
455 { |
|
456 if ( aArray == NULL || aArray->Count() == 0 ) |
|
457 { |
|
458 // No xSP contacts, run address select dialog |
|
459 TRAPD( err, DoSelectAddressesL() ); |
|
460 if ( err != KErrNone ) |
|
461 { |
|
462 iObserver.PhaseError( *this, err ); |
|
463 } |
|
464 } |
|
465 else |
|
466 { |
|
467 TRAPD( err, |
|
468 // Take a own copy of supplied contact links |
|
469 ixSPContactsArray = CVPbkContactLinkArray::NewL(); |
|
470 CopyContactLinksL( *aArray, *ixSPContactsArray ); |
|
471 |
|
472 // Start fetching xSP contacts |
|
473 iState = ExSPContactsRetrieving; |
|
474 RetrieveContactL(); |
|
475 ); |
|
476 |
|
477 // If error happened, show address select dialog |
|
478 if ( err != KErrNone ) |
|
479 { |
|
480 TRAP( err, DoSelectAddressesL() ); |
|
481 if ( err != KErrNone ) |
|
482 { |
|
483 iObserver.PhaseError( *this, err ); |
|
484 } |
|
485 } |
|
486 |
|
487 ixSPStoreContactsArray.ResetAndDestroy(); |
|
488 } |
|
489 } |
|
490 |
|
491 // -------------------------------------------------------------------------- |
|
492 // CPbk2CommAddressSelectPhase::ReceiveIconInfoL |
|
493 // -------------------------------------------------------------------------- |
|
494 // |
|
495 void CPbk2CommAddressSelectPhase::ReceiveIconInfoL( |
|
496 const TDesC8& /*aPackedLink*/, |
|
497 const TDesC8& /*aBrandId*/, |
|
498 const TDesC8& /*aElementId*/ ) |
|
499 { |
|
500 // nothing to do |
|
501 } |
|
502 |
|
503 // -------------------------------------------------------------------------- |
|
504 // CPbk2CommAddressSelectPhase::ReceiveIconFileL |
|
505 // -------------------------------------------------------------------------- |
|
506 // |
|
507 void CPbk2CommAddressSelectPhase::ReceiveIconFileL( |
|
508 const TDesC8& aBrandId, |
|
509 const TDesC8& aElementId, |
|
510 CFbsBitmap* aBrandedBitmap, |
|
511 CFbsBitmap* aMask ) |
|
512 { |
|
513 if ( iPresenceIconsRetrieved ) |
|
514 { |
|
515 // icons retrieving failed before, no need to take care about |
|
516 // presence icons anymore |
|
517 return; |
|
518 } |
|
519 |
|
520 // icon file received, save it to icon info array |
|
521 TInt count = iPresenceIconArray.Count(); |
|
522 for ( TInt i = 0; i < count; i++ ) |
|
523 { |
|
524 if ( iPresenceIconArray[i]->BrandId().CompareF( aBrandId ) == 0 && |
|
525 iPresenceIconArray[i]->ElementId().CompareF( aElementId ) == 0 ) |
|
526 { |
|
527 if ( !iPresenceIconArray[i]->IconBitmap() ) |
|
528 { |
|
529 iPresenceIconArray[i]->SetBitmap( aBrandedBitmap, aMask ); |
|
530 break; |
|
531 } |
|
532 } |
|
533 } |
|
534 |
|
535 // check if all icon files received |
|
536 iPresenceIconsRetrieved = ETrue; |
|
537 for ( TInt j = 0; j < count && iPresenceIconsRetrieved; j++ ) |
|
538 { |
|
539 if ( iPresenceIconArray[j]->IconBitmap() == NULL || |
|
540 iPresenceIconArray[j]->IconBitmapMask() == NULL ) |
|
541 { |
|
542 iPresenceIconsRetrieved = EFalse; |
|
543 } |
|
544 } |
|
545 |
|
546 // start address fetch dialog, if it waits for presence icons |
|
547 if ( iPresenceIconsRetrieved && iState == EWaitForPresenceIcons ) |
|
548 { |
|
549 TRAPD( err, DoSelectAddressesL() ); |
|
550 if ( err != KErrNone ) |
|
551 { |
|
552 iObserver.PhaseError( *this, err ); |
|
553 } |
|
554 } |
|
555 } |
|
556 |
|
557 // -------------------------------------------------------------------------- |
|
558 // CPbk2CommAddressSelectPhase::PresenceSubscribeError |
|
559 // -------------------------------------------------------------------------- |
|
560 // |
|
561 void CPbk2CommAddressSelectPhase::PresenceSubscribeError( |
|
562 const TDesC8& /*aPackedLink*/, |
|
563 TInt /*aStatus*/ ) |
|
564 { |
|
565 // nothing to do |
|
566 } |
|
567 |
|
568 // -------------------------------------------------------------------------- |
|
569 // CPbk2CommAddressSelectPhase::ErrorOccured |
|
570 // -------------------------------------------------------------------------- |
|
571 // |
|
572 void CPbk2CommAddressSelectPhase::ErrorOccured( |
|
573 TInt /*aOpId*/, |
|
574 TInt /*aStatus*/ ) |
|
575 { |
|
576 // Incase of several errors from contact precense avoid |
|
577 // multiple launching of the select dialog |
|
578 // TODO: How should the errors be hanlded? |
|
579 if (!iPresenceIconsRetrieved) |
|
580 { |
|
581 // Error occured, destroy presence icon array |
|
582 iPresenceIconsRetrieved = ETrue; |
|
583 iPresenceIconArray.ResetAndDestroy(); |
|
584 |
|
585 // start address fetch dialog, if it waits for presence icons |
|
586 TRAPD( err, DoSelectAddressesL() ); |
|
587 if ( err != KErrNone ) |
|
588 { |
|
589 iObserver.PhaseError( *this, err ); |
|
590 } |
|
591 } |
|
592 } |
|
593 |
|
594 // -------------------------------------------------------------------------- |
|
595 // CPbk2CommAddressSelectPhase::ReceiveIconInfosL |
|
596 // -------------------------------------------------------------------------- |
|
597 // |
|
598 void CPbk2CommAddressSelectPhase::ReceiveIconInfosL( |
|
599 const TDesC8& /*aPackedLink*/, |
|
600 RPointerArray <MContactPresenceInfo>& aInfoArray, |
|
601 TInt /*aOpId*/ ) |
|
602 { |
|
603 // service specific icons received |
|
604 TInt count = aInfoArray.Count(); |
|
605 |
|
606 // calculate and set preferred icon size |
|
607 TRect mainPane; |
|
608 AknLayoutUtils::LayoutMetricsRect( |
|
609 AknLayoutUtils::EMainPane, mainPane ); |
|
610 TAknLayoutRect listLayoutRect; |
|
611 listLayoutRect.LayoutRect( |
|
612 mainPane, |
|
613 AknLayoutScalable_Avkon::list_single_graphic_pane_g1(0).LayoutLine() ); |
|
614 TSize size(listLayoutRect.Rect().Size()); |
|
615 iContactPresence->SetPresenceIconSize( size ); |
|
616 |
|
617 for ( TInt i = 0; i < count; i++ ) |
|
618 { |
|
619 if ( aInfoArray[i]->BrandId().Length() > 0 && |
|
620 aInfoArray[i]->ElementId().Length() > 0 && |
|
621 aInfoArray[i]->ServiceName().Length() > 0 ) |
|
622 { |
|
623 TInt serviceSeparatorPos = aInfoArray[i]->ServiceName(). |
|
624 FindF( KServiceNameSeparator ); |
|
625 if ( serviceSeparatorPos > 0 ) |
|
626 { |
|
627 TInt nameIdLength = aInfoArray[i]->ServiceName().Length() - |
|
628 serviceSeparatorPos - 1; |
|
629 // save icon info to our own array |
|
630 CPbk2PresenceIconInfo* iconInfo = CPbk2PresenceIconInfo::NewL( |
|
631 aInfoArray[i]->BrandId(), |
|
632 aInfoArray[i]->ElementId(), |
|
633 aInfoArray[i]->ServiceName().Right( nameIdLength ) ); |
|
634 |
|
635 CleanupStack::PushL( iconInfo ); |
|
636 iPresenceIconArray.AppendL( iconInfo ); // ownership is taken |
|
637 CleanupStack::Pop( iconInfo ); |
|
638 |
|
639 // start retrieving icon file |
|
640 TInt opId = iContactPresence->GetPresenceIconFileL( |
|
641 aInfoArray[i]->BrandId(), aInfoArray[i]->ElementId() ); |
|
642 } |
|
643 } |
|
644 } |
|
645 if ( iPresenceIconArray.Count() == 0 ) |
|
646 { |
|
647 iPresenceIconsRetrieved = ETrue; |
|
648 } |
|
649 if ( iPresenceIconsRetrieved && iState == EWaitForPresenceIcons ) |
|
650 { |
|
651 TRAPD( err, DoSelectAddressesL() ); |
|
652 if ( err != KErrNone ) |
|
653 { |
|
654 iObserver.PhaseError( *this, err ); |
|
655 } |
|
656 } |
|
657 } |
|
658 // -------------------------------------------------------------------------- |
|
659 // CPbk2AddressSelectPhase::StoreReady |
|
660 // -------------------------------------------------------------------------- |
|
661 // |
|
662 void CPbk2CommAddressSelectPhase::StoreReady( |
|
663 MVPbkContactStore& /*aContactStore*/ ) |
|
664 { |
|
665 // not interested |
|
666 } |
|
667 |
|
668 // -------------------------------------------------------------------------- |
|
669 // CPbk2AddressSelectPhase::StoreUnavailable |
|
670 // -------------------------------------------------------------------------- |
|
671 // |
|
672 void CPbk2CommAddressSelectPhase::StoreUnavailable( |
|
673 MVPbkContactStore& /*aContactStore*/, |
|
674 TInt /*aReason*/ ) |
|
675 { |
|
676 // not interested |
|
677 } |
|
678 |
|
679 // -------------------------------------------------------------------------- |
|
680 // CPbk2AttributeAddressSelectPhase::StoreUnavailable |
|
681 // -------------------------------------------------------------------------- |
|
682 // |
|
683 void CPbk2CommAddressSelectPhase::HandleStoreEventL( |
|
684 MVPbkContactStore& /*aContactStore*/, |
|
685 TVPbkContactStoreEvent aEvent ) |
|
686 { |
|
687 if ( aEvent.iContactLink != NULL && iStoreContact != NULL ) |
|
688 { |
|
689 if ( aEvent.iContactLink->RefersTo( *iStoreContact ) ) |
|
690 { |
|
691 CancelServicePhase(); |
|
692 } |
|
693 } |
|
694 } |
|
695 |
|
696 // -------------------------------------------------------------------------- |
|
697 // CPbk2CommAddressSelectPhase::RetrieveContactL |
|
698 // -------------------------------------------------------------------------- |
|
699 // |
|
700 void CPbk2CommAddressSelectPhase::RetrieveContactL() |
|
701 { |
|
702 CPbk2ServerAppAppUi& appUi = |
|
703 static_cast<CPbk2ServerAppAppUi&> |
|
704 ( *iEikenv->EikAppUi() ); |
|
705 |
|
706 // Fetch one contact at a time if service cancellation is not |
|
707 // commanded. |
|
708 delete iRetrieveOperation; |
|
709 iRetrieveOperation = NULL; |
|
710 |
|
711 if ( iState == EMainContactRetrieving ) |
|
712 { |
|
713 iRetrieveOperation = appUi.ApplicationServices().ContactManager(). |
|
714 RetrieveContactL( *iContactLink, *this ); |
|
715 } |
|
716 else if ( iState == ExSPContactsRetrieving ) |
|
717 { |
|
718 iRetrieveOperation = appUi.ApplicationServices().ContactManager(). |
|
719 RetrieveContactL( ixSPContactsArray->At( 0 ), *this ); |
|
720 ixSPContactsArray->Delete( 0 ); |
|
721 } |
|
722 } |
|
723 |
|
724 // -------------------------------------------------------------------------- |
|
725 // CPbk2CommAddressSelectPhase::DoSelectAddressesL |
|
726 // -------------------------------------------------------------------------- |
|
727 // |
|
728 void CPbk2CommAddressSelectPhase::DoSelectAddressesL() |
|
729 { |
|
730 |
|
731 if ( !iStoreContact ) |
|
732 { |
|
733 return; |
|
734 } |
|
735 |
|
736 if ( !iPresenceIconsRetrieved ) |
|
737 { |
|
738 // wait for presence icons |
|
739 iState = EWaitForPresenceIcons; |
|
740 return; |
|
741 } |
|
742 |
|
743 TResourceReader reader; |
|
744 CCoeEnv::Static()->CreateResourceReaderLC( reader, iResourceId ); |
|
745 |
|
746 CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&> |
|
747 ( *iEikenv->EikAppUi() ); |
|
748 |
|
749 TPbk2AddressSelectParams params |
|
750 ( *iStoreContact, appUi.ApplicationServices().ContactManager(), |
|
751 appUi.ApplicationServices().NameFormatter(), |
|
752 appUi.ApplicationServices().FieldProperties(), |
|
753 reader, iTitleResId ); |
|
754 |
|
755 params.iCommMethod = iCommMethod; |
|
756 |
|
757 // If default priorities are set use defaults directly. |
|
758 params.SetDefaultPriorities( iPriorities ); |
|
759 |
|
760 // Launch call directly using default values. |
|
761 params.SetUseDefaultDirectly( ETrue ); |
|
762 |
|
763 CPbk2AddressSelect* addressSelect = CPbk2AddressSelect::NewL( |
|
764 params, iFieldTypeSelector, &ixSPStoreContactsArray.Array(), |
|
765 &iPresenceIconArray.Array() ); |
|
766 |
|
767 // Correct CBA buttons |
|
768 TInt correctedCba = CorrectRSK( iResourceId ); |
|
769 if ( correctedCba > KErrNone ) |
|
770 { |
|
771 addressSelect->SetCba( correctedCba ); |
|
772 } |
|
773 |
|
774 // Execute |
|
775 iAddressSelectEliminator = addressSelect; |
|
776 iAddressSelectEliminator->ResetWhenDestroyed |
|
777 ( &iAddressSelectEliminator ); |
|
778 |
|
779 appUi.StoreManager().RegisterStoreEventsL( *this ); |
|
780 MVPbkStoreContactField* resultField = addressSelect->ExecuteLD(); |
|
781 appUi.StoreManager().DeregisterStoreEvents( *this ); |
|
782 |
|
783 CleanupStack::PopAndDestroy(); // reader |
|
784 |
|
785 if ( resultField ) |
|
786 { |
|
787 CleanupDeletePushL(resultField); |
|
788 |
|
789 // Save field content |
|
790 MVPbkContactFieldData& fieldData = resultField->FieldData(); |
|
791 TVPbkFieldStorageType type = fieldData.DataType(); |
|
792 if ( type == EVPbkFieldStorageTypeText ) |
|
793 { |
|
794 MVPbkContactFieldTextData& textData = |
|
795 MVPbkContactFieldTextData::Cast( fieldData ); |
|
796 TPtrC ptr = textData.Text(); |
|
797 delete iFieldContent; |
|
798 iFieldContent = NULL; |
|
799 iFieldContent = HBufC::NewL( ptr.Length() ); |
|
800 iFieldContent->Des().Copy( ptr ); |
|
801 } |
|
802 else if ( type == EVPbkFieldStorageTypeUri ) |
|
803 { |
|
804 MVPbkContactFieldUriData& textData = |
|
805 MVPbkContactFieldUriData::Cast( fieldData ); |
|
806 TPtrC ptr = textData.Uri(); |
|
807 delete iFieldContent; |
|
808 iFieldContent = NULL; |
|
809 iFieldContent = HBufC::NewL( ptr.Length() ); |
|
810 iFieldContent->Des().Copy( ptr ); |
|
811 } |
|
812 |
|
813 // Append field to the result array |
|
814 AppendResultL( resultField ); |
|
815 CleanupStack::PopAndDestroy(); // resultField |
|
816 iObserver.NextPhase( *this ); |
|
817 } |
|
818 else |
|
819 { |
|
820 // Normal cancellation and there is no results |
|
821 // to be sent to caller |
|
822 iObserver.PhaseCanceled( *this ); |
|
823 } |
|
824 } |
|
825 |
|
826 // -------------------------------------------------------------------------- |
|
827 // CPbk2CommAddressSelectPhase::CorrectRSK |
|
828 // -------------------------------------------------------------------------- |
|
829 // |
|
830 inline TInt CPbk2CommAddressSelectPhase::CorrectRSK |
|
831 ( TInt aAddressSelectResourceId ) |
|
832 { |
|
833 TInt result = KErrNone; |
|
834 |
|
835 if ( iRskBack ) |
|
836 { |
|
837 switch ( aAddressSelectResourceId ) |
|
838 { |
|
839 case R_PBK2_GENERIC_ADDRESS_SELECT: |
|
840 case R_PBK2_PHONE_NUMBER_SELECT: |
|
841 case R_PBK2_VIDEO_NUMBER_SELECT: |
|
842 case R_PBK2_EMAIL_ADDRESS_SELECT: |
|
843 case R_PBK2_EMAIL_OVER_SMS_ADDRESS_SELECT: |
|
844 case R_PBK2_MMS_ADDRESS_SELECT: |
|
845 case R_PBK2_POC_ADDRESS_SELECT: |
|
846 case R_PBK2_VOIP_ADDRESS_SELECT: |
|
847 case R_PBK2_DTMF_PHONE_NUMBER_SELECT: |
|
848 case R_PBK2_THUMBNAIL_SELECT: |
|
849 case R_PBK2_CALL_ITEM_NUMBER_SELECT: |
|
850 { |
|
851 result = R_AVKON_SOFTKEYS_SELECT_BACK__SELECT; |
|
852 break; |
|
853 } |
|
854 |
|
855 default: |
|
856 { |
|
857 // Do nothing |
|
858 break; |
|
859 } |
|
860 } |
|
861 } |
|
862 |
|
863 return result; |
|
864 } |
|
865 |
|
866 // -------------------------------------------------------------------------- |
|
867 // CPbk2CommAddressSelectPhase::AppendResultL |
|
868 // -------------------------------------------------------------------------- |
|
869 // |
|
870 void CPbk2CommAddressSelectPhase::AppendResultL |
|
871 ( const MVPbkStoreContactField* aField ) |
|
872 { |
|
873 if ( aField ) |
|
874 { |
|
875 // Add the contact link to the result array |
|
876 MVPbkContactLink* link = aField->CreateLinkLC(); |
|
877 if ( link ) |
|
878 { |
|
879 if ( !iResults ) |
|
880 { |
|
881 iResults = CVPbkContactLinkArray::NewL(); |
|
882 } |
|
883 |
|
884 CleanupStack::Pop(); // aField->CreateLinkLC() |
|
885 |
|
886 iResults->AppendL( link ); |
|
887 } |
|
888 } |
|
889 } |
|
890 |
|
891 // -------------------------------------------------------------------------- |
|
892 // CPbk2CommAddressSelectPhase::GetImppFieldDataL |
|
893 // -------------------------------------------------------------------------- |
|
894 // |
|
895 void CPbk2CommAddressSelectPhase::GetImppFieldDataL( CDesC16ArrayFlat& aXspIdArray, MVPbkStoreContact& aContact ) |
|
896 { |
|
897 CPbk2ServerAppAppUi& appUi = static_cast<CPbk2ServerAppAppUi&> |
|
898 ( *iEikenv->EikAppUi() ); |
|
899 |
|
900 const MVPbkFieldType* type = appUi.ApplicationServices().ContactManager(). |
|
901 FieldTypes().Find( R_VPBK_FIELD_TYPE_IMPP ); |
|
902 |
|
903 CVPbkBaseContactFieldTypeIterator* itr = |
|
904 CVPbkBaseContactFieldTypeIterator::NewLC( *type, |
|
905 aContact.Fields() ); |
|
906 |
|
907 while ( itr->HasNext() ) |
|
908 { |
|
909 const MVPbkBaseContactField* field = itr->Next(); |
|
910 const MVPbkContactFieldUriData& uri = |
|
911 MVPbkContactFieldUriData::Cast(field->FieldData() ); |
|
912 HBufC* data = uri.Uri().AllocL(); |
|
913 CleanupStack::PushL(data); |
|
914 aXspIdArray.AppendL( data->Des() ); |
|
915 CleanupStack::PopAndDestroy(data); //data |
|
916 } |
|
917 CleanupStack::PopAndDestroy(itr); //itr |
|
918 } |
|
919 |
|
920 // -------------------------------------------------------------------------- |
|
921 // CPbk2CommAddressSelectPhase::FilterXspContactsL |
|
922 // -------------------------------------------------------------------------- |
|
923 // |
|
924 void CPbk2CommAddressSelectPhase::FilterXspContactsL() |
|
925 { |
|
926 TInt xspContactCount = ixSPStoreContactsArray.Count(); |
|
927 |
|
928 if ( xspContactCount > 0 ) |
|
929 { |
|
930 for ( TInt i = xspContactCount - 1; i >= 0; --i ) |
|
931 { |
|
932 MVPbkStoreContact* contact = ixSPStoreContactsArray[i]; |
|
933 if ( !IsMatchL( *contact, *iStoreContact ) ) |
|
934 { |
|
935 ixSPStoreContactsArray.Remove(i); |
|
936 delete contact; |
|
937 } |
|
938 } |
|
939 } |
|
940 } |
|
941 |
|
942 // -------------------------------------------------------------------------- |
|
943 // CPbk2CommAddressSelectPhase::IsMatchL |
|
944 // -------------------------------------------------------------------------- |
|
945 // |
|
946 TBool CPbk2CommAddressSelectPhase::IsMatchL( MVPbkStoreContact& aXspContact, MVPbkStoreContact& aStoreContact ) |
|
947 { |
|
948 TBool result = EFalse; |
|
949 |
|
950 CDesCArrayFlat* storeContactXspIdArray = new ( ELeave ) CDesCArrayFlat( KMaxXspServiceCount ); |
|
951 CleanupStack::PushL( storeContactXspIdArray ); |
|
952 GetImppFieldDataL( *storeContactXspIdArray, aStoreContact ); |
|
953 |
|
954 CDesCArrayFlat* xspContcatXspIdArray = new ( ELeave ) CDesCArrayFlat( KMaxXspServiceCount ); |
|
955 CleanupStack::PushL( xspContcatXspIdArray ); |
|
956 GetImppFieldDataL( *xspContcatXspIdArray, aXspContact ); |
|
957 |
|
958 for ( TInt i = 0; i < storeContactXspIdArray->MdcaCount(); i++ ) |
|
959 { |
|
960 TPtrC data = storeContactXspIdArray->MdcaPoint( i ); |
|
961 for ( TInt j = 0; j < xspContcatXspIdArray->MdcaCount(); j++ ) |
|
962 { |
|
963 TPtrC data1 = xspContcatXspIdArray->MdcaPoint( j ); |
|
964 if ( data1.CompareF( data ) == 0 ) |
|
965 { |
|
966 result = ETrue; |
|
967 break; |
|
968 } |
|
969 } |
|
970 } |
|
971 CleanupStack::PopAndDestroy(); // xspContcatXspIdArray |
|
972 CleanupStack::PopAndDestroy(); // storeContactXspIdArray |
|
973 |
|
974 return result; |
|
975 } |
|
976 // End of File |