messagingfw/msgsrvnstore/server/src/CMsvChangeBuffer.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/server/src/CMsvChangeBuffer.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,162 @@
+// 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:
+//
+
+#include <e32base.h>
+#include "MSVPANIC.H"
+#include "CMsvChangeBuffer.h"
+
+
+//**********************************
+//CMsvChangeRecord
+//**********************************
+
+CMsvChangeRecord* CMsvChangeRecord::NewL(const TDesC8& aChange, TUint32 aNotifySequence)
+	{
+	CMsvChangeRecord* self = new(ELeave)CMsvChangeRecord(aNotifySequence);
+	CleanupStack::PushL(self);
+	self->ConstructL(aChange);
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CMsvChangeRecord::ConstructL(const TDesC8& aChange)
+	{
+	iChange = HBufC8::NewL(aChange.Length());
+	iChange->Des() = aChange;
+	}
+
+CMsvChangeRecord::~CMsvChangeRecord()
+	{
+	delete iChange;
+	}
+
+CMsvChangeRecord::CMsvChangeRecord(TUint32 aNotifySequence)
+: iNotifySequence(aNotifySequence)
+	{
+	}
+
+//**********************************
+//CMsvChangeBuffer
+//**********************************
+
+CMsvChangeBuffer* CMsvChangeBuffer::NewL()
+	{
+	CMsvChangeBuffer* self = new(ELeave) CMsvChangeBuffer();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CMsvChangeBuffer::CMsvChangeBuffer()
+	{
+	__DECLARE_NAME(_S("CMsvChangeBuffer"));
+	}
+
+CMsvChangeBuffer::~CMsvChangeBuffer()
+	{
+	if (iArray)
+		{
+		iArray->ResetAndDestroy();
+		delete iArray;
+		}
+	}
+
+void CMsvChangeBuffer::ConstructL()
+	{
+	iArray = new (ELeave) CArrayPtrFlat<CMsvChangeRecord>(KMsvChangeBufferGranularity);
+	CMsvChangeRecord* ptr = NULL;
+	iArray->ResizeL(KMsvChangeBufferSize, ptr);
+	}
+
+void CMsvChangeBuffer::InL(const TDesC8& aChange)
+//
+// Inserts an entry into the FIFO buffer.
+// 
+	{
+	iNotifySequence++;
+	CMsvChangeRecord* record = CMsvChangeRecord::NewL(aChange, iNotifySequence);
+	iArray->At(iInPos++) = record;
+	
+	// Check if we've run past the end of the array.  If so, wrap around.
+	if (iInPos==iArray->Count())
+		iInPos=0;
+	
+	// Check if we've run out of space in the array
+	if (iInPos==iOutPos)
+		{
+		// Attempt to grow the array
+		TRAPD(ret, GrowArrayL());
+		if (ret != KErrNone)
+			// Error - possibly out of memory.
+			// Delete the last entry and rollback the iInPos variable to ensure
+			//  class is in a valid state.
+			{
+			delete record;
+			// If iInPos is not 0, subtract 1 from it,
+			//  else set it back to Count-1
+			iInPos = (iInPos ? iInPos-1 : iArray->Count()-1);
+			User::Leave(ret);
+			}
+		}
+	}
+
+const TDesC8& CMsvChangeBuffer::Next(TUint32& aNotifySequence)
+//
+// Returns the next entry from the FIFO buffer
+//
+	{
+	__ASSERT_ALWAYS(iOutPos!=iInPos,PanicServer(EMsvChangeBufferEmpty));
+	CMsvChangeRecord* record = iArray->At(iOutPos);
+	aNotifySequence = record->NotifySequence();
+	return record->Change();
+	}
+
+
+void CMsvChangeBuffer::Out()
+//
+// Removes the next entry from the queue
+//
+	{
+	__ASSERT_ALWAYS(iOutPos!=iInPos,PanicServer(EMsvChangeBufferEmpty));
+	delete iArray->At(iOutPos);
+	iArray->At(iOutPos++) = NULL;
+	if (iOutPos==iArray->Count())
+		{
+		iOutPos=0;
+		ShrinkArray();
+		}
+	}
+
+void CMsvChangeBuffer::ShrinkArray()
+//
+// Shrinks the array if possible
+//
+	{
+	while ((iArray->Count()-iInPos)>KMsvChangeBufferGranularity)
+		iArray->Delete(iInPos,KMsvChangeBufferGranularity);
+	}
+	
+void CMsvChangeBuffer::GrowArrayL()
+//
+// Grows the array
+// Can leave with OOM
+//
+	{
+	CMsvChangeRecord* ptr=NULL;
+	iArray->InsertL(iOutPos, ptr, KMsvChangeBufferGranularity);
+	iOutPos+=KMsvChangeBufferGranularity;
+	}
+