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 
104c5de699SEli Friedman #include "lldb/API/SBEvent.h"
114c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1330fdc8d8SChris Lattner 
1430fdc8d8SChris Lattner #include "lldb/Core/Event.h"
1530fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
1630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
1730fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
1830fdc8d8SChris Lattner #include "lldb/Target/Process.h"
1930fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
2030fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner using namespace lldb;
2330fdc8d8SChris Lattner using namespace lldb_private;
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner SBEvent::SBEvent () :
2730fdc8d8SChris Lattner     m_event_sp (),
286611103cSGreg Clayton     m_opaque (NULL)
2930fdc8d8SChris Lattner {
3030fdc8d8SChris Lattner }
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner SBEvent::SBEvent (uint32_t event_type, const char *cstr, uint32_t cstr_len) :
3330fdc8d8SChris Lattner     m_event_sp (new Event (event_type, new EventDataBytes (cstr, cstr_len))),
346611103cSGreg Clayton     m_opaque (m_event_sp.get())
3530fdc8d8SChris Lattner {
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner SBEvent::SBEvent (EventSP &event_sp) :
3930fdc8d8SChris Lattner     m_event_sp (event_sp),
406611103cSGreg Clayton     m_opaque (event_sp.get())
4130fdc8d8SChris Lattner {
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner SBEvent::~SBEvent()
4530fdc8d8SChris Lattner {
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner const char *
4930fdc8d8SChris Lattner SBEvent::GetDataFlavor ()
5030fdc8d8SChris Lattner {
516611103cSGreg Clayton     Event *lldb_event = get();
5230fdc8d8SChris Lattner     if (lldb_event)
5330fdc8d8SChris Lattner         return lldb_event->GetData()->GetFlavor().AsCString();
5430fdc8d8SChris Lattner     return NULL;
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner uint32_t
5830fdc8d8SChris Lattner SBEvent::GetType () const
5930fdc8d8SChris Lattner {
60ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
61ceb6b139SCaroline Tice 
626611103cSGreg Clayton     const Event *lldb_event = get();
63ceb6b139SCaroline Tice     uint32_t event_type = 0;
6430fdc8d8SChris Lattner     if (lldb_event)
65ceb6b139SCaroline Tice         event_type = lldb_event->GetType();
66ceb6b139SCaroline Tice 
67ceb6b139SCaroline Tice     if (log)
68*cfd1acedSGreg Clayton     {
69*cfd1acedSGreg Clayton         StreamString sstr;
70*cfd1acedSGreg Clayton         if (lldb_event && lldb_event->GetBroadcaster() && lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true))
71*cfd1acedSGreg Clayton             log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x (%s)", get(), event_type, sstr.GetData());
72*cfd1acedSGreg Clayton         else
7393aa84e8SGreg Clayton             log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x", get(), event_type);
74ceb6b139SCaroline Tice 
75*cfd1acedSGreg Clayton     }
76*cfd1acedSGreg Clayton 
77ceb6b139SCaroline Tice     return event_type;
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
8030fdc8d8SChris Lattner SBBroadcaster
8130fdc8d8SChris Lattner SBEvent::GetBroadcaster () const
8230fdc8d8SChris Lattner {
8330fdc8d8SChris Lattner     SBBroadcaster broadcaster;
846611103cSGreg Clayton     const Event *lldb_event = get();
8530fdc8d8SChris Lattner     if (lldb_event)
866611103cSGreg Clayton         broadcaster.reset (lldb_event->GetBroadcaster(), false);
8730fdc8d8SChris Lattner     return broadcaster;
8830fdc8d8SChris Lattner }
8930fdc8d8SChris Lattner 
9030fdc8d8SChris Lattner bool
9130fdc8d8SChris Lattner SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
9230fdc8d8SChris Lattner {
9330fdc8d8SChris Lattner     if (broadcaster)
94*cfd1acedSGreg Clayton         return BroadcasterMatchesRef (*broadcaster);
9530fdc8d8SChris Lattner     return false;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner bool
9930fdc8d8SChris Lattner SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
10030fdc8d8SChris Lattner {
101ceb6b139SCaroline Tice 
1026611103cSGreg Clayton     Event *lldb_event = get();
103ceb6b139SCaroline Tice     bool success = false;
10430fdc8d8SChris Lattner     if (lldb_event)
105ceb6b139SCaroline Tice         success = lldb_event->BroadcasterIs (broadcaster.get());
106ceb6b139SCaroline Tice 
107*cfd1acedSGreg Clayton     // For logging, this gets a little chatty so only enable this when verbose logging is on
108*cfd1acedSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
109ceb6b139SCaroline Tice     if (log)
110*cfd1acedSGreg Clayton         log->Printf ("SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i",
11193aa84e8SGreg Clayton                      get(),
11293aa84e8SGreg Clayton                      broadcaster.get(),
113*cfd1acedSGreg Clayton                      broadcaster.GetName(),
1144838131bSGreg Clayton                      success);
115ceb6b139SCaroline Tice 
116ceb6b139SCaroline Tice     return success;
11730fdc8d8SChris Lattner }
11830fdc8d8SChris Lattner 
11930fdc8d8SChris Lattner void
12030fdc8d8SChris Lattner SBEvent::Clear()
12130fdc8d8SChris Lattner {
1226611103cSGreg Clayton     Event *lldb_event = get();
12330fdc8d8SChris Lattner     if (lldb_event)
12430fdc8d8SChris Lattner         lldb_event->Clear();
12530fdc8d8SChris Lattner }
12630fdc8d8SChris Lattner 
12730fdc8d8SChris Lattner EventSP &
1286611103cSGreg Clayton SBEvent::GetSP () const
12930fdc8d8SChris Lattner {
13030fdc8d8SChris Lattner     return m_event_sp;
13130fdc8d8SChris Lattner }
13230fdc8d8SChris Lattner 
13330fdc8d8SChris Lattner Event *
1346611103cSGreg Clayton SBEvent::get() const
13530fdc8d8SChris Lattner {
13630fdc8d8SChris Lattner     // There is a dangerous accessor call GetSharedPtr which can be used, so if
13730fdc8d8SChris Lattner     // we have anything valid in m_event_sp, we must use that since if it gets
13830fdc8d8SChris Lattner     // used by a function that puts something in there, then it won't update
1396611103cSGreg Clayton     // m_opaque...
14030fdc8d8SChris Lattner     if (m_event_sp)
1416611103cSGreg Clayton         m_opaque = m_event_sp.get();
14230fdc8d8SChris Lattner 
1436611103cSGreg Clayton     return m_opaque;
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
14630fdc8d8SChris Lattner void
1476611103cSGreg Clayton SBEvent::reset (EventSP &event_sp)
14830fdc8d8SChris Lattner {
14930fdc8d8SChris Lattner     m_event_sp = event_sp;
1506611103cSGreg Clayton     m_opaque = m_event_sp.get();
15130fdc8d8SChris Lattner }
15230fdc8d8SChris Lattner 
15330fdc8d8SChris Lattner void
1546611103cSGreg Clayton SBEvent::reset (Event* event_ptr)
15530fdc8d8SChris Lattner {
1566611103cSGreg Clayton     m_opaque = event_ptr;
15730fdc8d8SChris Lattner     m_event_sp.reset();
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
16030fdc8d8SChris Lattner bool
16130fdc8d8SChris Lattner SBEvent::IsValid() const
16230fdc8d8SChris Lattner {
1636611103cSGreg Clayton     // Do NOT use m_opaque directly!!! Must use the SBEvent::get()
1646611103cSGreg Clayton     // accessor. See comments in SBEvent::get()....
1656611103cSGreg Clayton     return SBEvent::get() != NULL;
16630fdc8d8SChris Lattner 
16730fdc8d8SChris Lattner }
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner const char *
17030fdc8d8SChris Lattner SBEvent::GetCStringFromEvent (const SBEvent &event)
17130fdc8d8SChris Lattner {
172ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
173ceb6b139SCaroline Tice 
174ceb6b139SCaroline Tice     if (log)
175*cfd1acedSGreg Clayton         log->Printf ("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
17693aa84e8SGreg Clayton                      event.get(),
177ceb6b139SCaroline Tice                      reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())));
178ceb6b139SCaroline Tice 
1796611103cSGreg Clayton     return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner 
183dde9cff3SCaroline Tice bool
184dde9cff3SCaroline Tice SBEvent::GetDescription (SBStream &description)
185dde9cff3SCaroline Tice {
18693aa84e8SGreg Clayton     if (get())
187dde9cff3SCaroline Tice     {
188dac97f31SCaroline Tice         description.ref();
189dde9cff3SCaroline Tice         m_opaque->Dump (description.get());
190dde9cff3SCaroline Tice     }
191dde9cff3SCaroline Tice     else
192dde9cff3SCaroline Tice         description.Printf ("No value");
193dde9cff3SCaroline Tice 
194dde9cff3SCaroline Tice     return true;
195dde9cff3SCaroline Tice }
196ceb6b139SCaroline Tice 
197ceb6b139SCaroline Tice bool
198ceb6b139SCaroline Tice SBEvent::GetDescription (SBStream &description) const
199ceb6b139SCaroline Tice {
20093aa84e8SGreg Clayton     if (get())
201ceb6b139SCaroline Tice     {
202ceb6b139SCaroline Tice         description.ref();
203ceb6b139SCaroline Tice         m_opaque->Dump (description.get());
204ceb6b139SCaroline Tice     }
205ceb6b139SCaroline Tice     else
206ceb6b139SCaroline Tice         description.Printf ("No value");
207ceb6b139SCaroline Tice 
208ceb6b139SCaroline Tice     return true;
209ceb6b139SCaroline Tice }
210