javaextensions/pim/framework/src.s60/cpimitemdata.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/pim/framework/src.s60/cpimitemdata.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,417 @@
+/*
+* 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 item data
+ *
+*/
+
+
+// CLASS HEADER
+#include "cpimitemdata.h"
+
+// INTERNAL INCLUDES
+#include "cpimfield.h"
+#include "pimpanics.h"
+#include "logger.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPIMItemData::~CPIMItemData()
+{
+    JELOG2(EPim);
+    delete iCategories;
+    iFields.ResetAndDestroy();
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::NewL
+// Default two-phase constructor
+// ---------------------------------------------------------------------------
+//
+CPIMItemData* CPIMItemData::NewL()
+{
+    JELOG2(EPim);
+    CPIMItemData* self = CPIMItemData::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::NewLC
+// Default two-phase constructor. The newly created object is left to the
+// cleanup stack
+// ---------------------------------------------------------------------------
+//
+CPIMItemData* CPIMItemData::NewLC()
+{
+    JELOG2(EPim);
+    CPIMItemData* self = new(ELeave) CPIMItemData();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::SetValueL
+// Sets new value for a specific field value in a specific index. This method
+// leaves if there is no such field or field index. Also, this panics if the
+// new value field type is not the same as the previous one
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::SetValueL(const TPIMFieldData& aFieldData)
+{
+    JELOG2(EPim);
+    // Get the data from the holder class
+    TInt index = FieldIndex(aFieldData.Field());
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+
+    __ASSERT_DEBUG(aFieldData.FieldDataType() == iFields[index]->DataType(),
+                   User::Panic(KPIMPanicCategory, EPIMPanicInvalidFieldType));
+
+    iFields[index]->SetValueL(aFieldData);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::AddValueL
+// Adds new value for the field. New field is generated if there is no existing
+// field (i.e this is the first value which is added to this field
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::AddValueL(const TPIMFieldData& aFieldData)
+{
+    JELOG2(EPim);
+    // Check that if there is already a field of this type
+    TInt index = FieldIndex(aFieldData.Field());
+    if (index != KErrNotFound)
+    {
+        __ASSERT_DEBUG(
+            aFieldData.FieldDataType() == iFields[index]->DataType(),
+            User::Panic(KPIMPanicCategory, EPIMPanicInvalidFieldType));
+        iFields[index]->AddValueL(aFieldData);
+    }
+    // Generate new field
+    else
+    {
+        CPIMField* newField = CPIMField::NewLC(aFieldData);
+        iFields.AppendL(newField);
+        // Add new value to item and prepare for an error
+        TRAPD(err, newField->AddValueL(aFieldData));
+        if (err != KErrNone)
+        {
+            // The array must be returned to state that it was before this
+            // function call to ensure leave safe function
+            TInt entryIndex = iFields.Find(newField);
+            iFields.Remove(entryIndex);
+            User::Leave(err);
+        }
+        CleanupStack::Pop(newField);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::ValueL
+// Fetches a Value a specifc index of the requested field
+// ---------------------------------------------------------------------------
+//
+const TPIMFieldData CPIMItemData::ValueL(const TPIMField aField,
+        const TInt aIndex) const
+{
+    JELOG2(EPim);
+    const TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    return iFields[index]->ValueL(aIndex);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::RemoveValueL
+// Removes a specific value of a specific field.
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::RemoveValueL(const TPIMField aField, const TInt aIndex)
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    iFields[index]->RemoveValueL(aIndex);
+    // Remove field if this was the last value
+    if (iFields[index]->CountValues() == 0)
+    {
+        // Remove object from array and delete it
+        delete iFields[index];
+        iFields.Remove(index);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::CountValues
+// Counts the values in the requested field
+// ---------------------------------------------------------------------------
+//
+TInt CPIMItemData::CountValues(const TPIMField aField) const
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    if (index != KErrNotFound)
+    {
+        return iFields[index]->CountValues();
+    }
+    // Else return zero
+    return 0;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::FieldsL
+// Returns fields that currently have more than zero values. The returned
+// array is left to the cleanup stack
+// ---------------------------------------------------------------------------
+//
+CArrayFix<TPIMField>* CPIMItemData::FieldsLC() const
+{
+    JELOG2(EPim);
+    CArrayFixFlat<TPIMField>* fields =
+        new(ELeave) CArrayFixFlat<TPIMField> (5);
+    CleanupStack::PushL(fields);
+
+    TInt fieldCount = iFields.Count();
+    for (TInt i = 0; i < fieldCount; i++)
+    {
+        fields->AppendL(iFields[i]->FieldType());
+    }
+    return fields;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::SetLabelL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::SetLabelL(const TPIMField aField, const TInt aIndex,
+                             const TInt aArrayIndex, const TDesC& aLabel)
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    iFields[index]->SetLabelL(aIndex, aArrayIndex, aLabel);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::LabelL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+const TPtrC CPIMItemData::LabelL(const TPIMField aField, const TInt aIndex,
+                                 const TInt aArrayIndex) const
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    return iFields[index]->Label(aIndex, aArrayIndex);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::Reset
+// Resets the item data. All fields and categories are removed
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::Reset()
+{
+    JELOG2(EPim);
+    iCategories->Reset();
+    iFields.ResetAndDestroy();
+    // All data is now deleted but the arrays are ready for reuse. see
+    // documentation of RPointerArrray and CDesCArray.
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::SetAttributesL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::SetAttributesL(const TPIMField aField, const TInt aIndex,
+                                  TPIMAttribute aAttributes)
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    iFields[index]->SetAttributesL(aIndex, aAttributes);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::LabelL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+TInt CPIMItemData::AttributesL(const TPIMField aField, const TInt aIndex) const
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    return iFields[index]->AttributesL(aIndex);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::SetInternalAttributesL
+// Sets internal attributes for a specific field and index. Internal
+// attributes are not visible from the Java-side so this function provides
+// the only access to set internal attributes to an item
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::SetInternalAttributesL(const TPIMField aField,
+        const TInt aIndex, CArrayFix<TUid>* aInternalAttributes)
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    iFields[index]->SetInternalAttributesL(aIndex, aInternalAttributes);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::InternalAttributes
+// Gets internal attributes for a specific field and index. Internal
+// attributes are not visible from the Java-side so this function provides
+// the only access to get internal attributes to an item
+// ---------------------------------------------------------------------------
+//
+const CArrayFix<TUid>& CPIMItemData::InternalAttributesL(
+    const TPIMField aField, const TInt aIndex) const
+{
+    JELOG2(EPim);
+    TInt index = FieldIndex(aField);
+    // Leave with KErrNotFound if there is no requested field
+    __ASSERT_ALWAYS(index != KErrNotFound, User::Leave(index));
+    return iFields[index]->InternalAttributesL(aIndex);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::FindCategory
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+TInt CPIMItemData::FindCategory(const TDesC& aCategoryName) const
+{
+    JELOG2(EPim);
+    TInt index(0);
+    if (iCategories->Find(aCategoryName, index, ECmpNormal) == 0)
+    {
+        return index;
+    }
+    return KErrNotFound;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::AddNewCategoryL
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+void CPIMItemData::AddNewCategoryL(const TDesC& aCategoryName)
+{
+    JELOG2(EPim);
+    iCategories->AppendL(aCategoryName);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::RemoveCategory
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+TBool CPIMItemData::RemoveCategory(const TDesC& aCategoryName)
+{
+    JELOG2(EPim);
+    TInt index = FindCategory(aCategoryName);
+    if (index != KErrNotFound)
+    {
+        iCategories->Delete(index);
+        return ETrue;
+    }
+    return EFalse;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::Categories
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+const CDesCArray& CPIMItemData::Categories() const
+{
+    JELOG2(EPim);
+    return *iCategories;
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::HasField
+// Other items were commented in the header
+// ---------------------------------------------------------------------------
+//
+TBool CPIMItemData::HasField(const TPIMField aField) const
+{
+    JELOG2(EPim);
+    return (FieldIndex(aField) != KErrNotFound);
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::CPIMItemData
+// Default C++ constructor
+// ---------------------------------------------------------------------------
+//
+inline CPIMItemData::CPIMItemData()
+{
+    JELOG2(EPim);
+    // Nothing to do at the moment...
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::ConstructL
+// Default second phase constuctor. Does the leaving operations in item
+// construction procedure
+// ---------------------------------------------------------------------------
+//
+inline void CPIMItemData::ConstructL()
+{
+    JELOG2(EPim);
+    iCategories = new(ELeave) CDesCArrayFlat(5);  // Array granularity
+}
+
+// ---------------------------------------------------------------------------
+// CPIMItemData::FindField
+// Searches requested field type. If there is no such field, KErrNotFound is
+// returned
+// ---------------------------------------------------------------------------
+//
+TInt CPIMItemData::FieldIndex(const TPIMField aField) const
+{
+    JELOG2(EPim);
+    TInt count = iFields.Count();
+    for (TInt i = 0; i < count; i++)
+    {
+        if (iFields[i]->FieldType() == aField)
+        {
+            return i;
+        }
+    }
+    return KErrNotFound;
+}
+
+// End of file