diff -r 000000000000 -r 5f000ab63145 phoneengine/PhoneCntFinder/ContactService/src/CPhCntContact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneengine/PhoneCntFinder/ContactService/src/CPhCntContact.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,531 @@ +/* +* Copyright (c) 2006 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: Contact data. +* +*/ + + +#include + +#include // Feature Manager +#include "CPhCntContact.h" +#include "mphcntcontactfields.h" +#include "cphcntfoundcontacts.h" +#include "MPhCntContactManager.h" +#include "MVPbkContactLink.h" +#include "MVPbkContactLinkArray.h" +#include "PhCntTrace.h" +#include "cphcntvpbkcontactid.h" +#include "tphcnttxttospeech.h" + +#include "tphcntsipuri.h" +#include "CPhoneRawMatchNumberExtractor.h" + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CPhCntContact* CPhCntContact::NewL( + MPhCntContactFields* aContactFields, + MPhCntContactManager& aContactManager ) + { + CPhCntContact* self = + new( ELeave )CPhCntContact( + aContactFields, aContactManager ); + + CleanupStack::PushL( self); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CPhCntContact::~CPhCntContact() + { + delete iContactFields; + delete iOriginalNumber; + delete iContactId; + + delete iMatchedVoipNumber; + if( iNumberExtractor ) + { + iNumberExtractor->Release(); + } + FeatureManager::UnInitializeLib(); + } + +// --------------------------------------------------------------------------- +// Setter +// --------------------------------------------------------------------------- +// +void CPhCntContact::SetOriginalNumberL( const TDesC& aNumber ) + { + HBufC* number = aNumber.AllocL(); + delete iOriginalNumber; + iOriginalNumber = number; + } + +// --------------------------------------------------------------------------- +// Getter +// --------------------------------------------------------------------------- +// +const TDesC& CPhCntContact::OriginalNumber() const + { + return *iOriginalNumber; + } + +// --------------------------------------------------------------------------- +// Sets the owner. +// --------------------------------------------------------------------------- +// +void CPhCntContact::SetOwner( CPhCntFoundContacts* aOwner ) + { + iOwner = aOwner; + } + +// --------------------------------------------------------------------------- +// Increases reference count. +// --------------------------------------------------------------------------- +// +void CPhCntContact::IncreaseReferenceCount() + { + iReferenceCount++; + } + +// --------------------------------------------------------------------------- +// All phone numbers +// --------------------------------------------------------------------------- +// +const RArray& CPhCntContact::AllNumbers() const + { + return iContactFields->AllNumbers(); + } + +// --------------------------------------------------------------------------- +// DTMF number +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::Dtmf() const + { + return iContactFields->Dtmf(); + } + +// --------------------------------------------------------------------------- +// Sets matched number in Voip case. +// --------------------------------------------------------------------------- +// +void CPhCntContact::SetMatchedVoipNumber( + const TPhCntSipURI& aSipUri ) + { + delete iMatchedVoipNumber; + iMatchedVoipNumber = NULL; + //just ignore possible alloc failure + TRAP_IGNORE( iMatchedVoipNumber = HBufC::NewL( + aSipUri.SipURI().Length() ) ) + if( iMatchedVoipNumber ) + { + iMatchedVoipNumber->Des().Append( aSipUri.SipURI() ); + } + } + +// --------------------------------------------------------------------------- +// Releases this contact if no more references found. +// --------------------------------------------------------------------------- +// +void CPhCntContact::Release() + { + iReferenceCount--; + // TODO: Panic if reference count < 0 + if( iReferenceCount == 0 ) + { + // TODO: Panic if iOwner == NULL; + iOwner->Remove( this ); + } + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +CPhCntContactId* CPhCntContact::ContactId() const + { + return iContactId; + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +MVPbkContactLink* CPhCntContact::ContactLink() const + { + return iContactFields->ContactLink(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +MPhCntMatch::TNumberType CPhCntContact::NumberType() const + { + MPhCntMatch::TNumberType numberType = iContactFields->NumberType(); + // check if numbertype was found + if ( numberType == MPhCntMatch::ENone ) + { + // if not, then try to find numbertype among all numbers + if ( iOriginalNumber ) + { + numberType = NumberType( *iOriginalNumber ); + } + } + if( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + // If we have iMatchedNumber then there was voip match. + if( iMatchedVoipNumber ) + { + numberType = MPhCntMatch::EVoipNumber; + } + } + return numberType; + } + +// --------------------------------------------------------------------------- +// Get number type from number that matches to supplied number +// Getter +// --------------------------------------------------------------------------- +// +MPhCntMatch::TNumberType CPhCntContact::NumberType( const TDesC& aNumber ) const + { + const RArray& allNumbers = AllNumbers(); + MPhCntMatch::TNumberType numberType = MPhCntMatch::ENone; + // try to find number from allnumbers array + for ( TInt i = 0; i < allNumbers.Count(); i++ ) + { + TPhCntNumber number( allNumbers[i] ); + // compare 7 last digits + TBuf contactNumber; + TBuf originalNumber; + iNumberExtractor->ExtractRawNumber( number.Number(), contactNumber ); + iNumberExtractor->ExtractRawNumber( aNumber, originalNumber ); + + if ( originalNumber.Compare( contactNumber ) == KErrNone ) + { + // number found, get numbertype + numberType = number.Type(); + break; + } + } + return numberType; + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Constructs the cli +// --------------------------------------------------------------------------- +// +MPhCntMatch::TCliType CPhCntContact::Cli( HBufC*& aCliText ) const + { + TCliType cliType = ECliEmpty; + + HBufC* contactTitle = NULL; + TRAP_IGNORE( contactTitle = iContactFields->GetContactTitleL() ); + + if( contactTitle ) + { + aCliText = contactTitle; + cliType = ECliName; + } + else + { + // No contact title so try to use phonenumber + const TPtrC phoneNumber = Number(); + if( phoneNumber.Length() > 0 ) + { + contactTitle = phoneNumber.Alloc(); + if( contactTitle ) + { + cliType = ECliNumber; + } + } + } + + if( cliType == ECliName ) + { + // Is the contact title as contact title. + if( CompanyName().Compare( contactTitle->Des() ) == 0 && + FirstName().Length() == 0 && + LastName().Length() == 0 ) + { + cliType = ECliCompany; + } + } + + aCliText = contactTitle; + return cliType; + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::FirstName() const + { + return iContactFields->FirstName(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::LastName() const + { + return iContactFields->LastName(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::CompanyName() const + { + return iContactFields->CompanyName(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::Number() const + { + TPtrC number = iContactFields->Number(); + if( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + if( iMatchedVoipNumber ) + { + number.Set( *iMatchedVoipNumber ); + } + } + return number; + } + +// --------------------------------------------------------------------------- +// Finds a phone number for the requested speed dial position. +// --------------------------------------------------------------------------- +// +TPhCntNumber CPhCntContact::SpeedDialNumber( const TInt aPosition ) + { + TPhCntNumber contactNumber; + const RArray& allNumbers = AllNumbers(); + const TInt count( allNumbers.Count() ); + for ( TInt numberIndex = 0; numberIndex < count && contactNumber.Type() == MPhCntMatch::ENone; numberIndex++ ) + { + TPhCntNumber number( allNumbers[numberIndex] ); + if ( number.Position() == aPosition ) + { + contactNumber.Set( number.Number(), number.Type(), number.Position() ); + } + } + return contactNumber; + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::PersonalRingingTone() const + { + return iContactFields->PersonalRingingTone(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +CDesCArray& CPhCntContact::AllDtmfNumbers() const + { + return *iContactFields->AllDtmfNumbers(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Determines if this contact belongs to some of the groups +// --------------------------------------------------------------------------- +// +TBool CPhCntContact::BelongsToGroups( + const CArrayFix& aGroupArray ) const + { + PRINT( "PhCnt: Contact.BelongsToGroups" ); + TBool belongsToGroup = EFalse; + MVPbkContactLinkArray* groupLinks = NULL; + TRAP_IGNORE( + groupLinks = + iContactManager.ConvertContactIdsToLinksL( aGroupArray ); + belongsToGroup = BelongsToGroupsL( groupLinks ); + ); + delete groupLinks; + return belongsToGroup; + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +HBufC* CPhCntContact::TextToSpeechTextL() const + { + TPhCntTxtToSpeech txtToSpeech( + iContactFields->FirstName(), + iContactFields->SecondName(), + iContactFields->LastName(), + iContactFields->CompanyName(), + iContactFields->FirstNamePronunciation(), + iContactFields->LastNamePronunciation(), + iContactFields->CompanyNamePronunciation(), + User::Language() ); + + HBufC* textToSpeech = NULL; + txtToSpeech.GetTextToSpeechL( textToSpeech ); + return textToSpeech; + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::CallImage() const + { + return iContactFields->CallImage(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TPtrC CPhCntContact::CallText() const + { + return iContactFields->CallText(); + } + +// --------------------------------------------------------------------------- +// From base class MPhCntMatch +// Getter +// --------------------------------------------------------------------------- +// +TBool CPhCntContact::HasThumbnailImage() const + { + return iContactFields->HasThumbnail(); + } + +// --------------------------------------------------------------------------- +// Loads thumbnail of this contact. +// --------------------------------------------------------------------------- +// +MPbk2ImageOperation* CPhCntContact::LoadThumbnailL( + MPbk2ImageGetObserver& aObserver ) + { + const MVPbkFieldType* thumbnailFieldType = + iContactFields->ThumbnailField(); + + MPbk2ImageOperation* oper = NULL; + if( thumbnailFieldType ) + { + oper = iContactManager.RetrieveImageL( + iContactFields->StoreContact(), + *thumbnailFieldType, + aObserver ); + } + else + { + User::Leave( KErrNotFound ); + } + return oper; + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CPhCntContact::CPhCntContact( + MPhCntContactFields* aContactFields, + MPhCntContactManager& aContactManager ) : + iContactFields( aContactFields ), + iContactManager( aContactManager ) + { + + } + +// --------------------------------------------------------------------------- +// Secondphase constructor +// --------------------------------------------------------------------------- +// +void CPhCntContact::ConstructL( ) + { + iOriginalNumber = KNullDesC().AllocL(); + MVPbkContactLink* contactLink = iContactFields->ContactLink(); + MVPbkContactLink* clonedLink = NULL; + if( contactLink ) + { + clonedLink = contactLink->CloneLC(); + CleanupStack::Pop(); // clonedLink + } + iContactId = CPhCntVPbkContactId::NewL( clonedLink, iContactManager ); + iNumberExtractor = new( ELeave )CCntRawPhoneNumberExtractor(); + iNumberExtractor->ConstructL(); + FeatureManager::InitializeLibL(); + } + +// --------------------------------------------------------------------------- +// Checks if this belongs to any of the groups. +// --------------------------------------------------------------------------- +// +TBool CPhCntContact::BelongsToGroupsL( + MVPbkContactLinkArray* aGroups ) const + { + TBool belongsToGroups = EFalse; + if( aGroups ) + { + MVPbkContactLinkArray* groupsThisContactBelongsTo = + iContactFields->ContactGroupsLC(); + + if( groupsThisContactBelongsTo ) + { + PRINTF( "PhCnt: Contact.BelongsToGroups.group count.%d", groupsThisContactBelongsTo->Count() ); + for( TInt i = 0; i < aGroups->Count() && !belongsToGroups; i++ ) + { + const MVPbkContactLink& linkToGroup( aGroups->At( i ) ); + + // Find returns index if found from array. + if( groupsThisContactBelongsTo->Find( linkToGroup ) >= 0 ) + { + belongsToGroups = ETrue; + } + } + CleanupStack::PopAndDestroy(); // groupsThisContactBelongsTo + } + } + return belongsToGroups; + }