blob: 5ba71b0aa3056354be1be094d85145deb8cc7a46 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBEvent.h"
11#include "lldb/API/SBBroadcaster.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013
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
22using namespace lldb;
23using namespace lldb_private;
24
25
26SBEvent::SBEvent () :
27 m_event_sp (),
Greg Clayton538eb822010-11-05 23:17:00 +000028 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000029{
30}
31
32SBEvent::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))),
Greg Clayton538eb822010-11-05 23:17:00 +000034 m_opaque_ptr (m_event_sp.get())
Chris Lattner24943d22010-06-08 16:52:24 +000035{
36}
37
38SBEvent::SBEvent (EventSP &event_sp) :
39 m_event_sp (event_sp),
Greg Clayton538eb822010-11-05 23:17:00 +000040 m_opaque_ptr (event_sp.get())
Chris Lattner24943d22010-06-08 16:52:24 +000041{
42}
43
Greg Clayton538eb822010-11-05 23:17:00 +000044SBEvent::SBEvent (const SBEvent &rhs) :
45 m_event_sp (rhs.m_event_sp),
46 m_opaque_ptr (rhs.m_opaque_ptr)
47{
48
49}
50
51const SBEvent &
52SBEvent::operator = (const SBEvent &rhs)
53{
54 if (this != &rhs)
55 {
56 m_event_sp = rhs.m_event_sp;
57 m_opaque_ptr = rhs.m_opaque_ptr;
58 }
59 return *this;
60}
61
Chris Lattner24943d22010-06-08 16:52:24 +000062SBEvent::~SBEvent()
63{
64}
65
Chris Lattner24943d22010-06-08 16:52:24 +000066const char *
67SBEvent::GetDataFlavor ()
68{
Greg Clayton63094e02010-06-23 01:19:29 +000069 Event *lldb_event = get();
Chris Lattner24943d22010-06-08 16:52:24 +000070 if (lldb_event)
Greg Clayton4f46cd12010-12-05 19:21:02 +000071 {
72 EventData *event_data = lldb_event->GetData();
73 if (event_data)
74 return lldb_event->GetData()->GetFlavor().AsCString();
75 }
Chris Lattner24943d22010-06-08 16:52:24 +000076 return NULL;
77}
78
79uint32_t
80SBEvent::GetType () const
81{
Greg Claytone005f2c2010-11-06 01:53:30 +000082 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000083
Greg Clayton63094e02010-06-23 01:19:29 +000084 const Event *lldb_event = get();
Caroline Tice7826c882010-10-26 03:11:13 +000085 uint32_t event_type = 0;
Chris Lattner24943d22010-06-08 16:52:24 +000086 if (lldb_event)
Caroline Tice7826c882010-10-26 03:11:13 +000087 event_type = lldb_event->GetType();
88
89 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000090 {
91 StreamString sstr;
92 if (lldb_event && lldb_event->GetBroadcaster() && lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true))
93 log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x (%s)", get(), event_type, sstr.GetData());
94 else
95 log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x", get(), event_type);
96
97 }
Caroline Tice7826c882010-10-26 03:11:13 +000098
99 return event_type;
Chris Lattner24943d22010-06-08 16:52:24 +0000100}
101
102SBBroadcaster
103SBEvent::GetBroadcaster () const
104{
105 SBBroadcaster broadcaster;
Greg Clayton63094e02010-06-23 01:19:29 +0000106 const Event *lldb_event = get();
Chris Lattner24943d22010-06-08 16:52:24 +0000107 if (lldb_event)
Greg Clayton63094e02010-06-23 01:19:29 +0000108 broadcaster.reset (lldb_event->GetBroadcaster(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000109 return broadcaster;
110}
111
Jim Ingham5a15e692012-02-16 06:50:00 +0000112const char *
113SBEvent::GetBroadcasterClass () const
114{
115 const Event *lldb_event = get();
116 if (lldb_event)
117 return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
118 else
119 return "unknown class";
120}
121
Chris Lattner24943d22010-06-08 16:52:24 +0000122bool
123SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
124{
125 if (broadcaster)
Greg Clayton49ce6822010-10-31 03:01:06 +0000126 return BroadcasterMatchesRef (*broadcaster);
Chris Lattner24943d22010-06-08 16:52:24 +0000127 return false;
128}
129
130bool
131SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
132{
Caroline Tice7826c882010-10-26 03:11:13 +0000133
Greg Clayton63094e02010-06-23 01:19:29 +0000134 Event *lldb_event = get();
Caroline Tice7826c882010-10-26 03:11:13 +0000135 bool success = false;
Chris Lattner24943d22010-06-08 16:52:24 +0000136 if (lldb_event)
Caroline Tice7826c882010-10-26 03:11:13 +0000137 success = lldb_event->BroadcasterIs (broadcaster.get());
138
Greg Clayton49ce6822010-10-31 03:01:06 +0000139 // For logging, this gets a little chatty so only enable this when verbose logging is on
Greg Claytone005f2c2010-11-06 01:53:30 +0000140 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE));
Caroline Tice7826c882010-10-26 03:11:13 +0000141 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000142 log->Printf ("SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000143 get(),
144 broadcaster.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000145 broadcaster.GetName(),
Greg Claytona66ba462010-10-30 04:51:46 +0000146 success);
Caroline Tice7826c882010-10-26 03:11:13 +0000147
148 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000149}
150
151void
152SBEvent::Clear()
153{
Greg Clayton63094e02010-06-23 01:19:29 +0000154 Event *lldb_event = get();
Chris Lattner24943d22010-06-08 16:52:24 +0000155 if (lldb_event)
156 lldb_event->Clear();
157}
158
159EventSP &
Greg Clayton63094e02010-06-23 01:19:29 +0000160SBEvent::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +0000161{
162 return m_event_sp;
163}
164
165Event *
Greg Clayton63094e02010-06-23 01:19:29 +0000166SBEvent::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000167{
168 // There is a dangerous accessor call GetSharedPtr which can be used, so if
169 // we have anything valid in m_event_sp, we must use that since if it gets
170 // used by a function that puts something in there, then it won't update
Greg Clayton538eb822010-11-05 23:17:00 +0000171 // m_opaque_ptr...
Chris Lattner24943d22010-06-08 16:52:24 +0000172 if (m_event_sp)
Greg Clayton538eb822010-11-05 23:17:00 +0000173 m_opaque_ptr = m_event_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000174
Greg Clayton538eb822010-11-05 23:17:00 +0000175 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000176}
177
178void
Greg Clayton63094e02010-06-23 01:19:29 +0000179SBEvent::reset (EventSP &event_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000180{
181 m_event_sp = event_sp;
Greg Clayton538eb822010-11-05 23:17:00 +0000182 m_opaque_ptr = m_event_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000183}
184
185void
Greg Clayton63094e02010-06-23 01:19:29 +0000186SBEvent::reset (Event* event_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000187{
Greg Clayton538eb822010-11-05 23:17:00 +0000188 m_opaque_ptr = event_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000189 m_event_sp.reset();
190}
191
192bool
193SBEvent::IsValid() const
194{
Greg Clayton538eb822010-11-05 23:17:00 +0000195 // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get()
Greg Clayton63094e02010-06-23 01:19:29 +0000196 // accessor. See comments in SBEvent::get()....
197 return SBEvent::get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000198
199}
200
201const char *
202SBEvent::GetCStringFromEvent (const SBEvent &event)
203{
Greg Claytone005f2c2010-11-06 01:53:30 +0000204 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000205
206 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000207 log->Printf ("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000208 event.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000209 reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())));
210
Greg Clayton63094e02010-06-23 01:19:29 +0000211 return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000212}
213
214
Caroline Tice98f930f2010-09-20 05:20:02 +0000215bool
216SBEvent::GetDescription (SBStream &description)
217{
Greg Clayton96154be2011-11-13 06:57:31 +0000218 Stream &strm = description.ref();
219
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000220 if (get())
Caroline Ticee7a566e2010-09-20 16:21:41 +0000221 {
Greg Clayton96154be2011-11-13 06:57:31 +0000222 m_opaque_ptr->Dump (&strm);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000223 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000224 else
Greg Clayton96154be2011-11-13 06:57:31 +0000225 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000226
227 return true;
228}
Caroline Tice7826c882010-10-26 03:11:13 +0000229
230bool
231SBEvent::GetDescription (SBStream &description) const
232{
Greg Clayton96154be2011-11-13 06:57:31 +0000233 Stream &strm = description.ref();
234
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000235 if (get())
Caroline Tice7826c882010-10-26 03:11:13 +0000236 {
Greg Clayton96154be2011-11-13 06:57:31 +0000237 m_opaque_ptr->Dump (&strm);
Caroline Tice7826c882010-10-26 03:11:13 +0000238 }
239 else
Greg Clayton96154be2011-11-13 06:57:31 +0000240 strm.PutCString ("No value");
Caroline Tice7826c882010-10-26 03:11:13 +0000241
242 return true;
243}