/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #ifndef EXTENSIONCONTEXT_H #define EXTENSIONCONTEXT_H #include "common.h" #include "iinterfacepointer.h" #include #include class SymbolGroup; // Global singleton with context. // Caches a symbolgroup per frame and thread as long as the session is accessible. class ExtensionContext { ExtensionContext(const ExtensionContext&); ExtensionContext& operator=(const ExtensionContext&); ExtensionContext(); public: // Key used to report stop reason in StopReasonMap static const char *stopReasonKeyC; // Map of parameters reported with the next stop as GDBMI typedef std::map StopReasonMap; ~ExtensionContext(); static ExtensionContext &instance(); // Call from DLL initialization. HRESULT initialize(PULONG Version, PULONG Flags); // Hook up our Event and Output callbacks that report exceptions and events. // Call this from the first extension command that gets a client. // Does not work when called from initialization. void hookCallbacks(CIDebugClient *client); // Report output in standardized format understood by Qt Creator. // '|R|||'. // Char code is 'R' command reply, 'N' command fail, 'E' event notification bool report(char code, int token, const char *serviceName, PCSTR Format, ...); ULONG executionStatus() const; // Call from notify handler, tell engine about state. void notifyState(ULONG Notify); // register as '.idle_cmd' to notify creator about stop void notifyIdle(); // Return symbol group for frame (cache as long as frame does not change). SymbolGroup *symbolGroup(CIDebugSymbols *symbols, ULONG threadId, int frame, std::string *errorMessage); int symbolGroupFrame() const; // Stop reason is reported with the next idle notification void setStopReason(const StopReasonMap &, const std::string &reason = std::string()); private: void unhookCallbacks(); bool isInitialized() const; void discardSymbolGroup(); IInterfacePointer m_control; std::auto_ptr m_symbolGroup; CIDebugClient *m_hookedClient; IDebugEventCallbacks *m_oldEventCallback; IDebugOutputCallbacksWide *m_oldOutputCallback; IDebugEventCallbacks *m_creatorEventCallback; IDebugOutputCallbacksWide *m_creatorOutputCallback; StopReasonMap m_stopReason; }; // Context for extension commands to be instantiated on stack in a command handler. class ExtensionCommandContext { ExtensionCommandContext(const ExtensionCommandContext&); ExtensionCommandContext &operator=(const ExtensionCommandContext&); public: explicit ExtensionCommandContext(CIDebugClient *Client); ~ExtensionCommandContext(); // For accessing outside commands. Might return 0, based on the // assumption that there is only once instance active. static ExtensionCommandContext *instance(); CIDebugControl *control(); CIDebugSymbols *symbols(); CIDebugSystemObjects *systemObjects(); CIDebugAdvanced *advanced(); CIDebugRegisters *registers(); CIDebugDataSpaces *dataSpaces(); ULONG threadId(); private: static ExtensionCommandContext *m_instance; CIDebugClient *m_client; IInterfacePointer m_control; IInterfacePointer m_symbols; IInterfacePointer m_advanced; IInterfacePointer m_systemObjects; IInterfacePointer m_registers; IInterfacePointer m_dataSpaces; }; #endif // EXTENSIONCONTEXT_H