diff -r 000000000000 -r 7f656887cf89 plugins/consoles/vt100cons/src/vtc_debugport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/consoles/vt100cons/src/vtc_debugport.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,134 @@ +// vtc_debugport.cpp +// +// Copyright (c) 2007 - 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 +// + +#include +#include + +class CReaderObject; + +NONSHARABLE_CLASS(CVtcDebugPortConsole) : public CVtcConsoleBase + { +public: + CVtcDebugPortConsole(); + ~CVtcDebugPortConsole(); + void ReadComplete(TInt aErr, TKeyCode aCode); + +protected: // From CVtcConsoleBase. + virtual void ConstructL(const TDesC& aTitle); + TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1); +private: // From MConsoleOutput. + virtual TInt Output(const TDesC8& aDes); +private: // From MConsoleInput. + virtual void Input(TDes8& aDes, TRequestStatus& aStatus); + virtual void CancelInput(TRequestStatus& aStatus); +private: + friend class CReaderObject; + RConsole iConsole; + CReaderObject* iReader; + TRequestStatus* iClientStatus; + TDes8* iClientDes; + }; + +class CReaderObject : public CActive + { +public: + CReaderObject(CVtcDebugPortConsole* aParent) : CActive(CActive::EPriorityStandard), iParent(aParent) { CActiveScheduler::Add(this); } + void RunL() { iParent->ReadComplete(iStatus.Int(), iKey.Code()); } + void DoCancel() { iParent->iConsole.ReadCancel(); } + void Request() + { + iParent->iConsole.Read(iKey, iStatus); + SetActive(); + } + + CVtcDebugPortConsole* iParent; + TConsoleKey iKey; + }; + +extern "C" EXPORT_C TAny* NewConsole() + { + return new CVtcDebugPortConsole; + } + +CVtcDebugPortConsole::CVtcDebugPortConsole() + { + } + +CVtcDebugPortConsole::~CVtcDebugPortConsole() + { + if (iReader) + { + iReader->Cancel(); + delete iReader; + } + if (iConsole.Handle()) + { + iConsole.Destroy(); // Needed? + } + iConsole.Close(); + } + +void CVtcDebugPortConsole::ConstructL(const TDesC& aTitle) + { + iReader = new(ELeave) CReaderObject(this); + User::LeaveIfError(iConsole.Create()); + User::LeaveIfError(iConsole.Init(_L("fshell"), TSize(KConsFullScreen,KConsFullScreen))); + CVtcConsoleBase::ConstructL(aTitle); + } + +TInt CVtcDebugPortConsole::Output(const TDesC8& aDes) + { + TBuf<128> buf; + TPtrC8 remainder(aDes); + while (remainder.Length()) + { + TPtrC8 frag(remainder.Left(Min(remainder.Length(), buf.MaxLength()))); + remainder.Set(remainder.Mid(frag.Length())); + buf.Copy(frag); + RDebug::RawPrint(buf); + } + return KErrNone; + } + +void CVtcDebugPortConsole::Input(TDes8& aDes, TRequestStatus& aStatus) + { + iClientDes = &aDes; + iClientStatus = &aStatus; + iReader->Request(); + //iCommPort.ReadOneOrMore(aStatus, aDes); + } + +void CVtcDebugPortConsole::CancelInput(TRequestStatus&) + { + //iCommPort.ReadCancel(); + iReader->Cancel(); + User::RequestComplete(iClientStatus, KErrCancel); + } + +void CVtcDebugPortConsole::ReadComplete(TInt aErr, TKeyCode aCode) + { + iClientDes->SetLength(1); + (*iClientDes)[0] = aCode; + User::RequestComplete(iClientStatus, aErr); + } + +TInt CVtcDebugPortConsole::Extension_(TUint aExtensionId, TAny*& a0, TAny* a1) + { + if (aExtensionId == ConsoleMode::KSetConsoleModeExtension) + { + return KErrNotSupported; // The text windowserver swallows certain keypresses so we can't support binary mode + } + else + { + return CVtcConsoleBase::Extension_(aExtensionId, a0, a1); + } + }