--- /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 <CPbk2ImageManager.h>
+
+#include <featmgr.h> // 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<TPhCntNumber>& 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<TPhCntNumber>& 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<KPhMatcherNumberCount> contactNumber;
+ TBuf<KPhMatcherNumberCount> 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<TPhCntNumber>& 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<TContactItemId>& 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;
+ }