diff -r 6ca72c0fe49a -r a941bc465d9f PECengine/ListLibrary2/ToolsSrc/PEngContactIdsTools.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/ListLibrary2/ToolsSrc/PEngContactIdsTools.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 2005 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 Id handling tools +* +*/ + +// INCLUDE FILES + +#include +#include "PEngContactIdsTools.h" + + +// ================ LOCAL FUNCTIONS ============================================ + +// ----------------------------------------------------------------------------- +// AssertDomain() +// Checks domain of the contact id +// If domain is same as passed, it is removed from the id. +// +// +// @param aContactId The contact id from where to check the domain. +// @param aUserDomain The user domain. +// @param aDomain Return paramater for extracted domain. +// @return 1 if the domain was updated. Else 0. +// ----------------------------------------------------------------------------- +// +TInt DoAssertDomain( TPtrC& aContactId, + const TDesC& aUserDomain, + TPtrC& aDomain ) + { + TChar domainSeparator( '@' ); + + TInt offset( aContactId.Locate( domainSeparator ) ); + if ( ( KErrNotFound != offset ) && + ( !aUserDomain.Length() || + ( KErrNone == aContactId.Mid( offset ).CompareF( aUserDomain ) ) ) ) + { + aDomain.Set( aContactId.Mid( offset + 1 ) ); // storing the domain too + aContactId.Set( aContactId.Left( offset ) ); // cause we need length + return 1; // as described in description + } + + return 0; // nothing was updated + } + + +// ----------------------------------------------------------------------------- +// CleanContactListName() +// Removes slash from the beginning of the contact list id if it is there +// +// @param aCntListId Contact list id to clean. +// ----------------------------------------------------------------------------- +// +void DoCleanContactListName( TPtrC& aCntListId ) + { + // look for the slash as first character->1 + if ( aCntListId.Left( 1 ).Compare( KPEngWVResourceSeparator ) == KErrNone ) + { + // ignore slash on the beginning, 1 character + aCntListId.Set( aCntListId.Mid( 1 ) ); + } + } + + + +// ----------------------------------------------------------------------------- +// DoCompareContactIdsCommon() +// Compare two Contact Ids +// +// @param aContactId1 Contact Id 1. Possible "WV:" prefix is stripped away. +// @param aContactId2 Contact Id 2. Possible "WV:" prefix is stripped away. +// @param aUserDomain user domain +// @return KErrNone if they contact IDs are same, other non zero number if not +// ----------------------------------------------------------------------------- +// +TInt DoCompareContactIdsCommon( TPtrC& aContactId1, + TPtrC& aContactId2 ) + { + // get name without wv: part on the beginning + if ( KErrNone + == + aContactId1.Left( KPEngWVIDPrefixLength ).CompareF( KPEngWVIDPrefix ) ) + { + aContactId1.Set( aContactId1.Mid( KPEngWVIDPrefixLength ) ); + } + + if ( KErrNone + == + aContactId2.Left( KPEngWVIDPrefixLength ).CompareF( KPEngWVIDPrefix ) ) + { + aContactId2.Set( aContactId2.Mid( KPEngWVIDPrefixLength ) ); + } + + return aContactId1.CompareF( aContactId2 ); + } + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// NContactIdsTools::FindContactIdInArray() +// ----------------------------------------------------------------------------- +// +TInt NContactIdsTools::FindContactIdInArray( const MDesCArray& aArray, + const TDesC& aContactId, + TInt& aIndex, + const TDesC& aUserDomain ) + { + TInt l( 0 ); + TInt r( aArray.MdcaCount() ); + TInt ret( KErrNotFound ); + while ( r > l ) + { + TInt inx = ( l + r ) >> 1; + TInt k ( CompareContactIds( aContactId, + aArray.MdcaPoint( inx ), + aUserDomain ) ); + if ( k == 0 ) + { + aIndex = inx; + return KErrNone; + } + else if ( k > 0 ) + l = inx + 1; + else + r = inx; + } + aIndex = r; + return ret; + } + + +// ----------------------------------------------------------------------------- +// NContactIdsTools::FindContactIdInArray() +// ----------------------------------------------------------------------------- +// +TInt NContactIdsTools::FindContactIdInArray( const MDesCArray& aArray, + const TDesC& aContactId, + const TDesC& aUserDomain ) + { + TInt index( 0 ); + if ( KErrNone == NContactIdsTools::FindContactIdInArray( aArray, + aContactId, + index, + aUserDomain ) ) + { + return index; + } + + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// NContactIdsTools::AddContactIdToArrayL() +// ----------------------------------------------------------------------------- +// +TInt NContactIdsTools::AddContactIdToArrayL( CDesCArray& aArray, + const TDesC& aContactId, + const TDesC& aUserDomain ) + { + TInt index( 0 ); + if ( KErrNone == NContactIdsTools::FindContactIdInArray( aArray, + aContactId, + index, + aUserDomain ) ) + { + return KErrAlreadyExists; + } + + aArray.InsertL( index , aContactId ); + return index; + } + + +// ----------------------------------------------------------------------------- +// NContactIdsTools::RemoveContactIdFromArray() +// ----------------------------------------------------------------------------- +// +TInt NContactIdsTools::RemoveContactIdFromArray( CDesCArray& aArray, + const TDesC& aContactId, + const TDesC& aUserDomain ) + { + TInt posToDelete( NContactIdsTools::FindContactIdInArray( aArray, + aContactId, + aUserDomain ) ); + if ( posToDelete != KErrNotFound ) + { + aArray.Delete( posToDelete ); + return KErrNone; + } + + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// NContactIdsTools::CompareWVIDs() +// ----------------------------------------------------------------------------- +// +TInt NContactIdsTools::CompareContactIds( const TDesC& aContactId1, + const TDesC& aContactId2, + const TDesC& aUserDomain ) + { + // get contact ids without wv: prefix + TPtrC contactId1( aContactId1 ); + TPtrC contactId2( aContactId2 ); + + TInt err = DoCompareContactIdsCommon( contactId1, contactId2 ); + if ( err == KErrNone ) + { + return KErrNone; + } + + // try to compare them without domain if domain is missing or is same as user one + // remove domain from contactId1 + TPtrC domain1; + TPtrC domain2; + TInt domainCount = DoAssertDomain( contactId1, aUserDomain, domain1 ); + domainCount += DoAssertDomain( contactId2, aUserDomain, domain2 ); + + // if none of then or both have domain, no need to compare + if ( ( domainCount == 0 ) || + ( domainCount == 2 ) ) + { + // compare domains, if match continue, else return the error + if ( domain1.CompareF( domain2 ) != KErrNone ) + { + return err; + } + } + + return contactId1.CompareF( contactId2 ); + } + + +// ----------------------------------------------------------------------------- +// NContactListIdsTools::ExtractPureContactListName() +// ----------------------------------------------------------------------------- +// +void NContactListIdsTools::ExtractPureContactListName( TPtrC& aContactListId, + const TDesC& aPlainContactId ) + { + TChar domainSeparator( '@' ); + TInt offset( aContactListId.Locate( domainSeparator ) ); + + // remove domain + if ( KErrNotFound != offset ) + { + aContactListId.Set( aContactListId.Left( offset ) ); + } + + // remove wv prefix + if ( KErrNone + == + aContactListId.Left( KPEngWVIDPrefixLength ).CompareF( KPEngWVIDPrefix ) ) + { + aContactListId.Set( aContactListId.Mid( KPEngWVIDPrefixLength ) ); + } + + + // remove user part + if ( KErrNone + == + aContactListId.Left( aPlainContactId.Length() ).CompareF( aPlainContactId ) ) + { + aContactListId.Set( aContactListId.Mid( aPlainContactId.Length() ) ); + } + } + + +// ----------------------------------------------------------------------------- +// NContactListIdsTools::CompareContactListIds() +// ----------------------------------------------------------------------------- +// +TInt NContactListIdsTools::CompareContactListIds( const TDesC& aContactListId1, + const TDesC& aContactListId2 ) + { + // extract pure list name, free from domain and possibly user part + TPtrC id1( aContactListId1 ); + TPtrC id2( aContactListId2 ); + DoCleanContactListName( id1 ); + DoCleanContactListName( id2 ); + + // do the compare + return id1.CompareF( id2 ); + } + +// End of File