genericopenlibs/cstdlib/INC/PIPEDESC.H
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/INC/PIPEDESC.H	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,118 @@
+// Copyright (c) 1997-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:
+// Support for pipes between processes
+// CPipeDesc is in the parent process, CPipeChildDesc is in the child
+// 
+//
+
+#include "FDESC.H"
+#include <sys/ioctl.h>
+
+NONSHARABLE_CLASS(CPipeDesc) : public CFileDescBase
+/**
+@internalComponent
+*/
+	{
+public:
+	CPipeDesc(TInt anIndex);
+
+	void SetClientSide(CPipeDesc*& aClientPointer);
+	TInt LSeek(int& offset, int whence);
+	void Read(TDes8& aDesc, TRequestStatus& aStatus);
+	TInt ReadCompletion(TDes8& aDesc, TInt aStatus);
+	void ReadCancel();
+	void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	TInt WriteCompletion(TDes8& aDesc, TInt aStatus);
+	void WriteCancel();
+	TInt FStat(struct stat *st);
+	void Ioctl(int aCmd, void* aParam, TRequestStatus& aStatus);
+	TInt IoctlCompletion(int aCmd, void* aParam, TInt aStatus);
+	void IoctlCancel();
+
+	void ClientRead(const RMessage2& aMessage);
+	void ClientWrite(const RMessage2& aMessage);
+	void ClientIoctl(const RMessage2& aMessage);
+	void ClientCancel(const RMessage2& aMessage);
+	void ClientClose();
+protected:
+	TInt FinalClose();
+private:
+	void Cancel();
+	TInt IsWriteable() { return !iIndex; }	// 0 => child STDIN
+	TInt IsReadable() { return iIndex; }
+	TInt SelectMask()       { return (iIndex)? E32SELECT_READ :E32SELECT_WRITE; }
+	TInt ClientSelectMask() { return (iIndex)? E32SELECT_WRITE:E32SELECT_READ;  }
+	TInt ClientIoctlPending() { return iClientIoctlPending; }
+
+	void TransferFromClient();
+	void TransferToClient();
+	void CompleteClientIoctl(TInt ret);
+	void CompleteClientIoctl();
+	void Panic(TInt aReason);
+	void Panic(RMessage2& aMessage, TInt aReason);
+private:
+	TInt iIndex;	// index into per-process table of pipes, also implies direction.
+	CPipeDesc** iClientSide;
+	TInt iClientClosed;
+	// Pending info for parent operation
+	TRequestStatus* iStatus;	// null implies "no pending operation"
+	TRequestStatus* iIoctlStatus;
+	TPtrC8 iWriteBuf;
+	TDes8* iReadBuf;
+	// Pending info for child operation
+	TInt iClientLength;		// 0 implies "no pending operation"
+	TInt iClientOffset;
+	RMessage2 iMessage;
+	TInt iClientIoctlPending;
+	RMessage2 iIoctlMessage;
+	};
+
+class RPosixSession;
+NONSHARABLE_CLASS(CPipeChildDesc) : public CFileDescBase
+/**
+CPipeChildDesc
+Basically just forwards requests to the parent CPosixServer, where the related CPipeDesc
+does the actual work.
+@internalComponent
+*/
+	{
+public:
+	CPipeChildDesc(TInt anIndex, RPosixSession& aSession); 
+
+	TInt LSeek(int& offset, int whence);
+	void Read(TDes8& aDesc, TRequestStatus& aStatus);
+	TInt ReadCompletion(TDes8& aDesc, TInt aStatus);
+	void ReadCancel();
+	void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	TInt WriteCompletion(TDes8& aDesc, TInt aStatus);
+	void WriteCancel();
+	TInt FStat(struct stat *st);
+	void Ioctl(int aCmd, void* aParam, TRequestStatus& aStatus);
+	void IoctlCancel();
+
+	void ClientClose() { iClientClosed=1; }
+
+protected:
+	TInt FinalClose();
+private:
+	void Cancel(TInt aType);
+	TInt IsWriteable() { return iIndex; }	// 0 => child STDIN
+	TInt IsReadable() { return !iIndex; }
+	TInt SelectMask() { return (!iIndex)? E32SELECT_READ:E32SELECT_WRITE; }
+
+	TInt iIndex;	// index into per-process table of pipes, also implies direction.
+	RPosixSession& iSession;
+	TInt iClientClosed;
+	TPtr8 iParamDes;
+	};