diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cstdlib/INC/PIPEDESC.H --- /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 + +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; + };