PECengine/ListLibrary2/ContactListSrc/CPEngContactListProperty.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListProperty.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,611 @@
+/*
+* Copyright (c) 2005 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:  Property manager and value container
+*
+*/
+
+//  INCLUDES
+#include    "CPEngContactListProperty.h"
+#include    "PEngStorageGlobals.h"
+#include    "MPEngContactListProperties.h"
+#include    "MPEngContactItem.h"
+#include    <e32base.h>
+#include    <s32strm.h>
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::GetProperty()
+// -----------------------------------------------------------------------------
+//
+TInt PEngPropertyManager::GetProperty(
+    const RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    TInt& aValue )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel, ETInt ) );
+    if ( x == KErrNotFound )
+        {
+        return KErrNotFound;
+        }
+
+    aValue = aProperties[ x ]->ValueInt();
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::GetProperty()
+// -----------------------------------------------------------------------------
+//
+TInt PEngPropertyManager::GetProperty(
+    const RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    TPtrC8& aValue )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel, EDes8 ) );
+    if ( x == KErrNotFound )
+        {
+        return KErrNotFound;
+        }
+
+    aValue.Set( aProperties[ x ]->ValueDes8() );
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::GetProperty()
+// -----------------------------------------------------------------------------
+//
+TInt PEngPropertyManager::GetProperty(
+    const RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    TPtrC16& aValue )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel, EDes16 ) );
+    if ( x == KErrNotFound )
+        {
+        return KErrNotFound;
+        }
+
+    aValue.Set( aProperties[ x ]->ValueDes16() );
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::PropertyOrZero()
+// -----------------------------------------------------------------------------
+//
+TInt PEngPropertyManager::PropertyOrZero(
+    const RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel ) );
+    if ( x == KErrNotFound )
+        {
+        return 0; // zero as default value
+        }
+
+    return aProperties[ x ]->ValueInt();
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::SetPropertyL()
+// -----------------------------------------------------------------------------
+//
+void PEngPropertyManager::SetPropertyL(
+    RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    TInt aValue,
+    TInt& aSize )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel ) );
+    if ( x == KErrNotFound )
+        {
+        // does not exists yet, create it
+        CPEngContactListProperty* prop = CPEngContactListProperty::NewLC( aName,
+                                                                          aLevel );
+        prop->SetValue( aValue );
+        aProperties.AppendL( prop );
+        CleanupStack::Pop( prop );
+        aSize += prop->EntrySize();
+        }
+
+    else
+        {
+        aProperties[ x ]->SetValue( aValue );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::SetPropertyL()
+// -----------------------------------------------------------------------------
+//
+void PEngPropertyManager::SetPropertyL(
+    RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    const TDesC8& aValue,
+    TInt& aSize )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel ) );
+    if ( x == KErrNotFound )
+        {
+        // does not exists yet, create it
+        CPEngContactListProperty* prop = CPEngContactListProperty::NewLC( aName,
+                                                                          aLevel );
+        prop->SetValueL( aValue );
+        aProperties.AppendL( prop );
+        CleanupStack::Pop( prop );
+        aSize += prop->EntrySize();
+        }
+    else
+        {
+        TInt dif( aProperties[ x ]->EntrySize() );
+        aProperties[ x ]->SetValueL( aValue );
+        dif -= aProperties[ x ]->EntrySize();
+        aSize += dif;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::SetPropertyL()
+// -----------------------------------------------------------------------------
+//
+void PEngPropertyManager::SetPropertyL(
+    RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    const TDesC16& aValue,
+    TInt& aSize )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel ) );
+    if ( x == KErrNotFound )
+        {
+        // does not exists yet, create it
+        CPEngContactListProperty* prop = CPEngContactListProperty::NewLC( aName,
+                                                                          aLevel );
+        prop->SetValueL( aValue );
+        aProperties.AppendL( prop );
+        CleanupStack::Pop( prop );
+        aSize += prop->EntrySize();
+        }
+    else
+        {
+        TInt dif( aProperties[ x ]->EntrySize() );
+        aProperties[ x ]->SetValueL( aValue );
+        dif -= aProperties[ x ]->EntrySize();
+        aSize += dif;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::DeletePropertyL()
+// -----------------------------------------------------------------------------
+//
+TBool PEngPropertyManager::DeletePropertyL(
+    RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    TInt& aSize )
+    {
+    TInt x( FindProperty( aProperties, aName, aLevel ) );
+    if ( x != KErrNotFound )
+        {
+        aSize -= aProperties[ x ]->EntrySize();
+        delete aProperties[ x ];
+        aProperties.Remove( x );
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::FindProperty()
+// -----------------------------------------------------------------------------
+//
+TInt PEngPropertyManager::FindProperty(
+    const RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel )
+    {
+    TInt count( aProperties.Count() );
+    for ( TInt x( 0 ) ; x < count  ; ++x )
+        {
+        if ( ( aProperties[ x ]->Name() == aName ) &&
+             ( aProperties[ x ]->Level() == aLevel ) )
+            {
+            return x;
+            }
+        }
+
+    return KErrNotFound;
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::FindProperty()
+// -----------------------------------------------------------------------------
+//
+TInt PEngPropertyManager::FindProperty(
+    const RPointerArray<CPEngContactListProperty>& aProperties,
+    TUint aName,
+    TUint aLevel,
+    TPEngPropertyType aType )
+    {
+    TInt index( FindProperty( aProperties, aName, aLevel ) );
+    if ( index != KErrNotFound )
+        {
+        if ( aProperties[ index ]->ValidateType( aType ) )
+            {
+            return index;
+            }
+
+        return KErrNotFound;
+        }
+
+    return KErrNotFound;
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::ExternalizePropertiesL()
+// -----------------------------------------------------------------------------
+//
+void PEngPropertyManager::ExternalizePropertiesL(
+    const RPointerArray<CPEngContactListProperty>& aProperties,
+    RWriteStream& aStream,
+    TInt aStoreType )
+    {
+    TInt count( aProperties.Count() );
+    for ( TInt i( 0 ) ; i < count  ; ++i )
+        {
+        aProperties[ i ]->ExternalizeL( aStream, aStoreType );
+        }
+
+    // mark
+    aStream.WriteInt32L( KErrNotFound );
+    }
+
+
+// -----------------------------------------------------------------------------
+// PEngPropertyManager::InternalizePropertiesL()
+// -----------------------------------------------------------------------------
+//
+void PEngPropertyManager::InternalizePropertiesL(
+    RPointerArray<CPEngContactListProperty>& aProperties,
+    RReadStream& aStream,
+    TInt& aSize )
+    {
+    // size of one number, marker for each property
+    aSize += 4;
+
+    while ( KErrNotFound != aStream.ReadInt32L() )
+        {
+        CPEngContactListProperty* prop =
+            CPEngContactListProperty::NewLC( aStream );
+        aProperties.AppendL( prop );
+        CleanupStack::Pop(); // prop
+        // before each property is validation number, size 4
+        aSize += ( prop->EntrySize() + 4 );
+        }
+    }
+
+
+
+// ===============CPEngContactListProperty MEMBER FUNCTIONS ====================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::CPEngContactListManager()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListProperty::CPEngContactListProperty()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::NewLC()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListProperty* CPEngContactListProperty::NewLC( TUint aName,
+                                                           TUint aLevel )
+    {
+    CPEngContactListProperty* self = new( ELeave ) CPEngContactListProperty();
+    CleanupStack::PushL( self );
+    self->iName = aName;
+    self->iLevel = aLevel;
+
+    //Validate the given level
+    StorageTypeForLevelL( aLevel );
+
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::NewLC()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListProperty* CPEngContactListProperty::NewLC( RReadStream& aStream )
+    {
+    CPEngContactListProperty* self = new( ELeave ) CPEngContactListProperty;
+    CleanupStack::PushL( self );
+    self->InternalizeL( aStream );
+    return self;
+    }
+
+
+// Destructor
+CPEngContactListProperty::~CPEngContactListProperty()
+    {
+    delete iTDes16Value;
+    delete iTDes8Value;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::Name()
+// -----------------------------------------------------------------------------
+//
+TUint CPEngContactListProperty::Name() const
+    {
+    return iName;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::Level()
+// -----------------------------------------------------------------------------
+//
+TUint CPEngContactListProperty::Level() const
+    {
+    return iLevel;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::ValueInt()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListProperty::ValueInt() const
+    {
+    return iTIntValue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::ValueDes16()
+// -----------------------------------------------------------------------------
+//
+const TDesC16& CPEngContactListProperty::ValueDes16() const
+    {
+    return *iTDes16Value;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::ValueDes8()
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CPEngContactListProperty::ValueDes8() const
+    {
+    return *iTDes8Value;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::SetValueL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListProperty::SetValue( TUint aValue )
+    {
+    iTIntValue = aValue;
+    iTIntValueValid = ETrue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::SetValueL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListProperty::SetValueL( const TDesC16& aValue )
+    {
+    HBufC16*    temp = aValue.AllocL();
+    delete iTDes16Value;
+    iTDes16Value = temp;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::SetValueL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListProperty::SetValueL( const TDesC8& aValue )
+    {
+    HBufC8* temp = aValue.AllocL();
+    delete iTDes8Value;
+    iTDes8Value = temp;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::ValidateType()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngContactListProperty::ValidateType( TPEngPropertyType aType ) const
+    {
+    switch ( aType )
+        {
+        case ETInt:
+            {
+            return iTIntValueValid;
+            }
+
+
+        case EDes8:
+            {
+            return reinterpret_cast< TInt > ( iTDes8Value );
+            }
+
+
+        case EDes16:
+            {
+            return reinterpret_cast< TInt > ( iTDes16Value );
+            }
+
+        default:
+            {
+            return EFalse;
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::ExternalizeL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListProperty::ExternalizeL( RWriteStream& aStream,
+                                             TInt aType ) const
+    {
+    if ( StorageTypeForLevelL( iLevel ) != aType )
+        {
+        // nothing to store, type and level do not match
+        return;
+        }
+
+
+    //Mark start
+    aStream.WriteInt32L( KErrNone );
+    aStream.WriteUint32L( iName );
+    aStream.WriteUint32L( iLevel );
+
+
+    //Int value
+    aStream.WriteInt32L( iTIntValue );
+    aStream.WriteInt32L( iTIntValueValid );
+
+
+    //16 bit desc
+    if ( iTDes16Value )
+        {
+        aStream.WriteInt32L( iTDes16Value->Length() );
+        aStream << *iTDes16Value;
+        }
+    else
+        {
+        aStream.WriteInt32L( 0 ); // zero length of the buffer
+        }
+
+
+    //8 bit desc
+    if ( iTDes8Value )
+        {
+        aStream.WriteInt32L( iTDes8Value->Length() );
+        aStream << *iTDes8Value;
+        }
+    else
+        {
+        aStream.WriteInt32L( 0 ); // zero length of the buffer
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::EntrySize()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListProperty::EntrySize()
+    {
+    // 24 for storing 6 32bits numbers
+    return 24 + ( iTDes16Value ? iTDes16Value->Length() : 0 )
+           + ( iTDes8Value ? iTDes8Value->Length() : 0 );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::InternalizeL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListProperty::InternalizeL( RReadStream& aStream )
+    {
+    // mark read outside
+    iName = aStream.ReadUint32L();
+    iLevel = aStream.ReadUint32L();
+    iTIntValue = aStream.ReadInt32L();
+    iTIntValueValid = aStream.ReadInt32L();
+
+    // read buffers
+    delete iTDes16Value;
+    iTDes16Value = NULL;
+    TInt size( aStream.ReadInt32L() );
+    if ( size != 0 )
+        {
+        iTDes16Value = HBufC16::NewL( aStream, size );
+        }
+
+    delete iTDes8Value;
+    iTDes8Value = NULL;
+    size = aStream.ReadInt32L();
+    if ( size != 0 )
+        {
+        iTDes8Value = HBufC8::NewL( aStream, size );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListProperty::StorageTypeForLevelL()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListProperty::StorageTypeForLevelL( TUint aLevel )
+    {
+    if ( ( aLevel == KPEngCntLstPropertyNativePermanent ) ||
+         ( aLevel == KPEngCntLstPropertyExternalPermanent ) ||
+         ( aLevel == KPEngCntItemPropertyNativePermanent ) ||
+         ( aLevel == KPEngCntItemPropertyExternalPermanent ) )
+        {
+        return EPEngStorageBasicPermanent;
+        }
+
+    if ( ( aLevel == KPEngCntLstPropertyNativeCached ) ||
+         ( aLevel == KPEngCntLstPropertyExternalCached ) ||
+         ( aLevel == KPEngCntItemPropertyNativeCached ) ||
+         ( aLevel == KPEngCntItemPropertyExternalCached ) )
+        {
+        return EPEngStorageBasicCached;
+        }
+
+    User::Leave( KErrUnknown );
+    return EPEngStorageBasicTemporary;
+    }
+
+
+// end of file
+