smsprotocols/smsstack/smsu/src/smsustrm.cpp
changeset 0 3553901f7fa8
child 14 7ef16719d8cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/smsprotocols/smsstack/smsu/src/smsustrm.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,146 @@
+// Copyright (c) 1999-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:
+// This file contains the implementation of the RSmsSocket class
+// 
+//
+
+/**
+ @file
+*/
+
+#include "smsustrm.h"
+#include "smsumain.h"
+#include <es_sock.h>
+#include "smsstacklog.h"
+
+
+/**
+ *  Constructor
+ *  @param aSocket representing the socket the buffer reads and writes to.
+ */
+RSmsSocketBuf::RSmsSocketBuf(RSocket& aSocket)
+	:iSocket(aSocket)
+	{
+	SetBuf(ERead|EWrite,iBuffer,iBuffer);
+	} // RSmsSocketBuf::RSmsSocketBuf
+
+
+/**
+ *  Fills the buffer's read area from the socket.
+ *  
+ *  @leave The function panics if the socket is not readable.
+ *  @param aMaxLength Unused
+ *  @return The length of the buffer
+ */
+TInt RSmsSocketBuf::UnderflowL(TInt)
+//Leaves if the Request Status (s) is in error
+//Panics if ERead==0
+//
+	{
+	LOGSMSU1("RSmsSocketBuf::UnderflowL()");
+
+	__ASSERT_ALWAYS(Avail(ERead)==0,SmsuPanic(KSsmuPanicStreamReadUnavailable));
+	SocketWriteL();
+	SetBuf(EWrite,iBuffer,iBuffer);
+//
+	TRequestStatus s;
+	TSockXfrLength l;
+	TPtr8 ptr(iBuffer,sizeof(iBuffer));
+//	iSocket.RecvOneOrMore(ptr,0,s,l);
+	iSocket.Recv(ptr,0,s,l);
+	User::WaitForRequest(s); // TODO check this
+	User::LeaveIfError(s.Int());
+	TInt len=ptr.Length();
+	SetBuf(ERead,iBuffer,iBuffer+len);
+	return len;
+	} // RSmsSocketBuf::UnderflowL
+
+
+/**
+ *  Empties the buffer and sets up the buffer's write area.
+ *  
+ *  The function panics if the socket is not writable. 
+ */
+void RSmsSocketBuf::OverflowL()
+//Panics if EWrite == 0
+	{
+	LOGSMSU1("RSmsSocketBuf::OverflowL()");
+
+	__ASSERT_ALWAYS(Avail(EWrite)==0,SmsuPanic(KSsmuPanicStreamWriteUnavailable));
+	SetBuf(ERead,iBuffer,iBuffer);
+//
+	SocketWriteL();
+	SetBuf(EWrite,iBuffer,iBuffer+sizeof(iBuffer));
+	} // RSmsSocketBuf::OverflowL
+
+
+/**
+ *  Synchronises the stream buffer with the stream, leaving if any error occurs.
+ */
+void RSmsSocketBuf::DoSynchL()
+	{
+	LOGSMSU1("RSmsSocketBuf::DoSynchL()");
+
+	SocketWriteL();
+	SetBuf(ERead|EWrite,iBuffer,iBuffer);
+	} // RSmsSocketBuf::DoSynchL
+
+
+/**
+ *  Writes the buffered data to the socket.
+ */
+void RSmsSocketBuf::SocketWriteL()
+	{
+	LOGSMSU1("RSmsSocketBuf::SocketWriteL()");
+
+	TInt length=Lag(EWrite);
+	if (length==0)
+		return;
+//
+	TRequestStatus s;
+	iSocket.Write(TPtrC8(iBuffer,length),s);
+	User::WaitForRequest(s);  // TODO check this
+	User::LeaveIfError(s.Int());
+	} // RSmsSocketBuf::SocketWriteL
+
+
+/**
+ *  Constructor.
+ *  
+ *  @param aSocket RSmsSocketBuf through which to read data
+ *  @capability None
+ */
+EXPORT_C RSmsSocketReadStream::RSmsSocketReadStream(RSocket& aSocket)
+	:RReadStream(&iBuf),
+	iBuf(aSocket)
+	{
+	LOGSMSU1("RSmsSocketReadStream::RSmsSocketReadStream()");
+
+	} // RSmsSocketReadStream::RSmsSocketReadStream
+
+
+/**
+ *  Constructor.
+ *  
+ *  @param aSocket RSmsSocketBuf through which to write data
+ *  @capability None
+ */
+EXPORT_C RSmsSocketWriteStream::RSmsSocketWriteStream(RSocket& aSocket)
+	:RWriteStream(&iBuf),
+	iBuf(aSocket)
+	{
+	LOGSMSU1("RSmsSocketWriteStream::RSmsSocketWriteStream()");
+
+	} // RSmsSocketWriteStream::RSmsSocketWriteStream
+