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 {
36750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
37ceb6b139SCaroline Tice 
38ceb6b139SCaroline Tice     if (log)
39ceb6b139SCaroline Tice     {
40*93aa84e8SGreg Clayton         log->Printf ("SBEvent::SBEvent (event_type=0x%8.8x, cstr='%s', cstr_len=%d) => SBEvent(%p)",
41*93aa84e8SGreg Clayton                      event_type,
42*93aa84e8SGreg Clayton                      cstr,
43*93aa84e8SGreg Clayton                      cstr_len,
44*93aa84e8SGreg Clayton                      m_opaque);
45ceb6b139SCaroline Tice     }
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner SBEvent::SBEvent (EventSP &event_sp) :
4930fdc8d8SChris Lattner     m_event_sp (event_sp),
506611103cSGreg Clayton     m_opaque (event_sp.get())
5130fdc8d8SChris Lattner {
52750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
53ceb6b139SCaroline Tice 
54ceb6b139SCaroline Tice     if (log)
55*93aa84e8SGreg Clayton         log->Printf ("SBEvent::SBEvent (event_sp=%p) => SBEvent(%p)", event_sp.get(), m_opaque);
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner SBEvent::~SBEvent()
5930fdc8d8SChris Lattner {
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
6230fdc8d8SChris Lattner const char *
6330fdc8d8SChris Lattner SBEvent::GetDataFlavor ()
6430fdc8d8SChris Lattner {
656611103cSGreg Clayton     Event *lldb_event = get();
6630fdc8d8SChris Lattner     if (lldb_event)
6730fdc8d8SChris Lattner         return lldb_event->GetData()->GetFlavor().AsCString();
6830fdc8d8SChris Lattner     return NULL;
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner uint32_t
7230fdc8d8SChris Lattner SBEvent::GetType () const
7330fdc8d8SChris Lattner {
74ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
75ceb6b139SCaroline Tice 
766611103cSGreg Clayton     const Event *lldb_event = get();
77ceb6b139SCaroline Tice     uint32_t event_type = 0;
7830fdc8d8SChris Lattner     if (lldb_event)
79ceb6b139SCaroline Tice         event_type = lldb_event->GetType();
80ceb6b139SCaroline Tice 
81ceb6b139SCaroline Tice     if (log)
82*93aa84e8SGreg Clayton         log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x", get(), event_type);
83ceb6b139SCaroline Tice 
84ceb6b139SCaroline Tice     return event_type;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner SBBroadcaster
8830fdc8d8SChris Lattner SBEvent::GetBroadcaster () const
8930fdc8d8SChris Lattner {
9030fdc8d8SChris Lattner     SBBroadcaster broadcaster;
916611103cSGreg Clayton     const Event *lldb_event = get();
9230fdc8d8SChris Lattner     if (lldb_event)
936611103cSGreg Clayton         broadcaster.reset (lldb_event->GetBroadcaster(), false);
9430fdc8d8SChris Lattner     return broadcaster;
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner bool
9830fdc8d8SChris Lattner SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
9930fdc8d8SChris Lattner {
10030fdc8d8SChris Lattner     if (broadcaster)
10130fdc8d8SChris Lattner     {
1026611103cSGreg Clayton         Event *lldb_event = get();
10330fdc8d8SChris Lattner         if (lldb_event)
1046611103cSGreg Clayton             return lldb_event->BroadcasterIs (broadcaster->get());
10530fdc8d8SChris Lattner     }
10630fdc8d8SChris Lattner     return false;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner bool
11030fdc8d8SChris Lattner SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
11130fdc8d8SChris Lattner {
112ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
113ceb6b139SCaroline Tice 
1146611103cSGreg Clayton     Event *lldb_event = get();
115ceb6b139SCaroline Tice     bool success = false;
11630fdc8d8SChris Lattner     if (lldb_event)
117ceb6b139SCaroline Tice         success = lldb_event->BroadcasterIs (broadcaster.get());
118ceb6b139SCaroline Tice 
119ceb6b139SCaroline Tice     if (log)
120*93aa84e8SGreg Clayton         log->Printf ("SBEvent(%p)::BroadcasterMathesRef (broadcaster.ptr=%p) => %s",
121*93aa84e8SGreg Clayton                      get(),
122*93aa84e8SGreg Clayton                      broadcaster.get(),
123*93aa84e8SGreg Clayton                      success ? "true" : "false");
124ceb6b139SCaroline Tice 
125ceb6b139SCaroline Tice     return success;
12630fdc8d8SChris Lattner }
12730fdc8d8SChris Lattner 
12830fdc8d8SChris Lattner void
12930fdc8d8SChris Lattner SBEvent::Clear()
13030fdc8d8SChris Lattner {
1316611103cSGreg Clayton     Event *lldb_event = get();
13230fdc8d8SChris Lattner     if (lldb_event)
13330fdc8d8SChris Lattner         lldb_event->Clear();
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13630fdc8d8SChris Lattner EventSP &
1376611103cSGreg Clayton SBEvent::GetSP () const
13830fdc8d8SChris Lattner {
13930fdc8d8SChris Lattner     return m_event_sp;
14030fdc8d8SChris Lattner }
14130fdc8d8SChris Lattner 
14230fdc8d8SChris Lattner Event *
1436611103cSGreg Clayton SBEvent::get() const
14430fdc8d8SChris Lattner {
14530fdc8d8SChris Lattner     // There is a dangerous accessor call GetSharedPtr which can be used, so if
14630fdc8d8SChris Lattner     // we have anything valid in m_event_sp, we must use that since if it gets
14730fdc8d8SChris Lattner     // used by a function that puts something in there, then it won't update
1486611103cSGreg Clayton     // m_opaque...
14930fdc8d8SChris Lattner     if (m_event_sp)
1506611103cSGreg Clayton         m_opaque = m_event_sp.get();
15130fdc8d8SChris Lattner 
1526611103cSGreg Clayton     return m_opaque;
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
15530fdc8d8SChris Lattner void
1566611103cSGreg Clayton SBEvent::reset (EventSP &event_sp)
15730fdc8d8SChris Lattner {
15830fdc8d8SChris Lattner     m_event_sp = event_sp;
1596611103cSGreg Clayton     m_opaque = m_event_sp.get();
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner void
1636611103cSGreg Clayton SBEvent::reset (Event* event_ptr)
16430fdc8d8SChris Lattner {
1656611103cSGreg Clayton     m_opaque = event_ptr;
16630fdc8d8SChris Lattner     m_event_sp.reset();
16730fdc8d8SChris Lattner }
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner bool
17030fdc8d8SChris Lattner SBEvent::IsValid() const
17130fdc8d8SChris Lattner {
1726611103cSGreg Clayton     // Do NOT use m_opaque directly!!! Must use the SBEvent::get()
1736611103cSGreg Clayton     // accessor. See comments in SBEvent::get()....
1746611103cSGreg Clayton     return SBEvent::get() != NULL;
17530fdc8d8SChris Lattner 
17630fdc8d8SChris Lattner }
17730fdc8d8SChris Lattner 
17830fdc8d8SChris Lattner const char *
17930fdc8d8SChris Lattner SBEvent::GetCStringFromEvent (const SBEvent &event)
18030fdc8d8SChris Lattner {
181ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
182ceb6b139SCaroline Tice 
183ceb6b139SCaroline Tice     if (log)
184*93aa84e8SGreg Clayton         log->Printf ("SBEvent(%p)::GetCStringFromEvent () => '%s'",
185*93aa84e8SGreg Clayton                      event.get(),
186ceb6b139SCaroline Tice                      reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())));
187ceb6b139SCaroline Tice 
1886611103cSGreg Clayton     return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
18930fdc8d8SChris Lattner }
19030fdc8d8SChris Lattner 
19130fdc8d8SChris Lattner 
192dde9cff3SCaroline Tice bool
193dde9cff3SCaroline Tice SBEvent::GetDescription (SBStream &description)
194dde9cff3SCaroline Tice {
195*93aa84e8SGreg Clayton     if (get())
196dde9cff3SCaroline Tice     {
197dac97f31SCaroline Tice         description.ref();
198dde9cff3SCaroline Tice         m_opaque->Dump (description.get());
199dde9cff3SCaroline Tice     }
200dde9cff3SCaroline Tice     else
201dde9cff3SCaroline Tice         description.Printf ("No value");
202dde9cff3SCaroline Tice 
203dde9cff3SCaroline Tice     return true;
204dde9cff3SCaroline Tice }
205ceb6b139SCaroline Tice 
206ceb6b139SCaroline Tice bool
207ceb6b139SCaroline Tice SBEvent::GetDescription (SBStream &description) const
208ceb6b139SCaroline Tice {
209*93aa84e8SGreg Clayton     if (get())
210ceb6b139SCaroline Tice     {
211ceb6b139SCaroline Tice         description.ref();
212ceb6b139SCaroline Tice         m_opaque->Dump (description.get());
213ceb6b139SCaroline Tice     }
214ceb6b139SCaroline Tice     else
215ceb6b139SCaroline Tice         description.Printf ("No value");
216ceb6b139SCaroline Tice 
217ceb6b139SCaroline Tice     return true;
218ceb6b139SCaroline Tice }
219