diff -r 000000000000 -r 7f656887cf89 core/src/console.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/src/console.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,89 @@ +// console.cpp +// +// 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 +// + +#include +#include +#include "console.h" + + +// +// CConsoleReader. +// + +CConsoleReader* CConsoleReader::NewL(RIoConsoleReadHandle& aStdin, MConsoleObserver& aObserver) + { + CConsoleReader* self = new(ELeave) CConsoleReader(aStdin, aObserver); + self->Queue(); + return self; + } + +CConsoleReader::~CConsoleReader() + { + Cancel(); + } + +CConsoleReader::CConsoleReader(RIoConsoleReadHandle& aStdin, MConsoleObserver& aObserver) + : CActive(CActive::EPriorityStandard), iStdin(aStdin), iObserver(aObserver) + { + CActiveScheduler::Add(this); + } + +void CConsoleReader::Queue() + { + TInt result = iStdin.AttachedToConsole(); + if (result > 0) + { + iRawRead = ETrue; + iStdin.Read(iRawReadBuf, iStatus); + } + else if (result == 0) + { + iRawRead = EFalse; + iStdin.WaitForKey(iStatus); + } + else + { + // This seems to happen if the console failed to construct + // [I've seen a E32USER-CBase 45 panic as a result of this call so possibly it's not always the right thing to do (I added this in the first place). -TomS] + iObserver.CoHandleError(result); + return; + } + SetActive(); + } + +void CConsoleReader::RunL() + { + TInt err = iStatus.Int(); + if (err) + { + iObserver.CoHandleError(err); + } + else + { + TUint keyCode = iRawRead ? iRawReadBuf[0] : iStdin.KeyCode(); + TUint modifiers = iRawRead ? 0 : iStdin.KeyModifiers(); + iObserver.CoHandleKey(keyCode, modifiers); + } + Queue(); + } + +void CConsoleReader::DoCancel() + { + if (iRawRead) + { + iStdin.ReadCancel(); + } + else + { + iStdin.WaitForKeyCancel(); + } + }