# GDBEvent class definitions for Insight.
# Copyright (C) 2001 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License (GPL) as published by
# the Free Software Foundation; either version 2 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# For reasons unknown to me, I cannot put any of the constructors
# in the implementation files. The very first instance of the class
# will call the (empty) constructor in here instead of the one
# defined in the implementation file. Sigh.

itcl::class GDBEvent {
  public method get {what} { return "" }
  public method handler {} { return "unknown" }
}

# BREAKPOINT EVENT
#
# This event is created/dispatched whenever a breakpoint is created,
# deleted, or modified.
#
# action ....... what type of BP event ("create", "delete", "modify")
# number ....... gdb's internal token for the BP
# file ......... filename in which event occurred
# function ..... function in which event occurred
# line ......... line number in file
# address ...... address of BP
# type ......... breakpoint type ("breakpoint", "hw breakpoint", "step resume", etc)
# enabled ...... BP enabled?
# disposition .. BP's disposition ("delete", "delstop", "disable", "donttouch")
# ignore_count . BP's ignore count
# commands ..... list of commands to run when BP hit
# condition .... BP condition
# thread ....... thread in which BP is set (or -1 for all threads) 
# hit_count .... number of times BP has been hit
# user_specification
#             .. text the user initially used to set this breakpoint
itcl::class BreakpointEvent {
  inherit GDBEvent

  public variable action {}
  public variable number {}

  #constructor {args} {}
  constructor {args} {
    eval configure $args

    # If creating/modifying a breakpoint, then get
    # all info about it and save it away.
    _init
  }
  #destructor { dbug I "" }

  public method get {what}
  public method handler {} { return "breakpoint" }

  private variable _file         {}
  private variable _function     {}
  private variable _line         {}
  private variable _address      {}
  private variable _type         {}
  private variable _enabled      {}
  private variable _disposition  {}
  private variable _ignore_count {}
  private variable _commands     {}
  private variable _condition    {}
  private variable _thread       {}
  private variable _hit_count    {}
  private variable _user_specification {}

  private method _init {}
}

# TRACEPOINT EVENT
#
# This event is created/dispatched whenever a tracepoint is created,
# deleted, or modified.
#
# action ....... what type of BP event ("create", "delete", "modify")
# number ....... gdb's internal token for the BP
# file ......... filename in which event occurred
# function ..... function in which event occurred
# line ......... line number in file
# address ...... address of BP
# enabled ...... BP enabled?
# pass_count ...
# step_count ...
# thread ....... thread in which BP is set (or -1 for all threads) 
# hit_count .... number of times BP has been hit
# actions ...... a list of actions to be performed when the tracepoint is hit
itcl::class TracepointEvent {
  inherit GDBEvent

  public variable action {}
  public variable number {}

  # For reasons unknown to me, I cannot put this in the implementation
  # file. The very first instance of the class will call this empty
  # constructor instead of the one defined in the implementation file.
  #constructor {args} {}
  constructor {args} {
    eval configure $args

    # If creating/modifying a tracepoint, then get
    # all info about it and save it away.
    _init
  }
  #destructor { dbug I "" }
  public method get {what}
  public method handler {} { return "tracepoint" }

  private variable _file       {}
  private variable _function   {}
  private variable _line       {}
  private variable _address    {}
  private variable _enabled    {}
  private variable _pass_count {}
  private variable _step_count {}
  private variable _thread     {}
  private variable _hit_count  {}
  private variable _actions    {}

  private method _init {}
}

# SET VARIABLE EVENT
#
# This event is created/dispatched whenever a "set" command successfully
# completes in gdb's command interpreter.
#
# variable ..... the variable that was changed
# value ........ the variable's new value
itcl::class SetVariableEvent {
  inherit GDBEvent

  public variable variable
  public variable value

  constructor {args} {
    eval configure $args
  }
  #destructor { dbug I "" }
  public method get {what}
  public method handler {} { return "set_variable" }
}

# BUSY EVENT
#
# This event is created/dispatched whenever the GUI or GDB is "busy".
# This could happen when the inferior is executing or when the GUI
# is, for example, fetching memory from the target.

itcl::class BusyEvent {
  inherit GDBEvent

  public method handler {} { return "busy" }
}

# IDLE EVENT
#
# This event is created/dispatched whenever the GUI and GDB is not
# "busy". Receipt of this event means that the GUI should be put into
# a state to accept input by the user.

itcl::class IdleEvent {
  inherit GDBEvent

  public method handler {} { return "idle" }
}

# UPDATE EVENT
#
# This event is created/dispatched whenever the target's state
# has changed. When an UpdateEvent is received, widgets should
# update their contents to reflect the inferior's new state.
#
# Right now, this just holds the output of gdb_loc...
#
# compile_filename - Filename stored in the symtab
# full_filename    - Full filename of file, if found in source search dir
# function         - Function name
# line             - Line number
# frame_pc         - Frame's PC
# pc               - Real stop PC
# shlib            - Shared library stopped in
#
# FIXME: Should probably put frame_pc and pc into different
# types of update events...
itcl::class UpdateEvent {
  inherit GDBEvent

  constructor {args} {}
  public method get {what}
  public method handler {} { return "update" }

  private variable _compile_filename {}
  private variable _function         {}
  private variable _full_filename    {}
  private variable _line             {}
  private variable _frame_pc         {}
  private variable _pc               {}
  private variable _shlib            {}
}

# ARCHITECTURE CHANGED EVENT
#
# This event is posted whenever the target architecture changes

itcl::class ArchChangedEvent {
  inherit GDBEvent

  public method handler {} { return "arch_changed" }
}
