1254721Semaste//===-- Event.h -------------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_Event_h_
11254721Semaste#define liblldb_Event_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste#include <list>
16254721Semaste#include <string>
17254721Semaste
18254721Semaste// Other libraries and framework includes
19254721Semaste// Project includes
20254721Semaste#include "lldb/lldb-private.h"
21254721Semaste#include "lldb/Core/ConstString.h"
22254721Semaste#include "lldb/Host/Predicate.h"
23254721Semaste
24254721Semastenamespace lldb_private {
25254721Semaste
26254721Semaste//----------------------------------------------------------------------
27254721Semaste// lldb::EventData
28254721Semaste//----------------------------------------------------------------------
29254721Semasteclass EventData
30254721Semaste{
31254721Semaste    friend class Event;
32254721Semaste
33254721Semastepublic:
34254721Semaste    EventData ();
35254721Semaste
36254721Semaste    virtual
37254721Semaste    ~EventData();
38254721Semaste
39254721Semaste    virtual const ConstString &
40254721Semaste    GetFlavor () const = 0;
41254721Semaste
42254721Semaste    virtual void
43254721Semaste    Dump (Stream *s) const;
44254721Semaste
45254721Semasteprivate:
46254721Semaste    virtual void
47254721Semaste    DoOnRemoval (Event *event_ptr)
48254721Semaste    {
49254721Semaste    }
50254721Semaste
51254721Semaste    DISALLOW_COPY_AND_ASSIGN (EventData);
52254721Semaste
53254721Semaste};
54254721Semaste
55254721Semaste//----------------------------------------------------------------------
56254721Semaste// lldb::EventDataBytes
57254721Semaste//----------------------------------------------------------------------
58254721Semasteclass EventDataBytes : public EventData
59254721Semaste{
60254721Semastepublic:
61254721Semaste    //------------------------------------------------------------------
62254721Semaste    // Constructors
63254721Semaste    //------------------------------------------------------------------
64254721Semaste    EventDataBytes ();
65254721Semaste
66254721Semaste    EventDataBytes (const char *cstr);
67254721Semaste
68254721Semaste    EventDataBytes (const void *src, size_t src_len);
69254721Semaste
70254721Semaste    virtual
71254721Semaste    ~EventDataBytes();
72254721Semaste
73254721Semaste    //------------------------------------------------------------------
74254721Semaste    // Member functions
75254721Semaste    //------------------------------------------------------------------
76254721Semaste    virtual const ConstString &
77254721Semaste    GetFlavor () const;
78254721Semaste
79254721Semaste    virtual void
80254721Semaste    Dump (Stream *s) const;
81254721Semaste
82254721Semaste    const void *
83254721Semaste    GetBytes() const;
84254721Semaste
85254721Semaste    size_t
86254721Semaste    GetByteSize() const;
87254721Semaste
88254721Semaste    void
89254721Semaste    SetBytes (const void *src, size_t src_len);
90254721Semaste
91254721Semaste    void
92254721Semaste    SwapBytes (std::string &new_bytes);
93254721Semaste
94254721Semaste    void
95254721Semaste    SetBytesFromCString (const char *cstr);
96254721Semaste
97254721Semaste    //------------------------------------------------------------------
98254721Semaste    // Static functions
99254721Semaste    //------------------------------------------------------------------
100254721Semaste    static const EventDataBytes *
101254721Semaste    GetEventDataFromEvent (const Event *event_ptr);
102254721Semaste
103254721Semaste    static const void *
104254721Semaste    GetBytesFromEvent (const Event *event_ptr);
105254721Semaste
106254721Semaste    static size_t
107254721Semaste    GetByteSizeFromEvent (const Event *event_ptr);
108254721Semaste
109254721Semaste    static const ConstString &
110254721Semaste    GetFlavorString ();
111254721Semaste
112254721Semasteprivate:
113254721Semaste    std::string m_bytes;
114254721Semaste
115254721Semaste    DISALLOW_COPY_AND_ASSIGN (EventDataBytes);
116254721Semaste
117254721Semaste};
118254721Semaste
119254721Semaste//----------------------------------------------------------------------
120254721Semaste// lldb::Event
121254721Semaste//----------------------------------------------------------------------
122254721Semasteclass Event
123254721Semaste{
124254721Semaste    friend class Broadcaster;
125254721Semaste    friend class Listener;
126254721Semaste    friend class EventData;
127254721Semaste
128254721Semastepublic:
129254721Semaste
130254721Semaste    Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data = NULL);
131254721Semaste
132254721Semaste    Event (uint32_t event_type, EventData *data = NULL);
133254721Semaste
134254721Semaste    ~Event ();
135254721Semaste
136254721Semaste    void
137254721Semaste    Dump (Stream *s) const;
138254721Semaste
139254721Semaste    EventData *
140254721Semaste    GetData ()
141254721Semaste    {
142254721Semaste        return m_data_ap.get();
143254721Semaste    }
144254721Semaste
145254721Semaste    const EventData *
146254721Semaste    GetData () const
147254721Semaste    {
148254721Semaste        return m_data_ap.get();
149254721Semaste    }
150254721Semaste
151254721Semaste    void
152254721Semaste    SetData (EventData *new_data)
153254721Semaste    {
154254721Semaste        m_data_ap.reset (new_data);
155254721Semaste    }
156254721Semaste
157254721Semaste    uint32_t
158254721Semaste    GetType () const
159254721Semaste    {
160254721Semaste        return m_type;
161254721Semaste    }
162254721Semaste
163254721Semaste    void
164254721Semaste    SetType (uint32_t new_type)
165254721Semaste    {
166254721Semaste        m_type = new_type;
167254721Semaste    }
168254721Semaste
169254721Semaste    Broadcaster *
170254721Semaste    GetBroadcaster () const
171254721Semaste    {
172254721Semaste        return m_broadcaster;
173254721Semaste    }
174254721Semaste
175254721Semaste    bool
176254721Semaste    BroadcasterIs (Broadcaster *broadcaster)
177254721Semaste    {
178254721Semaste        return broadcaster == m_broadcaster;
179254721Semaste    }
180254721Semaste
181254721Semaste    void
182254721Semaste    Clear()
183254721Semaste    {
184254721Semaste        m_data_ap.reset();
185254721Semaste    }
186254721Semaste
187254721Semaste
188254721Semasteprivate:
189254721Semaste    // This is only called by Listener when it pops an event off the queue for
190254721Semaste    // the listener.  It calls the Event Data's DoOnRemoval() method, which is
191254721Semaste    // virtual and can be overridden by the specific data classes.
192254721Semaste
193254721Semaste    void
194254721Semaste    DoOnRemoval ();
195254721Semaste
196254721Semaste    // Called by Broadcaster::BroadcastEvent prior to letting all the listeners
197254721Semaste    // know about it update the contained broadcaster so that events can be
198254721Semaste    // popped off one queue and re-broadcast to others.
199254721Semaste    void
200254721Semaste    SetBroadcaster (Broadcaster *broadcaster)
201254721Semaste    {
202254721Semaste        m_broadcaster = broadcaster;
203254721Semaste    }
204254721Semaste
205254721Semaste
206254721Semaste    Broadcaster *   m_broadcaster;  // The broadcaster that sent this event
207254721Semaste    uint32_t        m_type;         // The bit describing this event
208254721Semaste    std::unique_ptr<EventData> m_data_ap;         // User specific data for this event
209254721Semaste
210254721Semaste
211254721Semaste    DISALLOW_COPY_AND_ASSIGN (Event);
212254721Semaste    Event();    // Disallow default constructor
213254721Semaste};
214254721Semaste
215254721Semaste} // namespace lldb_private
216254721Semaste
217254721Semaste#endif  // liblldb_Event_h_
218