diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/BCardEng/src/CBCardFieldUidMapping.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/BCardEng/src/CBCardFieldUidMapping.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,212 @@ +/* +* Copyright (c) 2002 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: +* vCard data field <-> UID mapping class. +* +*/ + + +// INCLUDE FILES +#include "CBCardFieldUidMapping.h" +#include + + +// MODULE DATA STRUCTURES + +struct CBCardFieldUidMapping::TMappingImpl + { + // Data + const TDesC8* iName; + TInt iFieldIndex; + TUid iUid; + + /// Default constructor + TMappingImpl(); + + /// Conversion constructor from TVcardField + TMappingImpl(const TVcardField& aVcardField); + + /** + * Converts this object to a CBCardFieldUidMapping::TMapping. + */ + operator CBCardFieldUidMapping::TMapping() const; + + // Array operations + static TInt CompareName(const TMappingImpl& aLhs, const TMappingImpl& aRhs); + static TInt CompareIndex(const TMappingImpl& aLhs, const TMappingImpl& aRhs); + static TInt CompareNameAndIndex(const TMappingImpl& aLhs, const TMappingImpl& aRhs); + }; + + +// ==================== MEMBER FUNCTIONS ==================== + +inline CBCardFieldUidMapping::TMappingImpl::TMappingImpl() + { + // No need to init anything + } + +inline CBCardFieldUidMapping::TMappingImpl::TMappingImpl + (const TVcardField& aVcardField) : + iName(&aVcardField.iName), + iFieldIndex(aVcardField.iFieldIndex) + { + } + +inline CBCardFieldUidMapping::TMappingImpl::operator CBCardFieldUidMapping::TMapping() const + { + TMapping result; + result.iVcardField.iName.Set(*iName); + result.iVcardField.iFieldIndex = iFieldIndex; + result.iUid = iUid; + return result; + } + +inline TInt CBCardFieldUidMapping::TMappingImpl::CompareName + (const TMappingImpl& aLhs, const TMappingImpl& aRhs) + { + return (aLhs.iName->CompareF(*aRhs.iName)); + } + +inline TInt CBCardFieldUidMapping::TMappingImpl::CompareIndex + (const TMappingImpl& aLhs, const TMappingImpl& aRhs) + { + return (aLhs.iFieldIndex - aRhs.iFieldIndex); + } + +TInt CBCardFieldUidMapping::TMappingImpl::CompareNameAndIndex + (const TMappingImpl& aLhs, const TMappingImpl& aRhs) + { + TInt result = CompareName(aLhs,aRhs); + if (result == 0) + { + // If names are equal compare indexes + result = CompareIndex(aLhs,aRhs); + } + return result; + } + +inline CBCardFieldUidMapping::CBCardFieldUidMapping() + { + } + +inline void CBCardFieldUidMapping::ConstructL + (TResourceReader& aReader) + { + // Read the array + TInt count = aReader.ReadInt16(); + while (--count >= 0) + { + HBufC* name16 = aReader.ReadHBufCL(); + CleanupStack::PushL(name16); + HBufC8* name = HBufC8::NewLC(name16->Length()); + TPtr8 namePtr = name->Des(); + namePtr.Copy(*name16); + + TMappingImpl newMapping; + newMapping.iName = name; + + newMapping.iFieldIndex = aReader.ReadInt32(); + newMapping.iUid = TUid::Uid(aReader.ReadInt32()); + User::LeaveIfError(iMappings.Append(newMapping)); + CleanupStack::Pop(name); + CleanupStack::PopAndDestroy(name16); + } + + // Sort the array by (name,index) + iMappings.Sort(TLinearOrder(TMappingImpl::CompareNameAndIndex)); + } + +CBCardFieldUidMapping* CBCardFieldUidMapping::NewL(TResourceReader& aReader) + { + CBCardFieldUidMapping* self = new(ELeave) CBCardFieldUidMapping; + CleanupStack::PushL(self); + self->ConstructL(aReader); + CleanupStack::Pop(self); + return self; + } + +CBCardFieldUidMapping::~CBCardFieldUidMapping() + { + for (TInt i=iMappings.Count()-1; i >= 0; --i) + { + // The cast below is safe, see ConstructL() + delete ((HBufC8*)(iMappings[i].iName)); + } + iMappings.Close(); + } + +TInt CBCardFieldUidMapping::Count() const + { + return iMappings.Count(); + } + +CBCardFieldUidMapping::TMapping CBCardFieldUidMapping::operator[] + (TInt aIndex) const + { + return iMappings[aIndex]; + } + +TInt CBCardFieldUidMapping::Find + (const TVcardField& aVcardField) const + { + TMappingImpl fieldToFind(aVcardField); + return iMappings.FindInOrder + (fieldToFind, + TLinearOrder(TMappingImpl::CompareNameAndIndex)); + } + +TInt CBCardFieldUidMapping::Find + (const TUid& aUid) const + { + // Inline find loop instead of RArray::Find for speed + const TInt count = iMappings.Count(); + for (TInt i=0; i < count; ++i) + { + if (iMappings[i].iUid == aUid) + { + return i; + } + } + return KErrNotFound; + } + +TPtrC8 CBCardFieldUidMapping::FindName + (const TUid& aUid) const + { + TPtrC8 result; + const TInt index = Find(aUid); + if (index != KErrNotFound) + { + result.Set(*iMappings[index].iName); + } + + return result; + } + +TInt CBCardFieldUidMapping::FindIndex + (const TUid& aUid) const + { + TInt index = Find(aUid); + if (index == KErrNotFound) + { + return KErrNotFound; + } + else + { + return iMappings[index].iFieldIndex; + } + } + + +// End of File