a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* $Id$ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @file
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * VBox Debugger GUI - Console.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
20e679981773e64a87a10aef7107d697712dffbcvboxsync * Copyright (C) 2006-2014 Oracle Corporation
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * available from http://www.virtualbox.org. This file is free software;
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * General Public License (GPL) as published by the Free Software
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#ifndef ___Debugger_VBoxDbgConsole_h
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define ___Debugger_VBoxDbgConsole_h
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "VBoxDbgBase.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QTextEdit>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QComboBox>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QTimer>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QEvent>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/critsect.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/semaphore.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/thread.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgConsoleOutput : public QTextEdit
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Q_OBJECT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Constructor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pParent Parent Widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pszName Widget name.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleOutput(QWidget *pParent = NULL, const char *pszName = NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Destructor
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual ~VBoxDbgConsoleOutput();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Appends text.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This differs from QTextEdit::append() in that it won't start on a new paragraph
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * unless the previous char was a newline ('\n').
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
19d2bd74156f55ea7fd654c35cc421abb0dc55cfvboxsync * @param rStr The text string to append.
19d2bd74156f55ea7fd654c35cc421abb0dc55cfvboxsync * @param fClearSelection Whether to clear selected text before appending.
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync * If @c false the selection and window position
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync * are preserved.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
364a14c85c5b8ae00f21b1dfc9fab2d7fffaca21vboxsync virtual void appendText(const QString &rStr, bool fClearSelection);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /** The action to switch to black-on-white color scheme. */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QAction *m_pBlackOnWhiteAction;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /** The action to switch to green-on-black color scheme. */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QAction *m_pGreenOnBlackAction;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /** The action to switch to Courier font. */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QAction *m_pCourierFontAction;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /** The action to switch to Monospace font. */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync QAction *m_pMonospaceFontAction;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync typedef enum { kGreenOnBlack, kBlackOnWhite } VBoxDbgConsoleColor;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /**
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * Context menu event.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * This adds custom menu items for the output view.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync *
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * @param pEvent Pointer to the event.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync virtual void contextMenuEvent(QContextMenuEvent *pEvent);
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The current line (paragraph) number. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned m_uCurLine;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The position in the current line. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned m_uCurPos;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The handle to the GUI thread. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTNATIVETHREAD m_hGUIThread;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /** The current color scheme (foreground on background). */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync VBoxDbgConsoleColor m_enmColorScheme;
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsyncprivate slots:
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /**
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * The green-on-black color scheme context-menu item was triggered.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync void setColorGreenOnBlack();
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /**
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * The black-on-white color scheme context-menu item was triggered.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync void setColorBlackOnWhite();
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /**
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * The courier font family context-menu item was triggered.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync void setFontCourier();
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync /**
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync * The monospace font family context-menu item was triggered.
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync */
eb64ee0abd56a8f7d9b102e00294404f96398a82vboxsync void setFontMonospace();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The Debugger Console Input widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is a combobox which only responds to <return>.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgConsoleInput : public QComboBox
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Q_OBJECT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Constructor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pParent Parent Widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pszName Widget name.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleInput(QWidget *pParent = NULL, const char *pszName = NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Destructor
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual ~VBoxDbgConsoleInput();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * We overload this method to get signaled upon returnPressed().
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * See QComboBox::setLineEdit for full description.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pEdit The new line edit widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @remark This won't be called during the constructor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void setLineEdit(QLineEdit *pEdit);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncsignals:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * New command submitted.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void commandSubmitted(const QString &rCommand);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprivate slots:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Returned was pressed.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Will emit commandSubmitted().
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void returnPressed();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The handle to the GUI thread. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTNATIVETHREAD m_hGUIThread;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The Debugger Console.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgConsole : public VBoxDbgBaseWindow
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Q_OBJECT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Constructor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pDbgGui Pointer to the debugger gui object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pParent Parent Widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsole(VBoxDbgGui *a_pDbgGui, QWidget *a_pParent = NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Destructor
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual ~VBoxDbgConsole();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected slots:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Handler called when a command is submitted.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * (Enter or return pressed in the combo box.)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param rCommand The submitted command.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void commandSubmitted(const QString &rCommand);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Updates the output with what's currently in the output buffer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is called by a timer or a User event posted by the debugger thread.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void updateOutput();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Changes the focus to the input field.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actFocusToInput();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Changes the focus to the output viewer widget.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void actFocusToOutput();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Override the closeEvent so we can choose delete the window when
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * it is closed.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pCloseEvt The close event.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void closeEvent(QCloseEvent *a_pCloseEvt);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Lock the object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void lock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Unlocks the object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void unlock();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @name Debug Console Backend.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Checks if there is input.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns true if there is input ready.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns false if there not input ready.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pBack Pointer to VBoxDbgConsole::m_Back.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cMillies Number of milliseconds to wait on input data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static DECLCALLBACK(bool) backInput(PDBGCBACK pBack, uint32_t cMillies);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Read input.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns VBox status code.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pBack Pointer to VBoxDbgConsole::m_Back.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvBuf Where to put the bytes we read.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cbBuf Maximum nymber of bytes to read.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pcbRead Where to store the number of bytes actually read.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * If NULL the entire buffer must be filled for a
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * successful return.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static DECLCALLBACK(int) backRead(PDBGCBACK pBack, void *pvBuf, size_t cbBuf, size_t *pcbRead);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Write (output).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns VBox status code.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pBack Pointer to VBoxDbgConsole::m_Back.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvBuf What to write.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cbBuf Number of bytes to write.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pcbWritten Where to store the number of bytes actually written.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * If NULL the entire buffer must be successfully written.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static DECLCALLBACK(int) backWrite(PDBGCBACK pBack, const void *pvBuf, size_t cbBuf, size_t *pcbWritten);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc FNDBGCBACKSETREADY
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static DECLCALLBACK(void) backSetReady(PDBGCBACK pBack, bool fReady);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The Debugger Console Thread
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns VBox status code (ignored).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param Thread The thread handle.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pvUser Pointer to the VBoxDbgConsole object.s
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static DECLCALLBACK(int) backThread(RTTHREAD Thread, void *pvUser);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @} */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Processes GUI command posted by the console thread.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Qt3 isn't thread safe on any platform, meaning there is no locking, so, as
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * a result we have to be very careful. All operations on objects which we share
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * with the main thread has to be posted to it so it can perform it.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool event(QEvent *pEvent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The output widget. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleOutput *m_pOutput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The input widget. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleInput *m_pInput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** A hack to restore focus to the combobox after a command execution. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool m_fInputRestoreFocus;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The input buffer. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char *m_pszInputBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The amount of input in the buffer. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t m_cbInputBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The allocated size of the buffer. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t m_cbInputBufAlloc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The output buffer. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char *m_pszOutputBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The amount of output in the buffer. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t m_cbOutputBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The allocated size of the buffer. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t m_cbOutputBufAlloc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The timer object used to process output in a delayed fashion. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QTimer *m_pTimer;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Set when an output update is pending. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool volatile m_fUpdatePending;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The debugger console thread. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTTHREAD m_Thread;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The event semaphore used to signal the debug console thread about input. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTSEMEVENT m_EventSem;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The critical section used to lock the object. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTCRITSECT m_Lock;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** When set the thread will cause the debug console thread to terminate. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool volatile m_fTerminate;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Has the thread terminated?
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Used to do the right thing in closeEvent; the console is dead if the
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * thread has terminated. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool volatile m_fThreadTerminated;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The debug console backend structure.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Use VBOXDBGCONSOLE_FROM_DBGCBACK to convert the DBGCBACK pointer to a object pointer. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync struct VBoxDbgConsoleBack
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGCBACK Core;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsole *pSelf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync } m_Back;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Converts a pointer to VBoxDbgConsole::m_Back to VBoxDbgConsole pointer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @todo find a better way because offsetof is undefined on objects and g++ gets very noisy because of that.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync# define VBOXDBGCONSOLE_FROM_DBGCBACK(pBack) ( ((struct VBoxDbgConsoleBack *)(pBack))->pSelf )
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Change focus to the input field. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pFocusToInput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Change focus to the output viewer widget. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QAction *m_pFocusToOutput;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Simple event class for push certain operations over
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * onto the GUI thread.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgConsoleEvent : public QEvent
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync typedef enum { kUpdate, kInputEnable, kTerminatedUser, kTerminatedOther } VBoxDbgConsoleEventType;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync enum { kEventNumber = QEvent::User + 42 };
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleEvent(VBoxDbgConsoleEventType enmCommand)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : QEvent((QEvent::Type)kEventNumber), m_enmCommand(enmCommand)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleEventType command() const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return m_enmCommand;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprivate:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgConsoleEventType m_enmCommand;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync