diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/Server/Flow/src/upnpmemoryutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servicediscoveryandcontrol/pnp/test/upnp/Server/Flow/src/upnpmemoryutils.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2008 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 +#include +#include +#include + +#include "upnpmemoryutils.h" + + +TInt TUPnPMemoryUtils::CreateMemChunk(RMemChunk& aMemChunk, RMBufChain& aData, RMemoryAllocator& aAllocator) + { + TInt n, n1, n2; + TUint8* p1, *p2; + RMBuf* m1; + RMemCell* m2; + + TInt len = aData.Length(); + + if(!len) + { + aMemChunk.Init(); + return KErrNone; + } + + TInt err = aMemChunk.Alloc ( len, aAllocator ); + + if(err != KErrNone) + { + return err; + } + m1 = aData.First(); + p1 = m1->Ptr(); + n1 = m1->Length(); + + m2 = aMemChunk.First(); + p2 = m2->Ptr(); + n2 = m2->Length(); + + while (len>0) + { + __ASSERT_DEBUG(n1>0 && n2>0, User::Invariant ()); + + n = n1 < n2 ? n1 : n2; + + Mem::Copy(p2, p1, n); + + if (n1 -= n, n1 == 0) + { + if (m1 = m1->Next(), m1==NULL) + break; + p1 = m1->Ptr(); + n1 = m1->Length(); + } + else + p1 += n; + + if (n2 -= n, n2 == 0) + { + if (m2 = m2->Next(), m2==NULL) + break; + p2 = m2->Ptr(); + n2 = m2->Length(); + } + else + p2 += n; + + len -= n; + } + + return KErrNone; + } + +TInt TUPnPMemoryUtils::CreateMBuf(RMBufChain& aBufChain, RMemChunk& aData) + { + TInt n, n1, n2; + TUint8* p1, *p2; + RMemCell* m1; + RMBuf* m2; + + TInt len = aData.Length(); + + if(!len) + { + aBufChain.Init(); + return KErrNone; + } + + TInt err = aBufChain.Alloc ( len ); + + if(err != KErrNone) + { + return err; + } + m1 = aData.First(); + p1 = m1->Ptr(); + n1 = m1->Length(); + + m2 = aBufChain.First(); + p2 = m2->Ptr(); + n2 = m2->Length(); + + while (len>0) + { + __ASSERT_DEBUG(n1>0 && n2>0, User::Invariant ()); + + n = n1 < n2 ? n1 : n2; + + Mem::Copy(p2, p1, n); + + if (n1 -= n, n1 == 0) + { + if (m1 = m1->Next(), m1==NULL) + break; + p1 = m1->Ptr(); + n1 = m1->Length(); + } + else + p1 += n; + + if (n2 -= n, n2 == 0) + { + if (m2 = m2->Next(), m2==NULL) + break; + p2 = m2->Ptr(); + n2 = m2->Length(); + } + else + p2 += n; + + len -= n; + } + + return KErrNone; + } + + +