diff -r 000000000000 -r 5f000ab63145 phoneengine/PhoneCntFinder/ContactService/src/tphcntvoipmatchArray.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneengine/PhoneCntFinder/ContactService/src/tphcntvoipmatchArray.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,238 @@ +/* +* 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: Array of voip matches. +* +*/ + + +#include "tphcntvoipmatchArray.h" +#include "CPhCntContact.h" +#include "tphcntsipuri.h" +#include "tphcntcontactutil.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +TPhCntVoipMatchArray::TPhCntVoipMatchArray() + { + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +TPhCntVoipMatchArray::~TPhCntVoipMatchArray() + { + iMatches.Reset(); + } + +// --------------------------------------------------------------------------- +// Addes contact to array. +// --------------------------------------------------------------------------- +// +void TPhCntVoipMatchArray::AppendL( + CPhCntContact* aVoipMatch ) + { + User::LeaveIfError( iMatches.Append( aVoipMatch ) ); + } + +// --------------------------------------------------------------------------- +// Finds first match that has voip number. +// --------------------------------------------------------------------------- +// +CPhCntContact* TPhCntVoipMatchArray::FindFullMatch( + const TPhCntSipURI& aSipURI ) + { + CPhCntContact* foundContact = NULL; + CPhCntContact* contact = NULL; + + const TPhCntVoipMatchArray::TMatchType type = + FindFullOrUsernameMatch( aSipURI, contact ); + + if( type == TPhCntVoipMatchArray::EFullMatch ) + { + foundContact = contact; + } + RemoveMatchFromArray( foundContact ); + return foundContact; + } + +// --------------------------------------------------------------------------- +// Finds full or username match. +// --------------------------------------------------------------------------- +// +CPhCntContact* TPhCntVoipMatchArray::FindFullOrUsernameMatch( + const TPhCntSipURI& aSipUri, + const TInt aCharsForMatch ) + { + CPhCntContact* contact = NULL; + FindFullOrUsernameMatch( aSipUri, contact, aCharsForMatch ); + RemoveMatchFromArray( contact ); + return contact; + } + +// --------------------------------------------------------------------------- +// Destroys the items in array. +// --------------------------------------------------------------------------- +// +void TPhCntVoipMatchArray::ReleaseMatches() + { + const TInt matchesCount( iMatches.Count() ); + for( TInt i = 0; i < matchesCount; i++ ) + { + iMatches[i]->Release(); + } + iMatches.Reset(); + } + +// --------------------------------------------------------------------------- +// Removes match from array. +// --------------------------------------------------------------------------- +// +void TPhCntVoipMatchArray::RemoveMatchFromArray( + const CPhCntContact* const aMatch ) + { + const TInt index( iMatches.Find( aMatch ) ); + if( index >= 0 ) + { + iMatches.Remove( index ); + } + iMatches.Compress(); + } + +// --------------------------------------------------------------------------- +// Determines if contact has aSipURI voip number. +// --------------------------------------------------------------------------- +// +TPhCntVoipMatchArray::TMatchType TPhCntVoipMatchArray::HasVoipNumber( + CPhCntContact& aContact, + const TPhCntSipURI& aSipURI, + const TInt aCharsForMatch ) const + { + const RArray& allNumbers = aContact.AllNumbers(); + const TInt numbers( allNumbers.Count() ); + TMatchType matchType = TPhCntVoipMatchArray::ENone; + + for( TInt i = 0; i < numbers; i++ ) + { + TPhCntNumber number = allNumbers[i]; + if( number.Type() == CPhCntContact::EVoipNumber || + number.Type() == CPhCntContact::EMobileNumber || + number.Type() == CPhCntContact::EStandardNumber || + number.Type() == CPhCntContact::EPagerNumber || + number.Type() == CPhCntContact::EVideoNumber || + number.Type() == CPhCntContact::EAssistantNumber || + number.Type() == CPhCntContact::EFaxNumber || + number.Type() == CPhCntContact::ECarNumber + ) + { + // If uris are the same then we have a full match. + TPhCntSipURI matchURI( number.Number(), aCharsForMatch ); + // full match if uris are the same (usernamepart requires + // case sensitive match, domain is not sensitive) + if ( matchURI.SipURI().CompareF( aSipURI.SipURI() ) + == KErrNone && + matchURI.UserNamePart().Compare( aSipURI.UserNamePart() ) + == KErrNone ) + { + matchType = TPhCntVoipMatchArray::EFullMatch; + aContact.SetMatchedVoipNumber( matchURI ); + break; + } + else if( matchURI.UserNamePart().Compare( aSipURI.UserNamePart() ) + == KErrNone ) + { + matchType = TPhCntVoipMatchArray::EUserNameMatch; + aContact.SetMatchedVoipNumber( matchURI ); + } + else if( 0 != aCharsForMatch && matchURI.FixedUserNamePart().Compare( + aSipURI.FixedUserNamePart() ) == KErrNone ) + { + matchType = TPhCntVoipMatchArray::EUserNameMatch; + aContact.SetMatchedVoipNumber( matchURI ); + } + } + } + return matchType; + } + +// --------------------------------------------------------------------------- +// Finds contact that has aSipURI voip number +// --------------------------------------------------------------------------- +// +TPhCntVoipMatchArray::TMatchType + TPhCntVoipMatchArray::FindFullOrUsernameMatch( + const TPhCntSipURI& aSipUri, + CPhCntContact*& aFoundContact, + const TInt aCharsForMatch ) + { + CPhCntContact* userNameMatch = NULL; + CPhCntContact* fullMatch = NULL; + TBool duplicateMatch( EFalse ); + TMatchType matchType = TPhCntVoipMatchArray::ENone; + // Go through all voip matches. + const TInt matchesCount( iMatches.Count() ); + + for( TInt i = 0; i < matchesCount; i++ ) + { + + CPhCntContact* possibleMatch = iMatches[i]; + + matchType = HasVoipNumber( *possibleMatch, aSipUri, aCharsForMatch ) ; + if( matchType == TPhCntVoipMatchArray::EFullMatch ) + { + if ( fullMatch && + !TPhCntContactUtil::AreFirstAndLastAndCompanyNameSame( + *fullMatch, *possibleMatch ) ) + { + // Duplicate match means no match found + fullMatch = NULL; + userNameMatch = NULL; + break; + } + fullMatch = possibleMatch; + } + // Once username match is found it + // will be the match if fullmatch is not found. + else if( matchType == TPhCntVoipMatchArray::EUserNameMatch && + EFalse == duplicateMatch ) + { + if ( userNameMatch ) + { + // Duplicate username match. + duplicateMatch = ETrue; + } + userNameMatch = possibleMatch; + } + } + + if( fullMatch ) + { + aFoundContact = fullMatch; + } + else if ( duplicateMatch ) + { + aFoundContact = NULL; + } + else + { + aFoundContact = userNameMatch; + } + return matchType; + } + +// End of File