--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/TContactField.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,285 @@
+/*
+* Copyright (c) 2004-2007 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: Maps a Contact Model field to a Virtual Phonebook field.
+*
+*/
+
+// INCLUDES
+#include "TContactField.h"
+
+// From VPbkCntModel
+#include "CContact.h"
+#include "CContactLink.h"
+#include "CFieldTypeMap.h"
+#include "CFieldFactory.h"
+#include "CContactStore.h"
+
+// From VPbkEng
+#include <MVPbkContactStoreProperties.h>
+#include <MVPbkFieldType.h>
+#include <CVPbkContactManager.h>
+#include <VPbkStoreUriLiterals.h>
+#include <TVPbkContactStoreUriPtr.h>
+
+// System includes
+#include <cntdef.h>
+#include <cntfield.h>
+#include <cntitem.h>
+#include <cntdb.h>
+
+
+namespace VPbkCntModel {
+
+const TInt KSpeedDialKey1 = 1;
+const TInt KSpeedDialKey2 = 2;
+const TInt KSpeedDialKey3 = 3;
+const TInt KSpeedDialKey4 = 4;
+const TInt KSpeedDialKey5 = 5;
+const TInt KSpeedDialKey6 = 6;
+const TInt KSpeedDialKey7 = 7;
+const TInt KSpeedDialKey8 = 8;
+const TInt KSpeedDialKey9 = 9;
+
+TContactField::TContactField(CContact& aParentContact) :
+ iParentContact(&aParentContact),
+ iCntModelField(NULL)
+ {
+ }
+
+TContactField::~TContactField()
+ {
+ }
+
+void TContactField::SetField
+ (CContactItemField& aCntModelField)
+ {
+ iCntModelField = &aCntModelField;
+ iFieldData.SetField(aCntModelField);
+ }
+
+void TContactField::SetParentContact(CContact& aParentContact)
+ {
+ iParentContact = &aParentContact;
+ iFieldData.ResetField();
+ }
+
+MVPbkBaseContact& TContactField::ParentContact() const
+ {
+ return *iParentContact;
+ }
+
+const MVPbkFieldType* TContactField::MatchFieldType(TInt aMatchPriority) const
+ {
+ const MVPbkFieldType* type =
+ iParentContact->FieldTypeMap().GenericFieldType(*iCntModelField,
+ aMatchPriority);
+
+ // Match to the type only if it's supported by the store
+ // (=system template).
+ // E.g 3rd party can add fields that are not in system template using
+ // the Contacts Model API.
+ if ( type &&
+ iParentContact->Store().FieldFactory().ContainsSame( *type ) )
+ {
+ return type;
+ }
+ return NULL;
+ }
+
+const MVPbkFieldType* TContactField::BestMatchingFieldType() const
+ {
+ const MVPbkFieldType* type = NULL;
+ TInt maxPriority = iParentContact->ContactStore().StoreProperties().
+ SupportedFields().MaxMatchPriority();
+ for (TInt i = 0; i <= maxPriority && !type; ++i)
+ {
+ type = MatchFieldType(i);
+ }
+ return type;
+ }
+
+TBool TContactField::SupportsLabel() const
+ {
+ return
+ iParentContact->ParentStore().StoreProperties().SupportsFieldLabels();
+ }
+
+TPtrC TContactField::FieldLabel() const
+ {
+ return iCntModelField->Label();
+ }
+
+void TContactField::SetFieldLabelL(const TDesC& aText)
+ {
+ iCntModelField->SetLabelL(aText);
+ }
+
+TInt TContactField::MaxLabelLength() const
+ {
+ return KVPbkUnlimitedLabelLength;
+ }
+
+const MVPbkContactFieldData& TContactField::FieldData() const
+ {
+ return iFieldData;
+ }
+
+MVPbkContactFieldData& TContactField::FieldData()
+ {
+ return iFieldData;
+ }
+
+TBool TContactField::IsSame(const MVPbkBaseContactField& aOther) const
+ {
+ if (&aOther.ParentContact() == iParentContact)
+ {
+ // Two fields have the same identity if they point to the same Contact
+ // Model field.
+ const TContactField& otherField = static_cast<const TContactField&>(aOther);
+ return (iCntModelField == otherField.iCntModelField);
+ }
+ return EFalse;
+ }
+
+MVPbkStoreContactField* TContactField::CloneLC() const
+ {
+ TContactField* clone =
+ new (ELeave) TContactField(*iParentContact);
+ clone->SetField(*this->NativeField());
+ CleanupDeletePushL(clone);
+ return clone;
+ }
+
+MVPbkContactLink* TContactField::CreateLinkLC() const
+ {
+ MVPbkContactLink* ret = NULL;
+ TContactItemId itemId( iParentContact->NativeContact()->Id() );
+ if ( itemId != KGoldenTemplateId &&
+ itemId != KNullContactId )
+ {
+ ret = CContactLink::NewLC(iParentContact->Store(),
+ iParentContact->NativeContact()->Id(),
+ iCntModelField->Id());
+ }
+ return ret;
+ }
+
+TAny* TContactField::StoreContactFieldExtension(TUid aExtensionUid)
+ {
+ if (aExtensionUid == KMVPbkStoreContactFieldExtension2Uid)
+ {
+ return static_cast<MVPbkStoreContactField2*>(this);
+ }
+ return NULL;
+ }
+
+CArrayFix<TInt>* TContactField::SpeedDialIndexesL()
+ {
+/* Should the store be checked here?
+ MVPbkContactStore* store = aContactManager.ContactStoresL().Find(
+ KVPbkDefaultCntDbURI());
+
+ if (store && &iParentContact->ContactStore() == store)
+ {
+*/
+ CArrayFix<TInt>* speedDialIndexArray = new(ELeave) CArrayFixFlat<TInt>(2);
+ CleanupStack::PushL(speedDialIndexArray);
+
+ const TInt fieldtypeCount = NativeField()->ContentType().FieldTypeCount();
+
+ for (TInt i = 0; i < fieldtypeCount; ++i)
+ {
+ TFieldType fieldType = NativeField()->ContentType().FieldType(i);
+ switch (fieldType.iUid)
+ {
+ case KUidSpeedDialOneValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey1);
+ break;
+
+ case KUidSpeedDialTwoValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey2);
+ break;
+
+ case KUidSpeedDialThreeValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey3);
+ break;
+
+ case KUidSpeedDialFourValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey4);
+ break;
+
+ case KUidSpeedDialFiveValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey5);
+ break;
+
+ case KUidSpeedDialSixValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey6);
+ break;
+
+ case KUidSpeedDialSevenValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey7);
+ break;
+
+ case KUidSpeedDialEightValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey8);
+ break;
+
+ case KUidSpeedDialNineValue:
+ speedDialIndexArray->AppendL(KSpeedDialKey9);
+ break;
+
+ // NO DEFAULT CASE - search only for speed dial Uids, ignore others
+ }
+ }
+
+ if (speedDialIndexArray->Count() == 0)
+ {
+ CleanupStack::PopAndDestroy(speedDialIndexArray);
+ return NULL;
+ }
+ CleanupStack::Pop(); // speedDialIndexArray
+ return speedDialIndexArray;
+ }
+
+MVPbkObjectHierarchy& TContactField::ParentObject() const
+ {
+ return *iParentContact;
+ }
+
+void TContactField::ResetNativeField()
+ {
+ iCntModelField = NULL;
+ iFieldData.ResetField();
+ }
+
+TInt TContactField::NativeFieldIndex() const
+ {
+ TInt result = KErrNotFound;
+
+ CContactItemFieldSet& fields = iParentContact->NativeContact()->CardFields();
+ const TInt count = fields.Count();
+ for (TInt i = 0; i < count; ++i)
+ {
+ if (&fields[i] == NativeField())
+ {
+ result = i;
+ break;
+ }
+ }
+
+ return result;
+ }
+
+} // namespace VPbkCntModel
+