blob: f9d0e0cc3a8a6b2a97de48c4d3ec162bbb1c2fe9 [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
112bool
113SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
114{
115 if (broadcaster)
Greg Clayton49ce6822010-10-31 03:01:06 +0000116 return BroadcasterMatchesRef (*broadcaster);
Chris Lattner24943d22010-06-08 16:52:24 +0000117 return false;
118}
119
120bool
121SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
122{
Caroline Tice7826c882010-10-26 03:11:13 +0000123
Greg Clayton63094e02010-06-23 01:19:29 +0000124 Event *lldb_event = get();
Caroline Tice7826c882010-10-26 03:11:13 +0000125 bool success = false;
Chris Lattner24943d22010-06-08 16:52:24 +0000126 if (lldb_event)
Caroline Tice7826c882010-10-26 03:11:13 +0000127 success = lldb_event->BroadcasterIs (broadcaster.get());
128
Greg Clayton49ce6822010-10-31 03:01:06 +0000129 // For logging, this gets a little chatty so only enable this when verbose logging is on
Greg Claytone005f2c2010-11-06 01:53:30 +0000130 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE));
Caroline Tice7826c882010-10-26 03:11:13 +0000131 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000132 log->Printf ("SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000133 get(),
134 broadcaster.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000135 broadcaster.GetName(),
Greg Claytona66ba462010-10-30 04:51:46 +0000136 success);
Caroline Tice7826c882010-10-26 03:11:13 +0000137
138 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000139}
140
141void
142SBEvent::Clear()
143{
Greg Clayton63094e02010-06-23 01:19:29 +0000144 Event *lldb_event = get();
Chris Lattner24943d22010-06-08 16:52:24 +0000145 if (lldb_event)
146 lldb_event->Clear();
147}
148
149EventSP &
Greg Clayton63094e02010-06-23 01:19:29 +0000150SBEvent::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +0000151{
152 return m_event_sp;
153}
154
155Event *
Greg Clayton63094e02010-06-23 01:19:29 +0000156SBEvent::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000157{
158 // There is a dangerous accessor call GetSharedPtr which can be used, so if
159 // we have anything valid in m_event_sp, we must use that since if it gets
160 // used by a function that puts something in there, then it won't update
Greg Clayton538eb822010-11-05 23:17:00 +0000161 // m_opaque_ptr...
Chris Lattner24943d22010-06-08 16:52:24 +0000162 if (m_event_sp)
Greg Clayton538eb822010-11-05 23:17:00 +0000163 m_opaque_ptr = m_event_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000164
Greg Clayton538eb822010-11-05 23:17:00 +0000165 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000166}
167
168void
Greg Clayton63094e02010-06-23 01:19:29 +0000169SBEvent::reset (EventSP &event_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000170{
171 m_event_sp = event_sp;
Greg Clayton538eb822010-11-05 23:17:00 +0000172 m_opaque_ptr = m_event_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000173}
174
175void
Greg Clayton63094e02010-06-23 01:19:29 +0000176SBEvent::reset (Event* event_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000177{
Greg Clayton538eb822010-11-05 23:17:00 +0000178 m_opaque_ptr = event_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000179 m_event_sp.reset();
180}
181
182bool
183SBEvent::IsValid() const
184{
Greg Clayton538eb822010-11-05 23:17:00 +0000185 // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get()
Greg Clayton63094e02010-06-23 01:19:29 +0000186 // accessor. See comments in SBEvent::get()....
187 return SBEvent::get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000188
189}
190
191const char *
192SBEvent::GetCStringFromEvent (const SBEvent &event)
193{
Greg Claytone005f2c2010-11-06 01:53:30 +0000194 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000195
196 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000197 log->Printf ("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000198 event.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000199 reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())));
200
Greg Clayton63094e02010-06-23 01:19:29 +0000201 return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000202}
203
204
Caroline Tice98f930f2010-09-20 05:20:02 +0000205bool
206SBEvent::GetDescription (SBStream &description)
207{
Greg Clayton96154be2011-11-13 06:57:31 +0000208 Stream &strm = description.ref();
209
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000210 if (get())
Caroline Ticee7a566e2010-09-20 16:21:41 +0000211 {
Greg Clayton96154be2011-11-13 06:57:31 +0000212 m_opaque_ptr->Dump (&strm);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000213 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000214 else
Greg Clayton96154be2011-11-13 06:57:31 +0000215 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000216
217 return true;
218}
Caroline Tice7826c882010-10-26 03:11:13 +0000219
220bool
221SBEvent::GetDescription (SBStream &description) const
222{
Greg Clayton96154be2011-11-13 06:57:31 +0000223 Stream &strm = description.ref();
224
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000225 if (get())
Caroline Tice7826c882010-10-26 03:11:13 +0000226 {
Greg Clayton96154be2011-11-13 06:57:31 +0000227 m_opaque_ptr->Dump (&strm);
Caroline Tice7826c882010-10-26 03:11:13 +0000228 }
229 else
Greg Clayton96154be2011-11-13 06:57:31 +0000230 strm.PutCString ("No value");
Caroline Tice7826c882010-10-26 03:11:13 +0000231
232 return true;
233}