1//===-- Event.h -------------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_Event_h_
11#define liblldb_Event_h_
12
13// C Includes
14// C++ Includes
15#include <list>
16#include <string>
17
18// Other libraries and framework includes
19// Project includes
20#include "lldb/lldb-private.h"
21#include "lldb/Core/ConstString.h"
22#include "lldb/Host/Predicate.h"
23
24namespace lldb_private {
25
26//----------------------------------------------------------------------
27// lldb::EventData
28//----------------------------------------------------------------------
29class EventData
30{
31    friend class Event;
32
33public:
34    EventData ();
35
36    virtual
37    ~EventData();
38
39    virtual const ConstString &
40    GetFlavor () const = 0;
41
42    virtual void
43    Dump (Stream *s) const;
44
45private:
46    virtual void
47    DoOnRemoval (Event *event_ptr)
48    {
49    }
50
51    DISALLOW_COPY_AND_ASSIGN (EventData);
52
53};
54
55//----------------------------------------------------------------------
56// lldb::EventDataBytes
57//----------------------------------------------------------------------
58class EventDataBytes : public EventData
59{
60public:
61    //------------------------------------------------------------------
62    // Constructors
63    //------------------------------------------------------------------
64    EventDataBytes ();
65
66    EventDataBytes (const char *cstr);
67
68    EventDataBytes (const void *src, size_t src_len);
69
70    virtual
71    ~EventDataBytes();
72
73    //------------------------------------------------------------------
74    // Member functions
75    //------------------------------------------------------------------
76    virtual const ConstString &
77    GetFlavor () const;
78
79    virtual void
80    Dump (Stream *s) const;
81
82    const void *
83    GetBytes() const;
84
85    size_t
86    GetByteSize() const;
87
88    void
89    SetBytes (const void *src, size_t src_len);
90
91    void
92    SwapBytes (std::string &new_bytes);
93
94    void
95    SetBytesFromCString (const char *cstr);
96
97    //------------------------------------------------------------------
98    // Static functions
99    //------------------------------------------------------------------
100    static const EventDataBytes *
101    GetEventDataFromEvent (const Event *event_ptr);
102
103    static const void *
104    GetBytesFromEvent (const Event *event_ptr);
105
106    static size_t
107    GetByteSizeFromEvent (const Event *event_ptr);
108
109    static const ConstString &
110    GetFlavorString ();
111
112private:
113    std::string m_bytes;
114
115    DISALLOW_COPY_AND_ASSIGN (EventDataBytes);
116
117};
118
119//----------------------------------------------------------------------
120// lldb::Event
121//----------------------------------------------------------------------
122class Event
123{
124    friend class Broadcaster;
125    friend class Listener;
126    friend class EventData;
127
128public:
129
130    Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data = NULL);
131
132    Event (uint32_t event_type, EventData *data = NULL);
133
134    ~Event ();
135
136    void
137    Dump (Stream *s) const;
138
139    EventData *
140    GetData ()
141    {
142        return m_data_ap.get();
143    }
144
145    const EventData *
146    GetData () const
147    {
148        return m_data_ap.get();
149    }
150
151    void
152    SetData (EventData *new_data)
153    {
154        m_data_ap.reset (new_data);
155    }
156
157    uint32_t
158    GetType () const
159    {
160        return m_type;
161    }
162
163    void
164    SetType (uint32_t new_type)
165    {
166        m_type = new_type;
167    }
168
169    Broadcaster *
170    GetBroadcaster () const
171    {
172        return m_broadcaster;
173    }
174
175    bool
176    BroadcasterIs (Broadcaster *broadcaster)
177    {
178        return broadcaster == m_broadcaster;
179    }
180
181    void
182    Clear()
183    {
184        m_data_ap.reset();
185    }
186
187
188private:
189    // This is only called by Listener when it pops an event off the queue for
190    // the listener.  It calls the Event Data's DoOnRemoval() method, which is
191    // virtual and can be overridden by the specific data classes.
192
193    void
194    DoOnRemoval ();
195
196    // Called by Broadcaster::BroadcastEvent prior to letting all the listeners
197    // know about it update the contained broadcaster so that events can be
198    // popped off one queue and re-broadcast to others.
199    void
200    SetBroadcaster (Broadcaster *broadcaster)
201    {
202        m_broadcaster = broadcaster;
203    }
204
205
206    Broadcaster *   m_broadcaster;  // The broadcaster that sent this event
207    uint32_t        m_type;         // The bit describing this event
208    std::unique_ptr<EventData> m_data_ap;         // User specific data for this event
209
210
211    DISALLOW_COPY_AND_ASSIGN (Event);
212    Event();    // Disallow default constructor
213};
214
215} // namespace lldb_private
216
217#endif  // liblldb_Event_h_
218