// Copyright (c) 2004-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:// CHeapWrapper implementation// ///** @file @internalTechnology*/#include "sbheapwrapper.h"#include <connect/panic.h>namespace conn { CHeapWrapper* CHeapWrapper::NewL() /** Symbian 1st phase constructor @return pointer to a newly created CHeapWrapper object */ { CHeapWrapper* self = new (ELeave) CHeapWrapper(); return self; } TPtrC8& CHeapWrapper::ReadBufferL(const RChunk& aChunk) /** Getter for the GSH descriptor @param aChunk The RChunk to interrogate for the heap information @return reference to the descriptor stored on the global shared heap */ { if (Header(aChunk).LockedFlag()) { User::Leave(KErrInUse); } CleanReadBuffer(); iReadBuf = new (ELeave) TPtrC8(Buffer(aChunk)); return *iReadBuf; } TPtr8& CHeapWrapper::WriteBufferL(const RChunk& aChunk) /** Lock the heap and return a reference to the descriptor on the GSH @param aChunk The RChunk to interrogate for the heap information @return reference to the descriptor stored on the global shared heap */ { if (Header(aChunk).LockedFlag()) { User::Leave(KErrInUse); } CleanReadBuffer(); TPtr8& des = Buffer(aChunk); // Blank the descriptor as it's a write buffer des.Zero(); return des; } THeapWrapperHeader& CHeapWrapper::Header(const RChunk& aChunk) const /** Getter for the protocol structure @param aChunk The RChunk to interrogate for the heap information @return Pointer to the header structure containing heap protocol information */ { return *reinterpret_cast<THeapWrapperHeader*>(aChunk.Base() + KHeaderOffset); } TInt CHeapWrapper::ResetHeap(const RChunk& aChunk) /** Reset all of the protocol data in the stack if we're the first users @param aChunk The RChunk to interrogate for the heap information @return KErrNone always. */ { TInt err = KErrNone; TUint8* heapPtr = aChunk.Base(); new (&Header(aChunk)) THeapWrapperHeader; THeapWrapperHeader& header = Header(aChunk); header.iFinished = ETrue; header.SetLockedFlag(EFalse); // placement new a new descriptor on the heap to initialise it new (heapPtr + KDescriptorOffset) TPtr8(heapPtr + KDataOffset, 0, aChunk.Size() - KDataOffset); return err; } TPtr8& CHeapWrapper::Buffer(const RChunk& aChunk) /** @param aChunk The RChunk to interrogate for the heap information @return reference to the descriptor stored on the global shared heap */ { TUint8* heapPtr = aChunk.Base(); // Set the descriptor TPtr8* descriptor = reinterpret_cast<TPtr8*>(heapPtr + KDescriptorOffset); const TInt length = descriptor->Length(); const TInt maxLength = descriptor->MaxLength(); descriptor->Set(heapPtr + KDataOffset, length, maxLength); return *descriptor; } void CHeapWrapper::CleanReadBuffer() /** Delete and NULL the read buffer if necessary */ { delete iReadBuf; iReadBuf = NULL; } CHeapWrapper::~CHeapWrapper() { CleanReadBuffer(); } }