--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/NamesListExtension/src/cpbk2mycard.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,457 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: .
+*
+*/
+
+// class header
+#include "cpbk2mycard.h"
+
+// Pbk2
+#include <MPbk2AppUi.h>
+#include <CPbk2ApplicationServices.h>
+#include "mpbk2mycardobserver.h"
+#include <MVPbkFieldType.h>
+#include <Pbk2InternalUID.h>
+#include "pbk2nameslistexiconid.hrh"
+#include "Pbk2NamesListExUID.h"
+
+// Virtual Phonebook
+#include <VPbkContactStoreUris.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStore2.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkStoreContact.h>
+
+// thumbnail loading
+#include <CPbk2ImageManager.h>
+#include <TPbk2ImageManagerParams.h>
+#include <VPbkEng.rsg>
+#include <fbs.h>
+#include <AknUtils.h>
+#include <aknlayoutscalable_apps.cdl.h>
+
+TSize CalculateThumbnailSize()
+ {
+ TAknWindowComponentLayout layout(
+ TAknWindowComponentLayout::Compose(
+ AknLayoutScalable_Apps::list_double_large_graphic_phob2_pane( 0 ),
+ AknLayoutScalable_Apps::list_double_large_graphic_phob2_pane_g1( 0 ) ) );
+
+ TRect mainPane;
+ AknLayoutUtils::LayoutMetricsRect(
+ AknLayoutUtils::EMainPane, mainPane );
+ TAknLayoutRect layoutRect;
+ layoutRect.LayoutRect(
+ mainPane,
+ layout.LayoutLine() );
+ return layoutRect.Rect().Size();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2MyCard* CPbk2MyCard::NewL( MVPbkContactStore& aPhoneStore )
+ {
+ CPbk2MyCard* self = new (ELeave) CPbk2MyCard( aPhoneStore );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::ConstructL()
+ {
+ // first get application services and contact manager
+ iAppServices = CPbk2ApplicationServices::InstanceL();
+ iContactManager = &iAppServices->ContactManager();
+
+ // create image manager for fetching the thumbnail
+ iImageManager = CPbk2ImageManager::NewL( *iContactManager );
+ iPhoneStore->OpenL(*this);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::CPbk2MyCard
+// --------------------------------------------------------------------------
+//
+CPbk2MyCard::CPbk2MyCard( MVPbkContactStore& aPhoneStore )
+:iMyCardState( EUnkown ),
+ iPhoneStore( &aPhoneStore ),
+ iIconId( TUid::Uid( KPbk2ControlCmdItemExtensionUID ), 1 ),
+ iEmptyId( TUid::Uid( KPbk2NamesListExtPluginUID2 ),
+ EPbk2EceNoMyCardThumbnailIconId )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::~CPbk2MyCard
+// --------------------------------------------------------------------------
+//
+CPbk2MyCard::~CPbk2MyCard()
+ {
+
+
+ delete iThumbBitmap;
+ delete iMyCardStoreContact;
+ delete iImageManager;
+ delete iMyCardLink;
+ delete iOperation;
+ Release( iAppServices );
+ iObserverArray.Reset();
+ if(iPhoneStore)
+ {
+ iPhoneStore->Close(*this);
+ }
+
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::SetObserverL
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::SetObserverL(MPbk2MyCardObserver& aObserver)
+ {
+ iObserverArray.AppendL(&aObserver);
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::RemoveObserver
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::RemoveObserver(MPbk2MyCardObserver& aObserver)
+ {
+ const TInt index(iObserverArray.Find(&aObserver));
+ if(index >= 0)
+ {
+ iObserverArray.Remove(index);
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::NotifyObservers
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::NotifyObservers( MPbk2MyCardObserver::TMyCardStatusEvent aEvent )
+ {
+ const TInt count(iObserverArray.Count());
+ for(TInt i = 0 ; i < count ; ++i)
+ {
+ iObserverArray[i]->MyCardEvent( aEvent );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::MyCardLink
+// --------------------------------------------------------------------------
+//
+MVPbkContactLink* CPbk2MyCard::MyCardLink() const
+ {
+ return iMyCardLink;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::MyCardBitmap
+// --------------------------------------------------------------------------
+//
+CFbsBitmap* CPbk2MyCard::MyCardBitmap() const
+ {
+ // if fetched
+ if( iThumbBitmap )
+ {
+ // create duplicate bitmap
+ CFbsBitmap* dstbitmap = new (ELeave) CFbsBitmap;
+ CleanupStack::PushL( dstbitmap );
+
+ //Get the handle to source bitmap
+ TInt srchandle = iThumbBitmap->Handle();
+
+ //Duplicate the bitmap handle. Increases the RefCount of bitmap
+ //managed but Fbs Server
+ User::LeaveIfError( dstbitmap->Duplicate( srchandle ) );
+ CleanupStack::Pop( dstbitmap );
+ return dstbitmap;
+ }
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::MyCardIconId
+// --------------------------------------------------------------------------
+//
+const TPbk2IconId& CPbk2MyCard::MyCardIconId() const
+ {
+ // if my card thumbnail exists
+ if( iThumbBitmap )
+ {
+ return iIconId;
+ }
+ return iEmptyId;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::MyCardStoreContact
+// --------------------------------------------------------------------------
+//
+MVPbkStoreContact* CPbk2MyCard::MyCardStoreContact() const
+ {
+ return iMyCardStoreContact;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::VPbkSingleContactLinkOperationComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::VPbkSingleContactLinkOperationComplete(
+ MVPbkContactOperationBase& /*aOperation*/,
+ MVPbkContactLink* aLink )
+ {
+ // iOperation still owns the contact link until this method returns.
+ // we can't delete iOperation here
+ delete iMyCardLink;
+ iMyCardLink = aLink;
+ iMyCardState = EExisting;
+
+ NotifyObservers( MPbk2MyCardObserver::EStateStatusResolved );
+
+ // fetch store contact
+ iRetrieveOperation = iContactManager->RetrieveContactL( *iMyCardLink, *this );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::VPbkSingleContactLinkOperationFailed
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::VPbkSingleContactLinkOperationFailed(
+ MVPbkContactOperationBase& /*aOperation*/,
+ TInt /*aError*/ )
+ {
+ delete iOperation;
+ iOperation = NULL;
+ delete iMyCardLink;
+ iMyCardLink = NULL;
+ iMyCardState = ENonExisting;
+
+ NotifyObservers( MPbk2MyCardObserver::EStateStatusResolved );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPbk2MyCard::VPbkSingleContactOperationComplete
+// ---------------------------------------------------------------------------
+//
+void CPbk2MyCard::VPbkSingleContactOperationComplete(
+ MVPbkContactOperationBase& /*aOperation*/,
+ MVPbkStoreContact* aContact )
+ {
+ delete iRetrieveOperation;
+ iRetrieveOperation = NULL;
+
+ delete iMyCardStoreContact;
+ iMyCardStoreContact = aContact;
+
+ // load thumbnail
+ LoadThumbnailL( *iMyCardStoreContact );
+ }
+
+// ---------------------------------------------------------------------------
+// CPbk2MyCard::VPbkSingleContactOperationFailed
+// ---------------------------------------------------------------------------
+//
+void CPbk2MyCard::VPbkSingleContactOperationFailed(
+ MVPbkContactOperationBase& /*aOperation*/,
+ TInt /*aError*/ )
+ {
+ // cannot fetch store contact
+ delete iRetrieveOperation;
+ iRetrieveOperation = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CPbk2MyCard::Pbk2ImageGetComplete
+// ---------------------------------------------------------------------------
+//
+void CPbk2MyCard::Pbk2ImageGetComplete(
+ MPbk2ImageOperation& /*aOperation*/,
+ CFbsBitmap* aBitmap )
+ {
+ delete iImageOperation;
+ iImageOperation = NULL;
+ //delete existing
+ delete iThumbBitmap;
+ iThumbBitmap = aBitmap;
+
+ // inform observers
+ NotifyObservers( MPbk2MyCardObserver::EStateThumbnailLoaded );
+ }
+
+// ---------------------------------------------------------------------------
+// CPbk2MyCard::Pbk2ImageGetFailed
+// ---------------------------------------------------------------------------
+//
+void CPbk2MyCard::Pbk2ImageGetFailed(
+ MPbk2ImageOperation& /*aOperation*/,
+ TInt /*aError*/ )
+ {
+ // image fetching failed
+ delete iImageOperation;
+ iImageOperation = NULL;
+ // inform observers
+ NotifyObservers( MPbk2MyCardObserver::EStateThumbnailNotFound );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::LoadThumbnailL
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::LoadThumbnailL( MVPbkBaseContact& aContact )
+ {
+ // cancel previous operations
+ delete iImageOperation;
+ iImageOperation = NULL;
+
+ const MVPbkFieldType* thumbType = iContactManager->FieldTypes().Find(
+ R_VPBK_FIELD_TYPE_THUMBNAILPIC );
+ // if there's picture field
+ if( thumbType )
+ {
+ if( iImageManager->HasImage( aContact, *thumbType ) )
+ {
+ TSize size( CalculateThumbnailSize() );
+
+ // Define parameters for thumbnail
+ TPbk2ImageManagerParams params;
+ TInt useCropping = 0x0008;
+ // set params
+ params.iSize = size;
+ params.iFlags = TPbk2ImageManagerParams::EScaleImage |
+ TPbk2ImageManagerParams::EKeepAspectRatio |
+ useCropping; //CROP IMAGE
+ // contact has image. load it.
+ iImageOperation = iImageManager->GetImageAsyncL(
+ ¶ms, aContact, *thumbType, *this );
+ }
+ // no image
+ else
+ {
+ // reset thumbnail
+ delete iThumbBitmap;
+ iThumbBitmap = NULL;
+ // inform observers
+ NotifyObservers( MPbk2MyCardObserver::EStateThumbnailNotFound );
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::StoreReady
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::StoreReady( MVPbkContactStore& aContactStore )
+ {
+ delete iOperation;
+ iOperation = NULL;
+
+ MVPbkContactStore2* phoneStoreExtension =
+ static_cast<MVPbkContactStore2*>(aContactStore.ContactStoreExtension(
+ KMVPbkContactStoreExtension2Uid));
+ if ( phoneStoreExtension )
+ {
+ TRAPD( err, iOperation = phoneStoreExtension->OwnContactLinkL(*this) );
+ if( err )
+ {
+ // TODO: How is this handled?
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::StoreUnavailable
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::StoreUnavailable(
+ MVPbkContactStore& /*aContactStore*/,
+ TInt /*aReason*/ )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2MyCard::HandleStoreEventL
+// --------------------------------------------------------------------------
+//
+void CPbk2MyCard::HandleStoreEventL(
+ MVPbkContactStore& /*aContactStore*/,
+ TVPbkContactStoreEvent aStoreEvent )
+ {
+ // my card is not set yet
+ if( !iMyCardLink &&
+ aStoreEvent.iContactLink &&
+ ( aStoreEvent.iEventType == TVPbkContactStoreEvent::EContactAdded ||
+ aStoreEvent.iEventType == TVPbkContactStoreEvent::EContactChanged ) )
+ {
+ // check is new or changed contact own contact
+ delete iOperation;
+ iOperation = NULL;
+
+ MVPbkContactStore2* phoneStoreExtension =
+ static_cast<MVPbkContactStore2*>(iPhoneStore->ContactStoreExtension(
+ KMVPbkContactStoreExtension2Uid));
+ if ( phoneStoreExtension )
+ {
+ iOperation = phoneStoreExtension->OwnContactLinkL( *this );
+ }
+ }
+ else if( iMyCardLink && aStoreEvent.iContactLink )
+ {
+ if( aStoreEvent.iEventType == TVPbkContactStoreEvent::EContactDeleted )
+ {
+ // Check is MyCard deleted
+ if( iMyCardLink->IsSame( *aStoreEvent.iContactLink ) )
+ {
+ delete iMyCardLink;
+ iMyCardLink = NULL;
+ iMyCardState = ENonExisting;
+ NotifyObservers( MPbk2MyCardObserver::EStateStatusResolved );
+
+ // remove thumbnail and inform
+ delete iThumbBitmap;
+ iThumbBitmap = NULL;
+ // inform also that thumbnail is removed
+ NotifyObservers( MPbk2MyCardObserver::EStateThumbnailNotFound );
+ }
+ }
+ // contact has changed, check the thumbnail
+ else if( aStoreEvent.iEventType == TVPbkContactStoreEvent::EContactChanged )
+ {
+ // Check is MyCard changed
+ if( iMyCardLink->IsSame( *aStoreEvent.iContactLink ) )
+ {
+ // fetch store contact and check thumbnail
+ iRetrieveOperation =
+ iContactManager->RetrieveContactL( *iMyCardLink, *this );
+ }
+ }
+ }// else if
+ }
+
+// end of file