diff -r 41a7f70b3818 -r 5266b1f337bd phoneengine/PhoneCntFinder/ContactService/src/cphcntspeeddialimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneengine/PhoneCntFinder/ContactService/src/cphcntspeeddialimpl.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -0,0 +1,385 @@ +/* +* Copyright (c) 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: Implementation of CPhCntSpeedDialImpl class. +* +*/ + + +#include +#include +#include +#include +#include +#include + +#include "CPhCntSpeedDialMonitor.h" +#include "cphcntspeeddialimpl.h" +#include "cphcntspeeddialcontactlinkfetch.h" +#include "MPhoneCntPbkOwner.h" +#include "cphcntfetchcontact.h" +#include "CPhCntContactStores.h" +#include "MPhCntContactManager.h" +#include "CPhCntContact.h" +#include "cphcntvpbkcontactid.h" +#include "CPhCntContactManager.h" +#include "pevirtualengine.h" + +// Characters that are needed to be stripped out +// from phone number before dialing. +_LIT( KInvalidPhonenumberCharacters, " ()-" ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Default constructor. +// --------------------------------------------------------------------------- +// +CPhCntSpeedDialImpl::CPhCntSpeedDialImpl( MPhoneCntPbkOwner& aPbkOwner ) : + iContactManager( *aPbkOwner.ContactManager() ), + iPbkOwner( aPbkOwner ) + { + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::ConstructL +// --------------------------------------------------------------------------- +// +void CPhCntSpeedDialImpl::ConstructL() + { + iSpeedDialContactLinkFetcher = + CPhCntSpeedDialContactLinkFetch::NewL( iContactManager ); + + iContactStores = CPhCntContactStores::NewL( iContactManager ); + + iContactFetcher = CPhCntFetchContact::NewL( *iContactStores ); + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::FetchContact +// --------------------------------------------------------------------------- +// +TInt CPhCntSpeedDialImpl::FetchContact( + TInt aSpeedDialPosition, + CPhCntContact*& aContact ) + { + TRAPD( err, + const MVPbkContactLink& linkToSpeedDialContact = + iSpeedDialContactLinkFetcher->FetchSpeedDialLinkL( + aSpeedDialPosition ); + + + err = + iContactFetcher->FetchContact( linkToSpeedDialContact, aContact ); + ) + return err; + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::CopyNumberL +// --------------------------------------------------------------------------- +// +void CPhCntSpeedDialImpl::CopyNumberL( + TDes& aCopyTo, + const TDesC& aNumber ) + { + if( aCopyTo.MaxLength() >= aNumber.Length() ) + { + aCopyTo.Copy( aNumber ); + } + else + { + User::Leave( KErrArgument ); + } + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::ParseNumber +// --------------------------------------------------------------------------- +// +void CPhCntSpeedDialImpl::ParseNumber( TDes& aNumber ) + { + TBuf< KPEPhoneNumberMaxLength > parsedNumber = KNullDesC(); + TLex parser( aNumber ); + TChar c; + while( !parser.Eos() ) + { + c = parser.Get(); + if ( KErrNotFound == KInvalidPhonenumberCharacters().Locate( c ) ) + { + parsedNumber.Append( c ); + } + } + aNumber = parsedNumber; + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::CopyContactInfoToFieldInfoL +// --------------------------------------------------------------------------- +// +void CPhCntSpeedDialImpl::CopyContactInfoToFieldInfoL( + CPhCntContact& aContact, + TInt aSpeedDialPosition, + TSpdDialFieldInfo& aFieldInfo ) + { + TPhCntNumber speedDial = aContact.SpeedDialNumber( aSpeedDialPosition ); + aFieldInfo.iNumberType = speedDial.Type(); + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::NewL +// --------------------------------------------------------------------------- +// +CPhCntSpeedDialImpl* CPhCntSpeedDialImpl::NewL( + MPhoneCntPbkOwner& aPbkOwner ) + { + CPhCntSpeedDialImpl* self = + CPhCntSpeedDialImpl::NewLC( aPbkOwner ); + + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::NewLC +// --------------------------------------------------------------------------- +// +CPhCntSpeedDialImpl* CPhCntSpeedDialImpl::NewLC( + MPhoneCntPbkOwner& aPbkOwner ) + { + CPhCntSpeedDialImpl* self = new( ELeave ) + CPhCntSpeedDialImpl( aPbkOwner ); + + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CPhCntSpeedDialImpl::~CPhCntSpeedDialImpl() + { + delete iContactFetcher; + delete iContactStores; + delete iSpeedDialContactLinkFetcher; + delete iSpdDial; + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::GetSpeedDialFieldInfoL +// --------------------------------------------------------------------------- +// +void CPhCntSpeedDialImpl::GetSpeedDialFieldInfoL( + TInt aSpeedDialPosition, + TSpdDialFieldInfo& aFieldInfo ) + { + CPhCntContact* contact = NULL; + User::LeaveIfError( FetchContact( aSpeedDialPosition, contact ) ); + + CleanupStack::PushL( contact ); + + CopyContactInfoToFieldInfoL( *contact, aSpeedDialPosition, aFieldInfo ); + + CleanupStack::PopAndDestroy( contact ); + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::GetSpeedDialFieldL +// --------------------------------------------------------------------------- +// +TInt CPhCntSpeedDialImpl::GetSpeedDialFieldL( + TInt aSpeedDialPosition, + TDes& aPhoneNumber ) + { + CPhCntContact* contact = NULL; + const TInt err = FetchContact( aSpeedDialPosition, contact ); + if( !err ) + { + CleanupStack::PushL( contact ); + TPhCntNumber speedDial( contact->SpeedDialNumber( aSpeedDialPosition ) ); + CopyNumberL( aPhoneNumber, speedDial.Number() ); + CleanupStack::PopAndDestroy( contact ); + ParseNumber( aPhoneNumber ); + } + return err; + } + +// --------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::GetSpeedDialFieldL +// --------------------------------------------------------------------------- +// +TInt CPhCntSpeedDialImpl::GetSpeedDialFieldL( + TInt aSpeedDialPosition, + TDes& aPhoneNumber, + TSpdDialFieldInfo& aFieldInfo ) + { + CPhCntContact* contact = NULL; + const TInt err = FetchContact( aSpeedDialPosition, contact ); + + if( !err ) + { + CleanupStack::PushL( contact ); + TPhCntNumber speedDial( contact->SpeedDialNumber( aSpeedDialPosition ) ); + CopyNumberL( aPhoneNumber, speedDial.Number() ); + CopyContactInfoToFieldInfoL( *contact, aSpeedDialPosition, aFieldInfo ); + CleanupStack::PopAndDestroy( contact ); + ParseNumber( aPhoneNumber ); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::FetchNumberL +// ----------------------------------------------------------------------------- +// +TInt CPhCntSpeedDialImpl::FetchNumberL( + TInt aSpeedDialPosition, + TDes& aPhoneNumber ) + { + CPhCntContact* contact = NULL; + TInt err = FetchContact( aSpeedDialPosition, contact ); + + if( !err ) + { + CleanupStack::PushL( contact ); + TPhCntNumber speedDial( contact->SpeedDialNumber( aSpeedDialPosition ) ); + CopyNumberL( aPhoneNumber, speedDial.Number() ); + CleanupStack::PopAndDestroy( contact ); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::AssignSpeedDialFieldL +// ----------------------------------------------------------------------------- +// +TInt CPhCntSpeedDialImpl::AssignSpeedDialFieldL( + TInt aSpeedDialPosition, + TDes& aPhoneNumber ) + { + CVPbkContactManager* contactMg = + &iPbkOwner.ContactManager()->ContactManager(); + if ( !iSpdDial ) + { + iSpdDial = CSpdiaDialogs::NewL( *contactMg ); + } + MVPbkContactLink *link = NULL; + TInt err = iSpdDial->ShowAssign( aSpeedDialPosition, link ); + delete iSpdDial; + iSpdDial = NULL; + delete link; + link = NULL; + + if ( err == KErrNone ) + { + err = FetchNumberL( aSpeedDialPosition, aPhoneNumber ); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::AssignSpeedDialFieldL +// ----------------------------------------------------------------------------- +// +TInt CPhCntSpeedDialImpl::AssignSpeedDialFieldL( + TInt aSpeedDialPosition, + TDes& aPhoneNumber, + TSpdDialFieldInfo& aFieldInfo ) + { + TInt err = AssignSpeedDialFieldL( aSpeedDialPosition, aPhoneNumber ); + if ( err == KErrNone ) + { + GetSpeedDialFieldInfoL( aSpeedDialPosition, aFieldInfo ); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::Cancel +// ----------------------------------------------------------------------------- +// +void CPhCntSpeedDialImpl::Cancel() + { + if ( iSpdDial ) + { + iSpdDial->Cancel(); + } + } + +// ----------------------------------------------------------------------------- +// CPhCntSpeedDialImpl::CreateNumberTypeIconLC +// ----------------------------------------------------------------------------- +// +CEikImage* CPhCntSpeedDialImpl::CreateNumberTypeIconLC( + TInt aNumberType ) + { + TUint icon; + TUint mask; + switch ( aNumberType ) + { + case EPbkFieldIdPhoneNumberMobile: + icon = EMbmAvkonQgn_prop_nrtyp_mobile; + mask = EMbmAvkonQgn_prop_nrtyp_mobile_mask; + break; + case EPbkFieldIdPagerNumber: + icon = EMbmAvkonQgn_prop_nrtyp_pager; + mask = EMbmAvkonQgn_prop_nrtyp_pager_mask; + break; + case EPbkFieldIdPhoneNumberVideo: + icon = EMbmAvkonQgn_prop_nrtyp_video; + mask = EMbmAvkonQgn_prop_nrtyp_video_mask; + break; + case EPbkFieldIdVOIP: + icon = EMbmAvkonQgn_prop_nrtyp_voip; + mask = EMbmAvkonQgn_prop_nrtyp_voip_mask; + break; + case EPbkFieldIdPhoneNumberGeneral: + case EPbkFieldIdPhoneNumberHome: + case EPbkFieldIdPhoneNumberWork: + case EPbkFieldIdFaxNumber: + default: + icon = EMbmAvkonQgn_prop_nrtyp_phone; + mask = EMbmAvkonQgn_prop_nrtyp_phone_mask; + break; + } + + CEikImage* iconImg = new ( ELeave ) CEikImage; + CleanupStack::PushL( iconImg ); + + CFbsBitmap* iconBmp = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( iconBmp ); + User::LeaveIfError( iconBmp->Load( + KAvkonBitmapFile(), + icon, + ETrue ) ); + + CFbsBitmap* iconMaskBmp = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( iconMaskBmp ); + User::LeaveIfError( iconMaskBmp->Load( + KAvkonBitmapFile(), + mask, + ETrue ) ); + + CleanupStack::Pop( iconMaskBmp ); + CleanupStack::Pop( iconBmp ); + + iconImg->SetPicture( iconBmp, iconMaskBmp ); + iconImg->SetPictureOwnedExternally( EFalse ); + + return iconImg; + } + +// End of File