PECengine/JanitorPlugin2/Src/PEngContactIdTools.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/JanitorPlugin2/Src/PEngContactIdTools.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,152 @@
+/*
+* 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:  WV ID handling tools
+*
+*/
+
+// INCLUDE FILES
+
+#include <e32std.h>
+#include "PEngContactIdTools.h"
+
+// CONSTANTS
+_LIT( KPengWVIDPrefix, "wv:" );
+const TInt KPengWVIDPrefixLength( 3 );
+_LIT( KCharAdd, "@" );
+
+// -----------------------------------------------------------------------------
+// FindContactIdInArray()
+// Find Contact Id in the aray
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+GLREF_C  TInt FindContactIdInArray(
+    const MDesCArray& aArray,
+    const TDesC& aId )
+    {
+    TInt count ( aArray.MdcaCount() );
+    for ( TInt x( 0 ) ; x < count ; x++ )
+        {
+        TInt err ( CompareContactIds( aArray.MdcaPoint( x ), aId ) );
+        if ( err == KErrNone )
+            {
+            return x;
+            }
+        if ( err > 0 ) // no sense to look further in the array
+            {
+            return KErrNotFound;
+            }
+        }
+    return KErrNotFound;
+    }
+
+// -----------------------------------------------------------------------------
+// AddContactIToArrayL()
+// Add contact Id to the array of the contact Ids
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+GLREF_C TInt AddContactIdToArrayL(
+    CDesCArray& aArray,
+    const TDesC& aId )
+    {
+    // insert the id in sequence
+    TInt count ( aArray.MdcaCount() );
+    for ( TInt x( 0 ) ; x < count ; x++ )
+        {
+        TInt err ( CompareContactIds( aArray.MdcaPoint( x ), aId ) );
+        if ( err > 0 )
+            {
+            aArray.InsertL( x, aId  );
+            return x;
+            }
+        if ( err == 0 )
+            {
+            return KErrAlreadyExists;
+            }
+        // go for another loop
+        }
+    // was not inserted, then add it to the end of the array
+    aArray.AppendL( aId );
+    return count;
+    }
+
+// -----------------------------------------------------------------------------
+// CompareContactIs()
+// Compare two contact Ids
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+GLREF_C TInt CompareContactIds(
+    const TDesC& aId1,
+    const TDesC& aId2 )
+    {
+    // get name without wv: part on the beginning
+    TPtrC id1( aId1 );
+    TPtrC id2( aId2 );
+
+    if ( aId1.Left( KPengWVIDPrefixLength ).CompareF( KPengWVIDPrefix ) == KErrNone )
+        {
+        id1.Set( aId1.Mid( KPengWVIDPrefixLength ) );
+        }
+
+    if ( aId2.Left( KPengWVIDPrefixLength ).CompareF( KPengWVIDPrefix ) == KErrNone )
+        {
+        id2.Set( aId2.Mid( KPengWVIDPrefixLength ) );
+        }
+
+    // fix 21.04.2005 OK:
+    // check how it goes with the domains, if they are different
+    // no match, if one missing and base id is same, then same ids
+    TInt err ( 	id1.CompareF( id2 ) );
+
+    if ( err == KErrNone )
+        {
+        return err;
+        }
+
+    // try to compare them without domain
+    // if home domain info is missing
+    // or wv id domain is same as home one, remove it from the wv id
+    TInt offset1( id1.Find( KCharAdd ) );
+    TInt offset2( id2.Find( KCharAdd ) );
+
+    // if both are with domain, then they are not same
+    if ( ( offset1 != KErrNotFound ) && ( offset2 != KErrNotFound ) )
+        {
+        return err;
+        }
+    // remove domains from wv id1
+    TInt domainCount( 0 );
+    if ( KErrNotFound != offset1 )
+        {
+        id1.Set( id1.Left( offset1 ) ); // cause we need length
+        domainCount++;
+        }
+    // remove domains from wv id2
+    if ( KErrNotFound != offset2 )
+        {
+        id2.Set( id2.Left( offset2 ) ); // cause we need length
+        domainCount++;
+        }
+
+    // if none of then or both have domain, no need to compare
+    if ( ( !domainCount ) || ( domainCount == 2 ) )
+        {
+        return err;
+        }
+    return id1.CompareF( id2 );
+    }
+
+//  End of File