sl@0: /* sl@0: * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * Library to add s32strm support for IPC (ie. stream via multiple IPC read/writes instead of sl@0: * copying to a buffer and streaming to/from there. sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: */ sl@0: #include "ipcbuf.h" sl@0: sl@0: sl@0: EXPORT_C void RIpcBuf::Open(const RMessagePtr2& aMessage, TInt aMessageSlot) sl@0: { sl@0: iMessage = aMessage; sl@0: iMessageSlot = aMessageSlot; sl@0: iReadPos = 0; sl@0: iWritePos = 0; sl@0: } sl@0: sl@0: EXPORT_C TStreamPos RIpcBuf::DoSeekL(TMark aMark, TStreamLocation aLocation, TInt anOffset) sl@0: { sl@0: sl@0: TInt size = iMessage.GetDesLengthL(iMessageSlot); sl@0: sl@0: switch (aLocation) sl@0: { sl@0: case EStreamBeginning: sl@0: // do nothing sl@0: break; sl@0: sl@0: case EStreamMark: sl@0: if (aMark&ERead) sl@0: { sl@0: anOffset += iReadPos; sl@0: } sl@0: else if (aMark&EWrite) sl@0: { sl@0: anOffset += iWritePos; sl@0: } sl@0: break; sl@0: sl@0: case EStreamEnd: sl@0: anOffset += size; sl@0: break; sl@0: sl@0: default: sl@0: User::Panic(KIpcBufPanic, EIpcBufSeekUnknownLocation); sl@0: break; sl@0: } sl@0: sl@0: // offset can't be negative or greater than size sl@0: if (anOffset > size || anOffset < 0) sl@0: { sl@0: User::Panic(KIpcBufPanic, EIpcBufSeekBadOffset); sl@0: } sl@0: sl@0: if (aMark&ERead) sl@0: { sl@0: iReadPos = anOffset; sl@0: } sl@0: else if (aMark&EWrite) sl@0: { sl@0: iWritePos = anOffset; sl@0: } sl@0: sl@0: return TStreamPos(anOffset); sl@0: } sl@0: sl@0: EXPORT_C TInt RIpcBuf::DoReadL(TAny *aPtr, TInt aMaxLength) sl@0: { sl@0: TPtr8 ptr((TUint8*)aPtr, aMaxLength); sl@0: iMessage.ReadL(iMessageSlot, ptr, iReadPos); sl@0: TInt len = ptr.Length(); sl@0: iReadPos += len; sl@0: return len; sl@0: } sl@0: sl@0: EXPORT_C void RIpcBuf::DoWriteL(const TAny* aPtr,TInt aLength) sl@0: { sl@0: TPtr8 ptr((TUint8*)aPtr, aLength, aLength); sl@0: iMessage.WriteL(iMessageSlot, ptr, iWritePos); sl@0: iWritePos += aLength; sl@0: }