pimappsupport/vcardandvcal/src/VersitAdditionalStorage.cpp
author William Roberts <williamr@symbian.org>
Sun, 14 Mar 2010 13:09:26 +0000
branchCompilerCompatibility
changeset 11 7d78dc22f397
parent 0 f979ecb2b13e
permissions -rw-r--r--
Automatic merge from PDK_3.0.h

// Copyright (c) 1997-2009 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:
//

#include "VersitAdditionalStorage.h"
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
#include "versit_internal.h"
#endif

// User includes
#include <versit.h>

// Constants
const TInt KVersitAdditionalStorageArrayGranularity = 2;

class TVersitAdditionalStorageItem
/** 
@internalComponent
@released
*/
    {
public:
    inline TVersitAdditionalStorageItem(const TAny* aKey, CBase* aValue)
    :   iKey(aKey), iValue(aValue)
        {
        }

public:
    const TAny* iKey;
    CBase* iValue;
    };




CVersitAdditionalStorage::CVersitAdditionalStorage()
:   iStorage(KVersitAdditionalStorageArrayGranularity)
    {
    }


CVersitAdditionalStorage::~CVersitAdditionalStorage()
    {
    const TInt count = iStorage.Count();
    for(TInt i=0; i<count; i++)
        {
        TVersitAdditionalStorageItem& item = iStorage[i];
        delete item.iValue;
        }
    iStorage.Close();
    }


CVersitAdditionalStorage* CVersitAdditionalStorage::NewL()
    {
    return new(ELeave) CVersitAdditionalStorage();
    }


void CVersitAdditionalStorage::AddToStorageL(const TAny* aKey, CBase* aValue)
    {
    __ASSERT_ALWAYS(aValue != NULL, Panic(EVersitPanicNullValueAssignedToAdditionalStorageSlot));

    // Check if an additional value has already been stored for this item
    CBase* value = FromStorage(aKey);
    __ASSERT_ALWAYS(value == NULL, Panic(EVersitPanicAdditionalStorageSlotAlreadyInUse));

    // Create new item
    TVersitAdditionalStorageItem newItem(aKey, aValue);
    User::LeaveIfError(iStorage.Append(newItem));
    }


CBase* CVersitAdditionalStorage::FromStorage(const TAny* aKey)
    {
    CBase* value = NULL;
    TInt index = KErrNotFound;
    TVersitAdditionalStorageItem* item = ItemByKey(aKey, index);
    if  (item)
        {
        value = item->iValue;
        }
    return value;
    }

void CVersitAdditionalStorage::FreeStorage(const TAny* aKey)
    {
    TInt index = KErrNotFound;
    TVersitAdditionalStorageItem* item = ItemByKey(aKey, index);
    if  (item)
        {
        delete item->iValue;
        iStorage.Remove(index);
        }
    }

TVersitAdditionalStorageItem* CVersitAdditionalStorage::ItemByKey(const TAny* aKey, TInt& aIndex)
    {
    TVersitAdditionalStorageItem* foundItem = NULL;
    TVersitAdditionalStorageItem searchFor(aKey, NULL);
    TIdentityRelation<TVersitAdditionalStorageItem> relation(ItemsMatch);
    //
    aIndex = iStorage.Find(searchFor, relation);
    if  (aIndex >= 0)
        {
        foundItem = &iStorage[aIndex];
        }
    //
    return foundItem;
    }

TBool CVersitAdditionalStorage::ItemsMatch(const TVersitAdditionalStorageItem& aLeft, const TVersitAdditionalStorageItem& aRight)
    {
    return aLeft.iKey == aRight.iKey;
    }