plugins/consoles/vt100cons/src/vtc_debugport.cpp
changeset 0 7f656887cf89
child 28 169dfbeff8ee
--- /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 <e32twin.h>
+#include <fshell/vtc_base.h>
+
+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);
+		}
+	}