servicediscoveryandcontrol/pnp/test/upnp/chunkmgr/src/rmemchunk.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/chunkmgr/src/rmemchunk.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,232 @@
+ // Copyright (c) 2008-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:
+// @file
+// @internalComponent
+// 
+//
+
+#include <e32base.h>
+#include "rmemcell.h"
+#include "rmemchunk.h"
+
+EXPORT_C TInt RMemChunk::Alloc ( TInt aSize, RMemoryAllocator& aAllocator )
+	{
+	if ( aSize == 0 )
+		{
+		return KErrNone;
+		}
+		
+	__ASSERT_ALWAYS ( iNextCell == NULL, User::Invariant () ); //TODO
+	iNextCell = aAllocator.ChunkManager ()->Alloc ( aSize );
+	return iNextCell == NULL ? KErrNoMemory : KErrNone;
+	}
+	
+EXPORT_C void RMemChunk::CreateL ( const TDesC8& aDes, RMemoryAllocator& aAllocator )
+	{
+	User::LeaveIfError ( Create ( aDes, aAllocator ) );
+	}
+	
+EXPORT_C TInt RMemChunk::Create ( const TDesC8& aDes, RMemoryAllocator& aAllocator )
+	{
+	TInt err = Alloc ( aDes.Length (), aAllocator );
+	if ( err == KErrNone )
+		{
+		// copy descriptor to the memchunk allocated.
+		CopyIn(aDes);
+		}
+	return  err;
+	}
+	
+EXPORT_C void RMemChunk::Free ()
+	{
+	if ( iNextCell )
+		iNextCell->Free ();
+	iNextCell = NULL;
+	}
+
+EXPORT_C void RMemChunk::CopyIn(const TDesC8& aDes, TInt aOffset)
+	{
+	__ASSERT_ALWAYS(iNextCell!=NULL, User::Invariant ());
+	__ASSERT_ALWAYS(aOffset>=0, User::Invariant ());
+
+	TUint8* ptr = (TUint8*)aDes.Ptr();
+	TInt len = aDes.Length();
+
+	TInt n;
+	RMemCell* m=iNextCell;
+
+	while (len>0 && m!=NULL)
+		{
+		n = len > m->Length() ? m->Length() : len;
+		Mem::Copy(m->Ptr(), ptr, n);
+		ptr += n;
+		len -= n;
+		m = m->Next();
+		}
+	}
+
+EXPORT_C void RMemChunk::CopyOut(TDes8& aDes, TInt aOffset) const
+	{
+	__ASSERT_ALWAYS(aOffset>=0, User::Invariant ());
+
+	TUint8* ptr = (TUint8*)aDes.Ptr();
+	TInt len = aDes.Length();
+
+	TInt n;
+	RMemCell* m = iNextCell;
+	
+	while (len>0 && m!=NULL)
+		{
+		n = len > m->Length() ? m->Length() : len;
+		Mem::Copy(ptr, m->Ptr(), n);
+		ptr += n;
+		len -= n;
+		m = m->Next();
+		}
+	aDes.SetLength(ptr-aDes.Ptr());
+	}
+
+
+
+EXPORT_C TBool RMemChunk::Goto(TInt anOffset, RMemCell* &resBuf, TInt& resOffset, TInt& resLength, RMemCell* &resPrevBuf) const
+	{
+	__ASSERT_ALWAYS(iNextCell!=NULL, User::Invariant ());
+	__ASSERT_ALWAYS(anOffset>=0, User::Invariant ());
+
+	TInt o = 0;
+	RMemCell* p = NULL, *m = iNextCell;
+
+	while (m!=NULL)
+		{
+		if (o + m->Length() > anOffset)
+			{
+			resBuf = m;
+			resOffset = (anOffset - o) + m->Offset();
+			resLength = m->Length() - (anOffset - o);
+			resPrevBuf = p;
+			return ETrue;
+			}
+		o += m->Length();
+		p = m;
+		m = m->Next();
+		}
+
+	__ASSERT_ALWAYS(o==anOffset, User::Invariant ());
+	return EFalse;
+	}
+
+EXPORT_C TInt RMemChunk::Length() const
+	{
+	TInt len = 0;
+	RMemCell* m;
+	for (m = iNextCell; m!=NULL; m = m->Next())
+		len += m->Length();
+
+	return len;
+	}
+
+EXPORT_C void RMemChunk::TrimStart(TInt anOffset)
+	{
+	__ASSERT_ALWAYS(iNextCell!=NULL, User::Invariant ());
+	__ASSERT_ALWAYS(anOffset>=0, User::Invariant ());
+
+	if (anOffset==0)
+		return;
+
+	RMemCell* m, *p;
+	TInt o, n;
+	if (!Goto(anOffset, m, o, n, p))
+		{
+		Free();
+		return;
+		}
+
+	if (p!=NULL) 
+		{
+		p->Unlink();
+		iNextCell->Free();
+
+		iNextCell = m;
+		}
+
+	if (o!=m->Offset()) 
+		m->SetData(o, n);
+	}
+
+EXPORT_C void RMemChunk::Assign(RMemChunk& aChain)
+	{
+	__ASSERT_ALWAYS(iNextCell==NULL, User::Invariant ());
+	iNextCell = aChain.iNextCell;
+	aChain.Init();
+	}
+
+EXPORT_C RMemCell* TMemCellIterator::operator ++(TInt)
+	{ 
+	RMemCell* m=iMemCell; 
+	if ( m!=NULL) 
+		iMemCell=iMemCell->Next(); 
+	return m; 
+	}
+
+EXPORT_C RMemCell* RMemChunk::Last() const
+	{
+	__ASSERT_ALWAYS(iNextCell!=NULL, User::Invariant ());
+
+	return iNextCell->Last();
+	}
+
+
+EXPORT_C void RMemChunk::Append(RMemChunk& aChain)
+	{
+	__ASSERT_ALWAYS(iNextCell!=aChain.iNextCell, User::Invariant ());
+
+	if (iNextCell!=NULL)
+		{
+		RMemCell* last	= Last();
+		last->Link(aChain.iNextCell);
+		}
+	else
+		iNextCell = aChain.iNextCell;
+
+	aChain.Init();
+	}
+
+EXPORT_C RMemCell* RMemChunk::Remove()
+	{
+	if (IsEmpty())
+		return NULL;
+	else
+		{
+		RMemCell* m = iNextCell;
+		iNextCell = iNextCell->Next();
+		m->Unlink();
+		return m;
+		}
+	}
+
+EXPORT_C TInt RMemChunk::NumBufs() const
+	{
+	__ASSERT_ALWAYS(iNextCell!=NULL, User::Invariant ());
+
+	TInt len = 0;
+	RMemCell* m;
+	for (m = iNextCell; m!=NULL; m = m->Next())
+		len++;
+
+	return len;
+	}
+
+
+
+