diff -r 000000000000 -r 7f656887cf89 libraries/iosrv/server/readwrite.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/iosrv/server/readwrite.h Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,287 @@ +// readwrite.h +// +// Copyright (c) 2006 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// + +#ifndef __READWRITE_H__ +#define __READWRITE_H__ + +#include +#include "server.h" +#include "iocli.h" +#include "object.h" + + +class CIoConsole; +class CThreadOwner; + +class MIoReadWriter + { +public: + virtual RIoReadWriteHandle::TMode IorwMode() const = 0; + }; + + +class MIoReader : public MIoReadWriter + { +public: + virtual TBool IorReadPending() const = 0; + virtual TBool IorReadKeyPending() const = 0; + virtual TDes& IorReadBuf() = 0; + virtual void IorDataBuffered(TInt aLength) = 0; + virtual TBool IorDataIsBuffered() const = 0; + virtual TBool IorIsKeyCaptured(TUint aKeyCode, TUint aModifiers) = 0; + virtual void IorReadComplete(TInt aError) = 0; + virtual void IorReadKeyComplete(TInt aError, TUint aKeyCode, TUint aModifiers) = 0; + virtual TName IorName() = 0; + virtual void IorReaderChange(TUint aChange) = 0; + virtual void IorSetConsoleModeComplete(TInt aError) = 0; + }; + + +class MIoWriter : public MIoReadWriter + { +public: + virtual TInt IowWriteLength() const = 0; + virtual TInt IowWrite(TDes& aBuf) = 0; + virtual void IowComplete(TInt aError) = 0; + virtual TName IowName() = 0; + virtual void IowCursorPos(TInt aError, TPoint aPos) = 0; + virtual void IowSetCursorPosAbsComplete(TInt aError) = 0; + virtual void IowSetCursorPosRelComplete(TInt aError) = 0; + virtual void IowSetCursorHeightComplete(TInt aError) = 0; + virtual void IowSetTitleComplete(TInt aError) = 0; + virtual void IowClearScreenComplete(TInt aError) = 0; + virtual void IowClearToEndOfLineComplete(TInt aError) = 0; + virtual void IowScreenSize(TInt aError, TSize aSize) = 0; + virtual void IowSetAttributesComplete(TInt aError) = 0; + virtual HBufC* IowTitleLC() = 0; + virtual TBool IowIsStdErr() const { return EFalse; } + }; + + +class MIoEndPoint + { +public: + TBool IoepIsConsole() const; + virtual TName IoepName() const = 0; + virtual TBool IoepIsType(RIoHandle::TType aType) const = 0; + }; + +class MIoReadEndPoint : public MIoEndPoint + { +public: + virtual void IorepAttachL(MIoReader& aReader, RIoEndPoint::TReadMode aMode) = 0; + virtual void IorepDetach(MIoReader& aReader) = 0; + virtual void IorepReadL(MIoReader& aReader) = 0; + virtual void IorepSetForegroundReaderL(MIoReader& aReader) = 0; + virtual TBool IorepIsForegroundL(const MIoReader& aReader) const = 0; + virtual void IorepReadKeyL(MIoReader& aReader); + virtual void IorepSetConsoleModeL(RIoReadWriteHandle::TMode aMode, MIoReader& aReader); + static TBool AttachedToConsole(const MIoReadEndPoint* aEndPoint); + }; + + +class MIoWriteEndPoint : public MIoEndPoint + { +public: + virtual void IowepAttachL(MIoWriter& aReader) = 0; + virtual void IowepDetach(MIoWriter& aReader) = 0; + virtual void IowepWriteL(MIoWriter& aWriter) = 0; + virtual void IowepWriteCancel(MIoWriter& aWriter) = 0; + virtual void IowepCursorPosL(MIoWriter& aWriter) const; + virtual void IowepSetCursorPosAbsL(const TPoint& aPoint, MIoWriter& aWriter); + virtual void IowepSetCursorPosRelL(const TPoint& aPoint, MIoWriter& aWriter); + virtual void IowepSetCursorHeightL(TInt aPercentage, MIoWriter& aWriter); + virtual void IowepSetTitleL(MIoWriter& aWriter); + virtual void IowepClearScreenL(MIoWriter& aWriter); + virtual void IowepClearToEndOfLineL(MIoWriter& aWriter); + virtual void IowepScreenSizeL(MIoWriter& aWriter) const; + virtual void IowepSetAttributesL(TUint aAttributes, ConsoleAttributes::TColor aForegroundColor, ConsoleAttributes::TColor aBackgroundColor, MIoWriter& aWriter); + static TBool AttachedToConsole(const MIoWriteEndPoint* aEndPoint); +protected: + virtual TPoint IowepCursorPos() const; + virtual void IowepSetCursorPosAbs(const TPoint& aPoint); + virtual void IowepSetCursorPosRel(const TPoint& aPoint); + virtual void IowepSetCursorHeight(TInt aHeight); + virtual void IowepSetTitle(const TDesC& aTitle); + virtual void IowepClearScreen(); + virtual void IowepClearToEndOfLine(); + virtual TSize IowepScreenSize() const; + virtual void IowepSetAttributes(TUint aAttributes, ConsoleAttributes::TColor aForegroundColor, ConsoleAttributes::TColor aBackgroundColor); + }; + + +class CIoReadWriteObject : public CIoObject + { +public: + TUint Id() const; + void SetOwnerL(TThreadId aOwningThread); + TInt Open(TThreadId aOwningThread); + void DoDuplicateL(const CIoReadWriteObject& aDuplicate); + TBool IsOwner(TThreadId aOwningThread) const; + TBool OpenedByOwner() const; + void SetConsole(CIoConsole& aConsole); + CIoConsole* Console(); + const CIoConsole* Console() const; + MIoEndPoint* EndPoint(); + virtual void SetModeL(const RMsg& aMessage); +protected: + CIoReadWriteObject(TUint aId); + void Dump(const TDesC& aData) const; +protected: + MIoEndPoint* iEndPoint; + RIoReadWriteHandle::TMode iMode; +private: + const TUint iId; + TThreadId iOwningThreadId; + TBool iOpenedByOwner; + CIoConsole* iConsole; + }; + + +class CIoReadObject : public CIoReadWriteObject, public MIoReader + { +public: + static CIoReadObject* NewLC(TInt aId); + virtual ~CIoReadObject(); + void DuplicateL(const CIoReadObject& aDuplicate); + void AttachL(MIoReadEndPoint& aEndPoint, RIoEndPoint::TReadMode aMode); + void SetReadMode(RIoReadHandle::TReadMode aMode); + void SetToForegroundL(); + TBool IsForegroundL() const; + void ReadL(const RMsg& aMessage); + void ReadCancel(const CIoSession& aSession); + void SetLineSeparatorL(const RMsg& aMessage); + void ReadKeyL(const RMsg& aMessage); + void ReadKeyCancel(const CIoSession& aSession); + void CaptureKeyL(const RMsg& aMessage); + void CancelCaptureKey(const RMsg& aMessage); + void CaptureAllKeys(const RMsg& aMessage); + void CancelCaptureAllKeys(const RMsg& aMessage); + void NotifyChange(const RMsg& aMessage); + void CancelNotifyChange(const CIoSession& aSession); +public: // From CIoObject. + virtual TBool IsType(RIoHandle::TType aType) const; + virtual void SessionClosed(const CIoSession& aSession); +public: // From CIoReadWriteObject. + virtual void SetModeL(const RMsg& aMessage); +public: // From MIoReadWriter. + virtual RIoReadWriteHandle::TMode IorwMode() const; +private: // From MIoReader. + virtual TBool IorReadPending() const; + virtual TBool IorReadKeyPending() const; + virtual TDes& IorReadBuf(); + virtual void IorDataBuffered(TInt aLength); + virtual TBool IorDataIsBuffered() const; + virtual TBool IorIsKeyCaptured(TUint aKeyCode, TUint aModifier); + virtual void IorReadComplete(TInt aError); + virtual void IorReadKeyComplete(TInt aError, TUint aKeyCode, TUint aModifiers); + virtual TName IorName(); + virtual void IorReaderChange(TUint aChange); + virtual void IorSetConsoleModeComplete(TInt aError); +private: + CIoReadObject(TInt aId); + void ProcessRead(); + void AllocateBufferL(TInt aLength); + void TryToCompleteRead(); + void CompleteRead(TInt aError, TInt aLength); + void CompleteReadKey(TInt aError, RIoConsoleReadHandle::TConsoleKey& aConsoleKey); + MIoReadEndPoint* ReadEndPoint() const; + void CancelSetMode(const CIoSession& aSession); +private: + class TCapturedKey + { + public: + TCapturedKey(TUint aKeyCode, TUint aModifierMask, TUint aModifiers); + public: + TUint iKeyCode; + TUint iModifierMask; + TUint iModifiers; + }; +private: + RIoReadHandle::TReadMode iReadMode; + TInt iMaxReadLength; + RMsg iReadMessage; + RMsg iReadKeyMessage; + HBufC* iBuf; + TPtr iPtr; + HBufC* iLineSeparator; // NULL means use default "\n" + RArray iCapturedKeys; + RArray iKeyBuffer; + TBool iCaptureAllKeys; + TInt iCompleteErr; // non-zero if we have completed reading + RMsg iChangeNotifyMessage; + RMsg iSetModeMessage; + }; + + +class CIoWriteObject : public CIoReadWriteObject, public MIoWriter + { +public: + static CIoWriteObject* NewLC(TInt aId); + ~CIoWriteObject(); + void DuplicateL(const CIoWriteObject& aDuplicate); + void AttachL(MIoWriteEndPoint& aEndPoint); + void WriteL(const RMsg& aMessage); + void WriteCancel(const CIoSession& aSession); + void CursorPosL(const RMsg& aMessage); + void SetCursorPosAbsL(const RMsg& aMessage); + void SetCursorPosRelL(const RMsg& aMessage); + void SetCursorHeightL(const RMsg& aMessage); + void SetTitleL(const RMsg& aMessage); + void ClearScreen(const RMsg& aMessage); + void ClearToEndOfLine(const RMsg& aMessage); + void ScreenSizeL(const RMsg& aMessage); + void SetAttributesL(const RMsg& aMessage); + void SetIsStdErr(TBool aFlag); +public: // From CIoObject. + virtual TBool IsType(RIoHandle::TType aType) const; + virtual void SessionClosed(const CIoSession& aSession); +public: // From MIoReadWriter. + virtual RIoReadWriteHandle::TMode IorwMode() const; +private: // From MIoWriter. + virtual TInt IowWriteLength() const; + virtual TInt IowWrite(TDes& aBuf); + virtual void IowComplete(TInt aError); + virtual TName IowName(); + virtual RIoWriteHandle::TMode IowWriteMode() const; + virtual void IowCursorPos(TInt aError, TPoint aPos); + virtual void IowSetCursorPosAbsComplete(TInt aError); + virtual void IowSetCursorPosRelComplete(TInt aError); + virtual void IowSetCursorHeightComplete(TInt aError); + virtual void IowSetTitleComplete(TInt aError); + virtual void IowClearScreenComplete(TInt aError); + virtual void IowClearToEndOfLineComplete(TInt aError); + virtual void IowScreenSize(TInt aError, TSize aSize); + virtual void IowSetAttributesComplete(TInt aError); + virtual HBufC* IowTitleLC(); + virtual TBool IowIsStdErr() const; +private: + CIoWriteObject(TInt aId); + MIoWriteEndPoint* WriteEndPoint() const; +protected: + TInt iOffset; + TInt iWriteLength; + RMsg iWriteMessage; + RMsg iGetCursorPosMsg; + RMsg iSetCursorPosAbsMsg; + RMsg iSetCursorPosRelMsg; + RMsg iSetCursorHeightMsg; + RMsg iSetTitleMsg; + RMsg iClearScreenMsg; + RMsg iClearToEndOfLineMsg; + RMsg iGetScreenSizeMsg; + RMsg iSetAttributesMsg; + TBool iTriedConsoleScreenSize; + TBool iIsStdErr; + }; + +#endif // __READWRITE_H__