130fdc8d8SChris Lattner //===-- SBEvent.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1093a64300SDaniel Malea #include "lldb/lldb-python.h"
1193a64300SDaniel Malea 
124c5de699SEli Friedman #include "lldb/API/SBEvent.h"
134c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner #include "lldb/Core/Event.h"
1730fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
1830fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
1930fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
2030fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2130fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
2230fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
2330fdc8d8SChris Lattner 
2430fdc8d8SChris Lattner using namespace lldb;
2530fdc8d8SChris Lattner using namespace lldb_private;
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner SBEvent::SBEvent () :
2930fdc8d8SChris Lattner     m_event_sp (),
30efabb123SGreg Clayton     m_opaque_ptr (NULL)
3130fdc8d8SChris Lattner {
3230fdc8d8SChris Lattner }
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner SBEvent::SBEvent (uint32_t event_type, const char *cstr, uint32_t cstr_len) :
3530fdc8d8SChris Lattner     m_event_sp (new Event (event_type, new EventDataBytes (cstr, cstr_len))),
36efabb123SGreg Clayton     m_opaque_ptr (m_event_sp.get())
3730fdc8d8SChris Lattner {
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner SBEvent::SBEvent (EventSP &event_sp) :
4130fdc8d8SChris Lattner     m_event_sp (event_sp),
42efabb123SGreg Clayton     m_opaque_ptr (event_sp.get())
4330fdc8d8SChris Lattner {
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
46*2bdbfd50SJim Ingham SBEvent::SBEvent (Event *event_ptr) :
47*2bdbfd50SJim Ingham     m_event_sp (),
48*2bdbfd50SJim Ingham     m_opaque_ptr (event_ptr)
49*2bdbfd50SJim Ingham {
50*2bdbfd50SJim Ingham }
51*2bdbfd50SJim Ingham 
52efabb123SGreg Clayton SBEvent::SBEvent (const SBEvent &rhs) :
53efabb123SGreg Clayton     m_event_sp (rhs.m_event_sp),
54efabb123SGreg Clayton     m_opaque_ptr (rhs.m_opaque_ptr)
55efabb123SGreg Clayton {
56efabb123SGreg Clayton 
57efabb123SGreg Clayton }
58efabb123SGreg Clayton 
59efabb123SGreg Clayton const SBEvent &
60efabb123SGreg Clayton SBEvent::operator = (const SBEvent &rhs)
61efabb123SGreg Clayton {
62efabb123SGreg Clayton     if (this != &rhs)
63efabb123SGreg Clayton     {
64efabb123SGreg Clayton         m_event_sp = rhs.m_event_sp;
65efabb123SGreg Clayton         m_opaque_ptr = rhs.m_opaque_ptr;
66efabb123SGreg Clayton     }
67efabb123SGreg Clayton     return *this;
68efabb123SGreg Clayton }
69efabb123SGreg Clayton 
7030fdc8d8SChris Lattner SBEvent::~SBEvent()
7130fdc8d8SChris Lattner {
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
7430fdc8d8SChris Lattner const char *
7530fdc8d8SChris Lattner SBEvent::GetDataFlavor ()
7630fdc8d8SChris Lattner {
776611103cSGreg Clayton     Event *lldb_event = get();
7830fdc8d8SChris Lattner     if (lldb_event)
79920c696cSGreg Clayton     {
80920c696cSGreg Clayton         EventData *event_data = lldb_event->GetData();
81920c696cSGreg Clayton         if (event_data)
8230fdc8d8SChris Lattner             return lldb_event->GetData()->GetFlavor().AsCString();
83920c696cSGreg Clayton     }
8430fdc8d8SChris Lattner     return NULL;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner uint32_t
8830fdc8d8SChris Lattner SBEvent::GetType () const
8930fdc8d8SChris Lattner {
905160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
91ceb6b139SCaroline Tice 
926611103cSGreg Clayton     const Event *lldb_event = get();
93ceb6b139SCaroline Tice     uint32_t event_type = 0;
9430fdc8d8SChris Lattner     if (lldb_event)
95ceb6b139SCaroline Tice         event_type = lldb_event->GetType();
96ceb6b139SCaroline Tice 
97ceb6b139SCaroline Tice     if (log)
98cfd1acedSGreg Clayton     {
99cfd1acedSGreg Clayton         StreamString sstr;
100cfd1acedSGreg Clayton         if (lldb_event && lldb_event->GetBroadcaster() && lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true))
101324a1036SSaleem Abdulrasool             log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x (%s)",
102324a1036SSaleem Abdulrasool                          static_cast<void*>(get()), event_type, sstr.GetData());
103cfd1acedSGreg Clayton         else
104324a1036SSaleem Abdulrasool             log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x",
105324a1036SSaleem Abdulrasool                          static_cast<void*>(get()), event_type);
106ceb6b139SCaroline Tice 
107cfd1acedSGreg Clayton     }
108cfd1acedSGreg Clayton 
109ceb6b139SCaroline Tice     return event_type;
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
11230fdc8d8SChris Lattner SBBroadcaster
11330fdc8d8SChris Lattner SBEvent::GetBroadcaster () const
11430fdc8d8SChris Lattner {
11530fdc8d8SChris Lattner     SBBroadcaster broadcaster;
1166611103cSGreg Clayton     const Event *lldb_event = get();
11730fdc8d8SChris Lattner     if (lldb_event)
1186611103cSGreg Clayton         broadcaster.reset (lldb_event->GetBroadcaster(), false);
11930fdc8d8SChris Lattner     return broadcaster;
12030fdc8d8SChris Lattner }
12130fdc8d8SChris Lattner 
1224bddaeb5SJim Ingham const char *
1234bddaeb5SJim Ingham SBEvent::GetBroadcasterClass () const
1244bddaeb5SJim Ingham {
1254bddaeb5SJim Ingham     const Event *lldb_event = get();
1264bddaeb5SJim Ingham     if (lldb_event)
1274bddaeb5SJim Ingham         return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
1284bddaeb5SJim Ingham     else
1294bddaeb5SJim Ingham         return "unknown class";
1304bddaeb5SJim Ingham }
1314bddaeb5SJim Ingham 
13230fdc8d8SChris Lattner bool
13330fdc8d8SChris Lattner SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
13430fdc8d8SChris Lattner {
13530fdc8d8SChris Lattner     if (broadcaster)
136cfd1acedSGreg Clayton         return BroadcasterMatchesRef (*broadcaster);
13730fdc8d8SChris Lattner     return false;
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner bool
14130fdc8d8SChris Lattner SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
14230fdc8d8SChris Lattner {
143ceb6b139SCaroline Tice 
1446611103cSGreg Clayton     Event *lldb_event = get();
145ceb6b139SCaroline Tice     bool success = false;
14630fdc8d8SChris Lattner     if (lldb_event)
147ceb6b139SCaroline Tice         success = lldb_event->BroadcasterIs (broadcaster.get());
148ceb6b139SCaroline Tice 
149cfd1acedSGreg Clayton     // For logging, this gets a little chatty so only enable this when verbose logging is on
1505160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE));
151ceb6b139SCaroline Tice     if (log)
152cfd1acedSGreg Clayton         log->Printf ("SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i",
153324a1036SSaleem Abdulrasool                      static_cast<void*>(get()),
154324a1036SSaleem Abdulrasool                      static_cast<void*>(broadcaster.get()),
155324a1036SSaleem Abdulrasool                      broadcaster.GetName(), success);
156ceb6b139SCaroline Tice 
157ceb6b139SCaroline Tice     return success;
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
16030fdc8d8SChris Lattner void
16130fdc8d8SChris Lattner SBEvent::Clear()
16230fdc8d8SChris Lattner {
1636611103cSGreg Clayton     Event *lldb_event = get();
16430fdc8d8SChris Lattner     if (lldb_event)
16530fdc8d8SChris Lattner         lldb_event->Clear();
16630fdc8d8SChris Lattner }
16730fdc8d8SChris Lattner 
16830fdc8d8SChris Lattner EventSP &
1696611103cSGreg Clayton SBEvent::GetSP () const
17030fdc8d8SChris Lattner {
17130fdc8d8SChris Lattner     return m_event_sp;
17230fdc8d8SChris Lattner }
17330fdc8d8SChris Lattner 
17430fdc8d8SChris Lattner Event *
1756611103cSGreg Clayton SBEvent::get() const
17630fdc8d8SChris Lattner {
17730fdc8d8SChris Lattner     // There is a dangerous accessor call GetSharedPtr which can be used, so if
17830fdc8d8SChris Lattner     // we have anything valid in m_event_sp, we must use that since if it gets
17930fdc8d8SChris Lattner     // used by a function that puts something in there, then it won't update
180efabb123SGreg Clayton     // m_opaque_ptr...
18130fdc8d8SChris Lattner     if (m_event_sp)
182efabb123SGreg Clayton         m_opaque_ptr = m_event_sp.get();
18330fdc8d8SChris Lattner 
184efabb123SGreg Clayton     return m_opaque_ptr;
18530fdc8d8SChris Lattner }
18630fdc8d8SChris Lattner 
18730fdc8d8SChris Lattner void
1886611103cSGreg Clayton SBEvent::reset (EventSP &event_sp)
18930fdc8d8SChris Lattner {
19030fdc8d8SChris Lattner     m_event_sp = event_sp;
191efabb123SGreg Clayton     m_opaque_ptr = m_event_sp.get();
19230fdc8d8SChris Lattner }
19330fdc8d8SChris Lattner 
19430fdc8d8SChris Lattner void
1956611103cSGreg Clayton SBEvent::reset (Event* event_ptr)
19630fdc8d8SChris Lattner {
197efabb123SGreg Clayton     m_opaque_ptr = event_ptr;
19830fdc8d8SChris Lattner     m_event_sp.reset();
19930fdc8d8SChris Lattner }
20030fdc8d8SChris Lattner 
20130fdc8d8SChris Lattner bool
20230fdc8d8SChris Lattner SBEvent::IsValid() const
20330fdc8d8SChris Lattner {
204efabb123SGreg Clayton     // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get()
2056611103cSGreg Clayton     // accessor. See comments in SBEvent::get()....
2066611103cSGreg Clayton     return SBEvent::get() != NULL;
20730fdc8d8SChris Lattner 
20830fdc8d8SChris Lattner }
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner const char *
21130fdc8d8SChris Lattner SBEvent::GetCStringFromEvent (const SBEvent &event)
21230fdc8d8SChris Lattner {
2135160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
214ceb6b139SCaroline Tice 
215ceb6b139SCaroline Tice     if (log)
216cfd1acedSGreg Clayton         log->Printf ("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
217324a1036SSaleem Abdulrasool                      static_cast<void*>(event.get()),
218ceb6b139SCaroline Tice                      reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())));
219ceb6b139SCaroline Tice 
2206611103cSGreg Clayton     return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
22130fdc8d8SChris Lattner }
22230fdc8d8SChris Lattner 
22330fdc8d8SChris Lattner 
224dde9cff3SCaroline Tice bool
225dde9cff3SCaroline Tice SBEvent::GetDescription (SBStream &description)
226dde9cff3SCaroline Tice {
227da7bc7d0SGreg Clayton     Stream &strm = description.ref();
228da7bc7d0SGreg Clayton 
22993aa84e8SGreg Clayton     if (get())
230dde9cff3SCaroline Tice     {
231da7bc7d0SGreg Clayton         m_opaque_ptr->Dump (&strm);
232dde9cff3SCaroline Tice     }
233dde9cff3SCaroline Tice     else
234da7bc7d0SGreg Clayton         strm.PutCString ("No value");
235dde9cff3SCaroline Tice 
236dde9cff3SCaroline Tice     return true;
237dde9cff3SCaroline Tice }
238ceb6b139SCaroline Tice 
239ceb6b139SCaroline Tice bool
240ceb6b139SCaroline Tice SBEvent::GetDescription (SBStream &description) const
241ceb6b139SCaroline Tice {
242da7bc7d0SGreg Clayton     Stream &strm = description.ref();
243da7bc7d0SGreg Clayton 
24493aa84e8SGreg Clayton     if (get())
245ceb6b139SCaroline Tice     {
246da7bc7d0SGreg Clayton         m_opaque_ptr->Dump (&strm);
247ceb6b139SCaroline Tice     }
248ceb6b139SCaroline Tice     else
249da7bc7d0SGreg Clayton         strm.PutCString ("No value");
250ceb6b139SCaroline Tice 
251ceb6b139SCaroline Tice     return true;
252ceb6b139SCaroline Tice }
253