--- /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;
+ };