javaextensions/pim/framework/src.s60/cpimfield.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/pim/framework/src.s60/cpimfield.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,450 @@
+/*
+* Copyright (c) 2008 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:  Class for holding PIM field data
+ *
+*/
+
+
+// CLASS HEADER
+#include "cpimfield.h"
+
+// INTERNAL INCLUDES
+#include "cpimvaluebase.h"
+#include "cpimintvalue.h"
+#include "cpimbooleanvalue.h"
+#include "cpimdatevalue.h"
+#include "cpimstringvalue.h"
+#include "cpimstringarrayvalue.h"
+#include "cpimbinaryvalue.h"
+#include "pimpanics.h"
+#include "logger.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPIMField::~CPIMField()
+{
+    JELOG2(EPim);
+    iValues.ResetAndDestroy();
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::NewL
+// Default two-phase constructor
+// ---------------------------------------------------------------------------
+//
+CPIMField* CPIMField::NewL(const TPIMFieldData& aFieldData)
+{
+    JELOG2(EPim);
+    CPIMField* self = new(ELeave) CPIMField(aFieldData);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::NewLC
+// Default two-phase constructor. The newly created object is left to the
+// cleanup stack
+// ---------------------------------------------------------------------------
+//
+CPIMField* CPIMField::NewLC(const TPIMFieldData& aFieldData)
+{
+    JELOG2(EPim);
+    CPIMField* self = CPIMField::NewL(aFieldData);
+    CleanupStack::PushL(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::SetValueL
+// Sets new value to a specific index. This method
+// leaves if there is no such field or field index.
+// ---------------------------------------------------------------------------
+//
+void CPIMField::SetValueL(const TPIMFieldData& aFieldData)
+{
+    JELOG2(EPim);
+    // Find that there is a value in the requested index
+    __ASSERT_ALWAYS(IsInRange(aFieldData.Index()), User::Leave(KErrNotFound));
+
+    TInt index = aFieldData.Index();
+
+    switch (aFieldData.FieldDataType())
+    {
+    case EPIMFieldInt:
+    {
+        iValues[index]->SetIntValue(aFieldData.iIntegerBooleanValue);
+        break;
+    }
+    case EPIMFieldBoolean:
+    {
+        iValues[index]->SetBooleanValue(aFieldData.iIntegerBooleanValue);
+        break;
+    }
+    case EPIMFieldDate:
+    {
+        iValues[index]->SetDateValue(aFieldData.iDateValue);
+        break;
+    }
+    case EPIMFieldString:
+    {
+        iValues[index]->SetStringValue(aFieldData.iStringValue);
+        break;
+    }
+    case EPIMFieldStringArray:
+    {
+        iValues[index]->SetStringArrayValue(aFieldData.iStringArrayValue);
+        break;
+    }
+    case EPIMFieldBinary:
+    {
+        iValues[index]->SetBinaryValue(aFieldData.iBinaryValue);
+        break;
+    }
+    default:
+    {
+        __ASSERT_DEBUG(EFalse, User::Panic(KPIMPanicCategory,
+                                           EPIMPanicInvalidFieldType));
+        break;
+    }
+    }
+    iValues[index]->SetAttributes(aFieldData.iAttributes);
+    // Internal attributes must not be set by this functions because
+    // those may be overwriten if this is called from the Java-side
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::AddValueL
+// Adds new value to the value array. The index doesn't matter in this function
+// because the new values is appended to the end of the value array
+// ---------------------------------------------------------------------------
+//
+void CPIMField::AddValueL(const TPIMFieldData& aFieldData)
+{
+    JELOG2(EPim);
+    // In here, we don't care about the index of the new value
+    // thus it is added to the end of the value array
+    CPIMValueBase* newValue = NULL;
+    // Internal attributes must be set when item is created
+    CArrayFix<TUid>* internalAttrs = new(ELeave) CArrayFixFlat<TUid> (3);
+    CleanupStack::PushL(internalAttrs);
+
+    switch (aFieldData.FieldDataType())
+    {
+    case EPIMFieldInt:
+    {
+        newValue = CPIMIntValue::NewLC(aFieldData.Attributes(),
+                                       aFieldData.iIntegerBooleanValue);
+        iValues.AppendL(newValue);
+        break;
+    }
+    case EPIMFieldBoolean:
+    {
+        newValue = CPIMBooleanValue::NewLC(aFieldData.Attributes(),
+                                           aFieldData.iIntegerBooleanValue);
+        iValues.AppendL(newValue);
+        break;
+    }
+    case EPIMFieldDate:
+    {
+        newValue = CPIMDateValue::NewLC(aFieldData.Attributes(),
+                                        aFieldData.iDateValue);
+        iValues.AppendL(newValue);
+        break;
+    }
+    case EPIMFieldString:
+    {
+        newValue = CPIMStringValue::NewLC(aFieldData.Attributes(), NULL);
+        iValues.AppendL(newValue);
+        // Now it is safe to change the ownership of the value
+        newValue->SetStringValue(aFieldData.iStringValue);
+        break;
+    }
+    case EPIMFieldStringArray:
+    {
+        newValue = CPIMStringArrayValue::NewLC(aFieldData.Attributes(), NULL);
+        iValues.AppendL(newValue);
+        // Now it is safe to change the ownership of the value
+        newValue->SetStringArrayValue(aFieldData.iStringArrayValue);
+        break;
+    }
+    case EPIMFieldBinary:
+    {
+        newValue = CPIMBinaryValue::NewLC(aFieldData.Attributes(), NULL);
+        iValues.AppendL(newValue);
+        // Now it is safe to change the ownership of the value
+        newValue->SetBinaryValue(aFieldData.iBinaryValue);
+        break;
+    }
+    default:
+    {
+        __ASSERT_DEBUG(EFalse, User::Panic(KPIMPanicCategory,
+                                           EPIMPanicInvalidFieldType));
+        break;
+    }
+    }
+    // It is safe to pop newValue out of the cleanup stack
+    CleanupStack::Pop(2, internalAttrs);
+    // Apply internal attributes now
+    newValue->SetInternalAttributes(internalAttrs);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::ValueL
+// Fecthes a value from the value array. This function leaves with KErrNotFound
+// if the there is no such index in the value array
+// ---------------------------------------------------------------------------
+//
+const TPIMFieldData CPIMField::ValueL(const TInt aIndex) const
+{
+    JELOG2(EPim);
+    // Find that there is a value in the requested index
+    __ASSERT_ALWAYS(IsInRange(aIndex), User::Leave(KErrNotFound));
+
+    TPIMFieldData fieldData;
+    // Add non-value data
+    fieldData.iField = iField;
+    fieldData.iDataType = iFieldDataType;
+    fieldData.iAttributes = iValues[aIndex]->Attributes();
+
+    // Add specific data value to the data holder class
+    switch (iFieldDataType)
+    {
+    case EPIMFieldInt:
+    {
+        fieldData.iIntegerBooleanValue = iValues[aIndex]->IntValue();
+        break;
+    }
+    case EPIMFieldBoolean:
+    {
+        fieldData.iIntegerBooleanValue = iValues[aIndex]->BooleanValue();
+        break;
+    }
+    case EPIMFieldDate:
+    {
+        fieldData.iDateValue = iValues[aIndex]->DateValue();
+        break;
+    }
+    case EPIMFieldString:
+    {
+        fieldData.iStringValue = iValues[aIndex]->StringValue();
+        break;
+    }
+    case EPIMFieldStringArray:
+    {
+        fieldData.iStringArrayValue = iValues[aIndex]->StringArrayValue();
+        break;
+    }
+    case EPIMFieldBinary:
+    {
+        fieldData.iBinaryValue = iValues[aIndex]->BinaryValue();
+        break;
+    }
+    default:
+    {
+        __ASSERT_DEBUG(EFalse, User::Panic(KPIMPanicCategory,
+                                           EPIMPanicInvalidFieldType));
+        break;
+    }
+    }
+
+    return fieldData;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::RemoveValueL
+// Removes the specified value from the value array. If the requested index
+// is not found, KErrNotFound is returned
+// ---------------------------------------------------------------------------
+//
+void CPIMField::RemoveValueL(const TInt aIndex)
+{
+    JELOG2(EPim);
+    // Find that there is a value in the requested index
+    __ASSERT_ALWAYS(IsInRange(aIndex), User::Leave(KErrNotFound));
+    // Delete value and remove it from the value array
+    delete iValues[aIndex];
+    iValues.Remove(aIndex);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::CountValues
+// Returns the count of the values in this field
+// ---------------------------------------------------------------------------
+//
+TInt CPIMField::CountValues() const
+{
+    JELOG2(EPim);
+    return iValues.Count();
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::SetLabelL
+// Adds new label to this field
+// ---------------------------------------------------------------------------
+//
+void CPIMField::SetLabelL(const TInt aIndex, const TInt aArrayIndex,
+                          const TDesC& aLabel)
+{
+    JELOG2(EPim);
+    __ASSERT_DEBUG(IsInRange(aIndex), User::Panic(KPIMPanicCategory,
+                   EPIMPanicInvalidLabel));
+
+    // Get labels
+    CDesCArray* labelArray = iValues[aIndex]->Labels();
+    if (!labelArray)
+    {
+        TInt elementCount = iValues[aIndex]->NumElements();
+        labelArray = new(ELeave) CDesCArrayFlat(elementCount);
+        CleanupStack::PushL(labelArray);
+        // Fill array
+        for (TInt i = 0; i < elementCount; i++)
+        {
+            labelArray->AppendL(KPIMNullArrayElement());
+        }
+        labelArray->Delete(aArrayIndex);
+        labelArray->InsertL(aArrayIndex, aLabel);
+        iValues[aIndex]->SetLabels(labelArray);
+        CleanupStack::Pop(labelArray);
+    }
+    else
+    {
+        __ASSERT_DEBUG(aArrayIndex < labelArray->Count(), User::Panic(
+                           KPIMPanicCategory, EPIMPanicInvalidLabel));
+        labelArray->Delete(aArrayIndex);
+        labelArray->InsertL(aArrayIndex, aLabel);
+        // No need to do anything else because the array
+        // is owned by the value container class. Bad OOP
+        // practice but now it is the best workaround
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::LabelL
+// Retrieves a label from a specific index
+// ---------------------------------------------------------------------------
+//
+const TPtrC CPIMField::Label(const TInt aIndex, const TInt aArrayIndex) const
+{
+    JELOG2(EPim);
+    // Panic if the value index is incorrect
+    __ASSERT_DEBUG(IsInRange(aIndex), User::Panic(KPIMPanicCategory,
+                   EPIMPanicInvalidLabel));
+    // Get labels
+    CDesCArray* labelArray = iValues[aIndex]->Labels();
+    // Return null element descriptor if there is no such label
+    // This indicates that the label has not been set or something
+    // else is wrong.
+    if (!labelArray || (aArrayIndex >= labelArray->MdcaCount()))
+    {
+        return KPIMNullArrayElement();
+    }
+    return labelArray->MdcaPoint(aArrayIndex);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::DataType
+// Returns the data type of this field
+// ---------------------------------------------------------------------------
+//
+TPIMFieldDataType CPIMField::DataType() const
+{
+    JELOG2(EPim);
+    return iFieldDataType;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::FieldType
+// Returns the type of this field
+// ---------------------------------------------------------------------------
+//
+TPIMField CPIMField::FieldType() const
+{
+    JELOG2(EPim);
+    return iField;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::SetAttributesL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+void CPIMField::SetAttributesL(const TInt aIndex, TPIMAttribute aAttributes)
+{
+    JELOG2(EPim);
+    __ASSERT_ALWAYS(IsInRange(aIndex), User::Leave(KErrNotFound));
+    iValues[aIndex]->SetAttributes(aAttributes);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::AttributesL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+TPIMAttribute CPIMField::AttributesL(const TInt aIndex) const
+{
+    JELOG2(EPim);
+    __ASSERT_ALWAYS(IsInRange(aIndex), User::Leave(KErrNotFound));
+    return iValues[aIndex]->Attributes();
+}
+// ---------------------------------------------------------------------------
+// CPIMField::SetInternalAttributesL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+void CPIMField::SetInternalAttributesL(const TInt aIndex,
+                                       CArrayFix<TUid>* aInternalAttributes)
+{
+    JELOG2(EPim);
+    __ASSERT_ALWAYS(IsInRange(aIndex), User::Leave(KErrNotFound));
+    iValues[aIndex]->SetInternalAttributes(aInternalAttributes);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::InternalAttributesL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+const CArrayFix<TUid>& CPIMField::InternalAttributesL(const TInt aIndex) const
+{
+    JELOG2(EPim);
+    __ASSERT_ALWAYS(IsInRange(aIndex), User::Leave(KErrNotFound));
+    return iValues[aIndex]->InternalAttributes();
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::IsInRange
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+TBool CPIMField::IsInRange(const TInt aIndex) const
+{
+    JELOG2(EPim);
+    return (aIndex >= 0) && (aIndex < iValues.Count());
+}
+
+// ---------------------------------------------------------------------------
+// CPIMField::CPIMField
+// Default C++ constructor
+// ---------------------------------------------------------------------------
+//
+inline CPIMField::CPIMField(const TPIMFieldData& aFieldData) :
+        iField(aFieldData.Field()), iFieldDataType(aFieldData.FieldDataType())
+{
+    JELOG2(EPim);
+}
+
+// End of file