diff -r f5050f1da672 -r 04becd199f91 javaextensions/pim/framework/src.s60/cpimitemdata.cpp --- /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* CPIMItemData::FieldsLC() const +{ + JELOG2(EPim); + CArrayFixFlat* fields = + new(ELeave) CArrayFixFlat (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* 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& 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