diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SigComp/SigCompEngine/src/SigCompCompartmentStatesHolder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SigComp/SigCompEngine/src/SigCompCompartmentStatesHolder.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,141 @@ +// Copyright (c) 2003-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: +// Name : SigCompCompartmentStatesHolder.cpp +// Part of : SigComp +// SigComp API frontend +// Version : 1.0 +// + + + +// INCLUDE FILES +#include "Sigcomp.h" +#include "StateMgr.h" +#include "SigCompCompartmentStatesHolder.h" + + +// ============================ MEMBER FUNCTIONS ============================== + +CSigCompCompartmentStatesHolder::CSigCompCompartmentStatesHolder( + CStateMgr& aStateMgr, + CSigComp::TMemorySize aStateMemorySize) + { + + iStateMgr = &aStateMgr; + iStateMemorySize = aStateMemorySize; + iStateMemoryUsed = 0; + } + +// Destructor +EXPORT_C CSigCompCompartmentStatesHolder::~CSigCompCompartmentStatesHolder() + { + + TInt csiNum = iCompartmentStateItems.Count(); + for (TInt i = 0; i < csiNum; i++) + { + TStateItem* si = iCompartmentStateItems[i].iStateItem; + iStateMgr->ReclaimStateItem(si); + } + + iCompartmentStateItems.Close(); + + iStateMgr = NULL; + } + + +// ---------------------------------------------------------------------------- +// CSigCompCompartmentStatesHolder::AddStateItemL +// add new state to compartment +// ---------------------------------------------------------------------------- +// + +TBool CSigCompCompartmentStatesHolder::AddStateItemL(TStateItem* aStateItem, + TUint16 aStateRetentionPriority) + { + + TInt csiNum = iCompartmentStateItems.Count(); + + for (TInt i = 0; i < csiNum; i++) + { + if (iCompartmentStateItems[i].iStateItem == aStateItem) + { + return EFalse; + } + } + + while ((iStateMemoryUsed+aStateItem->iStateLength+64) > + static_cast(iStateMemorySize)) + { + TInt j = -1; + csiNum = iCompartmentStateItems.Count(); + for (TInt i = 0; i < csiNum; i++) + { + if (j < 0) + { + j = i; + } + else + { + TUint srp1 = iCompartmentStateItems[i].iStateRetentionPriority; + TUint srp2 = iCompartmentStateItems[j].iStateRetentionPriority; + if (srp1 < srp2) + { + j = i; + } + } + } + + RemoveStateItemL(j); + } + + TCompartmentStateItem csi; + csi.iStateItem = aStateItem; + csi.iStateRetentionPriority = aStateRetentionPriority; + + User::LeaveIfError(iCompartmentStateItems.Append(csi)); + iStateMemoryUsed += (aStateItem->iStateLength + 64); + + return ETrue; + } + + +// ---------------------------------------------------------------------------- +// CSigCompCompartmentStatesHolder::RemoveStateItemL +// remove state from compartment +// ---------------------------------------------------------------------------- +// + +void CSigCompCompartmentStatesHolder::RemoveStateItemL( + TStateItem* aStateItem) + { + + TInt csiNum = iCompartmentStateItems.Count(); + for (TInt i = 0; i < csiNum; i++) + { + if (iCompartmentStateItems[i].iStateItem == aStateItem) + { + RemoveStateItemL(i); + } + } + } + + +void CSigCompCompartmentStatesHolder::RemoveStateItemL(TInt aStateItemIndex) + { + + TStateItem* si = iCompartmentStateItems[aStateItemIndex].iStateItem; + iStateMemoryUsed -= (si->iStateLength + 64); + iStateMgr->ReclaimStateItem(si); + iCompartmentStateItems.Remove(aStateItemIndex); + }