persistentstorage/sql/SRC/Server/IPC/IPCStream.cpp
changeset 0 08ec8eefde2f
child 23 26645d81f48d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/SRC/Server/IPC/IPCStream.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,103 @@
+// Copyright (c) 2005-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 <s32buf.h>
+#include "SqlPanic.h"
+#include "IPCStream.h"
+#include "SqlSrvResourceProfiler.h"
+
+/**
+Reads data from the stream buffer and sends them to the client.
+
+@param aMessage The client message.
+
+@return The number of bytes sent.
+
+Usage of the IPC call arguments:
+Arg 0:            not used
+Arg 1: [in]       from which position to read
+Arg 2: [in/out]   IPC buffer
+Arg 3: [in]       max length of the requested data
+*/
+TInt HIpcStream::ReadL(const RMessage2& aMessage)
+	{
+	TInt pos=aMessage.Int1();
+	if (pos!=iRPos)
+		iHost.SeekL(iHost.ERead,EStreamBeginning,pos);
+	iRPos=-1;
+	TInt len=aMessage.Int3();
+	pos+=len;
+	TInt tfr=len;
+	for (;;)
+		{
+		TUint8 buf[KIpcStreamSize];
+		TInt read=iHost.ReadL(buf,Min(tfr,KIpcStreamSize));
+		if (read==0)
+			break;
+		aMessage.WriteL(2,TPtrC8(buf,read),len-tfr);
+		SQLPROFILER_REPORT_IPC(ESqlIpcWrite, read);
+		tfr-=read;
+		if (tfr==0)
+			break;
+		if (read<KIpcStreamSize)
+			break;
+		}
+	iRPos=pos-tfr;
+	return len-tfr;
+	}
+
+/**
+Reads data from the client message and stores the data in the stream buffer.
+
+@param aMessage The client message.
+
+@return The number of bytes read and stored in the stream buffer.
+
+
+Usage of the IPC call arguments:
+Arg 0:            not used
+Arg 1: [in]       from which position to write
+Arg 2: [in/out]   IPC buffer
+*/
+void HIpcStream::WriteL(const RMessage2& aMessage)
+	{
+	TInt pos=aMessage.Int1();
+	if (pos!=iWPos)
+		iHost.SeekL(iHost.EWrite,EStreamBeginning,pos);
+	iWPos=-1;
+	TInt offset=0;
+	TBuf8<KIpcStreamSize> buf;
+	for (;;)
+		{
+		aMessage.ReadL(2,buf,offset);
+		TInt len=buf.Length();
+		SQLPROFILER_REPORT_IPC(ESqlIpcRead, len);
+		if (len==0)
+			break;
+		iHost.WriteL(buf.Ptr(),len);
+		offset+=len;
+		if (len<KIpcStreamSize)
+			break;
+		}
+	iWPos=pos+offset;
+	}
+
+/**
+Destroys HIpcReadBuf object.
+*/
+void HIpcReadBuf::DoRelease()
+	{
+	delete this;
+	}