phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFieldInfo.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFieldInfo.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,168 @@
+/*
+* 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:  The virtual phonebook field info
+*
+*/
+
+
+#include "CFieldInfo.h"
+
+#include <barsread.h>
+#include <cntfield.h>
+
+namespace VPbkCntModel {
+
+const TInt KFieldInfoGranularity = 8;
+    
+CFieldInfo::CFieldInfo()
+    {
+	}
+
+inline void CFieldInfo::ConstructL(TResourceReader& aReader)
+    {    
+    iFieldStorageType = aReader.ReadInt32();
+    iContentType = CContentType::NewL();
+	const TUid contactFieldUid = TUid::Uid(aReader.ReadInt32());
+	iContentType->SetMapping(TUid::Uid(aReader.ReadInt32()));
+	if (contactFieldUid != KUidContactFieldNone)
+        {
+	    iContentType->AddFieldTypeL(contactFieldUid);
+        }
+    TInt count = aReader.ReadInt16();
+	while (--count >= 0)
+        {
+		iContentType->AddFieldTypeL(TUid::Uid(aReader.ReadInt32()));
+        }
+    iCategory = aReader.ReadInt32();
+    iFieldName = aReader.ReadHBufCL();
+    iFlags = aReader.ReadInt32();
+	}
+
+CFieldInfo* CFieldInfo::NewL(TResourceReader& aReader)
+    {
+	CFieldInfo* self = new(ELeave) CFieldInfo;
+	CleanupStack::PushL(self);
+	self->ConstructL(aReader);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CFieldInfo::~CFieldInfo()
+    {
+    delete iFieldName;
+    delete iContentType;
+    }
+
+inline TBool CFieldInfo::IsEqualFlags(const CContactItemField& aField) const
+    {
+    TUint flags = 0;
+    if (aField.IsHidden())
+		{
+		flags |= EContactFieldFlagHidden;
+		}
+    if (aField.IsReadOnly())
+		{
+		flags |= EContactFieldFlagReadOnly;
+		}
+    // Do not check synchronize flag as ctnmodel modifies it
+    if (aField.IsDisabled())
+		{
+		flags |= EContactFieldFlagDisabled;
+		}
+    return ((flags & iFlags) == flags);
+    }
+        
+TBool CFieldInfo::IsEqualType(const CContactItemField& aField) const
+    {
+    return
+        (iFieldStorageType == aField.StorageType() &&
+        iContentType->IsEqual( aField.ContentType() ) &&
+        TUint(iCategory) == aField.UserFlags() &&
+        IsEqualFlags(aField));
+    }  
+
+TBool CFieldInfo::IsEqualLabel(const CContactItemField& aField) const
+    {
+    return
+        ((!iFieldName && aField.Label().Length()==0) || 
+        (iFieldName && aField.Label()==*iFieldName));
+    }
+
+CContactItemField* CFieldInfo::CreateFieldL() const
+    {
+    CContactItemField* field = CContactItemField::NewLC(iFieldStorageType, 
+        *iContentType);
+    
+	field->SetUserFlags( iCategory );
+    if ( iFieldName )
+        {
+	    field->SetLabelL( *iFieldName );
+        }
+	if ( iFlags & EContactFieldFlagHidden )
+        {
+		field->SetHidden( ETrue );
+        }
+	if ( iFlags & EContactFieldFlagReadOnly )
+        {
+		field->SetReadOnly( ETrue );
+        }
+	if ( iFlags & EContactFieldFlagSynchronize )
+        {
+		field->SetSynchronize( ETrue );
+        }
+	if ( iFlags & EContactFieldFlagDisabled )
+        {
+		field->SetDisabled( ETrue );
+        }
+    CleanupStack::Pop(field);
+    return field;
+    }
+    
+CFieldsInfo::CFieldsInfo() :
+    CArrayPtrFlat<CFieldInfo>(KFieldInfoGranularity)
+    {
+    }
+
+inline void CFieldsInfo::ConstructL(TResourceReader& aReader)
+    {
+    AppendFieldsL(aReader);
+    }
+
+CFieldsInfo* CFieldsInfo::NewL(TResourceReader& aReader)
+    {
+	CFieldsInfo* self = new(ELeave) CFieldsInfo;
+	CleanupStack::PushL(self);
+	self->ConstructL(aReader);
+	CleanupStack::Pop(self);
+	return self;
+    }
+
+void CFieldsInfo::AppendFieldsL(TResourceReader& aReader)
+    {
+    TInt count = aReader.ReadInt16();
+    while (--count >= 0)
+        {
+        CFieldInfo* fieldInfo = CFieldInfo::NewL(aReader);
+        CleanupStack::PushL(fieldInfo);
+        AppendL(fieldInfo);
+        CleanupStack::Pop(fieldInfo);
+        }
+    }
+        
+CFieldsInfo::~CFieldsInfo()
+    {
+    ResetAndDestroy();
+    }
+
+} // VPbkCntModel