1 //===-- SBEvent.cpp ---------------------------------------------*- 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 #include "lldb/API/SBEvent.h"
11 #include "lldb/API/SBBroadcaster.h"
12 #include "lldb/API/SBStream.h"
13 
14 #include "lldb/Core/Event.h"
15 #include "lldb/Core/Stream.h"
16 #include "lldb/Core/StreamFile.h"
17 #include "lldb/Core/ConstString.h"
18 #include "lldb/Target/Process.h"
19 #include "lldb/Breakpoint/Breakpoint.h"
20 #include "lldb/Interpreter/CommandInterpreter.h"
21 
22 using namespace lldb;
23 using namespace lldb_private;
24 
25 
26 SBEvent::SBEvent () :
27     m_event_sp (),
28     m_opaque (NULL)
29 {
30 }
31 
32 SBEvent::SBEvent (uint32_t event_type, const char *cstr, uint32_t cstr_len) :
33     m_event_sp (new Event (event_type, new EventDataBytes (cstr, cstr_len))),
34     m_opaque (m_event_sp.get())
35 {
36 }
37 
38 SBEvent::SBEvent (EventSP &event_sp) :
39     m_event_sp (event_sp),
40     m_opaque (event_sp.get())
41 {
42 }
43 
44 SBEvent::~SBEvent()
45 {
46 }
47 
48 const char *
49 SBEvent::GetDataFlavor ()
50 {
51     Event *lldb_event = get();
52     if (lldb_event)
53         return lldb_event->GetData()->GetFlavor().AsCString();
54     return NULL;
55 }
56 
57 uint32_t
58 SBEvent::GetType () const
59 {
60     const Event *lldb_event = get();
61     if (lldb_event)
62         return lldb_event->GetType();
63     return 0;
64 }
65 
66 SBBroadcaster
67 SBEvent::GetBroadcaster () const
68 {
69     SBBroadcaster broadcaster;
70     const Event *lldb_event = get();
71     if (lldb_event)
72         broadcaster.reset (lldb_event->GetBroadcaster(), false);
73     return broadcaster;
74 }
75 
76 bool
77 SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
78 {
79     if (broadcaster)
80     {
81         Event *lldb_event = get();
82         if (lldb_event)
83             return lldb_event->BroadcasterIs (broadcaster->get());
84     }
85     return false;
86 }
87 
88 bool
89 SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
90 {
91     Event *lldb_event = get();
92     if (lldb_event)
93         return lldb_event->BroadcasterIs (broadcaster.get());
94     return false;
95 }
96 
97 void
98 SBEvent::Clear()
99 {
100     Event *lldb_event = get();
101     if (lldb_event)
102         lldb_event->Clear();
103 }
104 
105 EventSP &
106 SBEvent::GetSP () const
107 {
108     return m_event_sp;
109 }
110 
111 Event *
112 SBEvent::get() const
113 {
114     // There is a dangerous accessor call GetSharedPtr which can be used, so if
115     // we have anything valid in m_event_sp, we must use that since if it gets
116     // used by a function that puts something in there, then it won't update
117     // m_opaque...
118     if (m_event_sp)
119         m_opaque = m_event_sp.get();
120 
121     return m_opaque;
122 }
123 
124 void
125 SBEvent::reset (EventSP &event_sp)
126 {
127     m_event_sp = event_sp;
128     m_opaque = m_event_sp.get();
129 }
130 
131 void
132 SBEvent::reset (Event* event_ptr)
133 {
134     m_opaque = event_ptr;
135     m_event_sp.reset();
136 }
137 
138 bool
139 SBEvent::IsValid() const
140 {
141     // Do NOT use m_opaque directly!!! Must use the SBEvent::get()
142     // accessor. See comments in SBEvent::get()....
143     return SBEvent::get() != NULL;
144 
145 }
146 
147 const char *
148 SBEvent::GetCStringFromEvent (const SBEvent &event)
149 {
150     return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
151 }
152 
153 
154 bool
155 SBEvent::GetDescription (SBStream &description)
156 {
157     if (m_opaque)
158     {
159         description.ref();
160         m_opaque->Dump (description.get());
161     }
162     else
163         description.Printf ("No value");
164 
165     return true;
166 }
167