--- /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<TPhCntNumber>& 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