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 (),
28efabb123SGreg Clayton     m_opaque_ptr (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))),
34efabb123SGreg Clayton     m_opaque_ptr (m_event_sp.get())
3530fdc8d8SChris Lattner {
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner SBEvent::SBEvent (EventSP &event_sp) :
3930fdc8d8SChris Lattner     m_event_sp (event_sp),
40efabb123SGreg Clayton     m_opaque_ptr (event_sp.get())
4130fdc8d8SChris Lattner {
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
44efabb123SGreg Clayton SBEvent::SBEvent (const SBEvent &rhs) :
45efabb123SGreg Clayton     m_event_sp (rhs.m_event_sp),
46efabb123SGreg Clayton     m_opaque_ptr (rhs.m_opaque_ptr)
47efabb123SGreg Clayton {
48efabb123SGreg Clayton 
49efabb123SGreg Clayton }
50efabb123SGreg Clayton 
51efabb123SGreg Clayton const SBEvent &
52efabb123SGreg Clayton SBEvent::operator = (const SBEvent &rhs)
53efabb123SGreg Clayton {
54efabb123SGreg Clayton     if (this != &rhs)
55efabb123SGreg Clayton     {
56efabb123SGreg Clayton         m_event_sp = rhs.m_event_sp;
57efabb123SGreg Clayton         m_opaque_ptr = rhs.m_opaque_ptr;
58efabb123SGreg Clayton     }
59efabb123SGreg Clayton     return *this;
60efabb123SGreg Clayton }
61efabb123SGreg Clayton 
6230fdc8d8SChris Lattner SBEvent::~SBEvent()
6330fdc8d8SChris Lattner {
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner const char *
6730fdc8d8SChris Lattner SBEvent::GetDataFlavor ()
6830fdc8d8SChris Lattner {
696611103cSGreg Clayton     Event *lldb_event = get();
7030fdc8d8SChris Lattner     if (lldb_event)
7130fdc8d8SChris Lattner         return lldb_event->GetData()->GetFlavor().AsCString();
7230fdc8d8SChris Lattner     return NULL;
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
7530fdc8d8SChris Lattner uint32_t
7630fdc8d8SChris Lattner SBEvent::GetType () const
7730fdc8d8SChris Lattner {
78*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
79ceb6b139SCaroline Tice 
806611103cSGreg Clayton     const Event *lldb_event = get();
81ceb6b139SCaroline Tice     uint32_t event_type = 0;
8230fdc8d8SChris Lattner     if (lldb_event)
83ceb6b139SCaroline Tice         event_type = lldb_event->GetType();
84ceb6b139SCaroline Tice 
85ceb6b139SCaroline Tice     if (log)
86cfd1acedSGreg Clayton     {
87cfd1acedSGreg Clayton         StreamString sstr;
88cfd1acedSGreg Clayton         if (lldb_event && lldb_event->GetBroadcaster() && lldb_event->GetBroadcaster()->GetEventNames(sstr, event_type, true))
89cfd1acedSGreg Clayton             log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x (%s)", get(), event_type, sstr.GetData());
90cfd1acedSGreg Clayton         else
9193aa84e8SGreg Clayton             log->Printf ("SBEvent(%p)::GetType () => 0x%8.8x", get(), event_type);
92ceb6b139SCaroline Tice 
93cfd1acedSGreg Clayton     }
94cfd1acedSGreg Clayton 
95ceb6b139SCaroline Tice     return event_type;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner SBBroadcaster
9930fdc8d8SChris Lattner SBEvent::GetBroadcaster () const
10030fdc8d8SChris Lattner {
10130fdc8d8SChris Lattner     SBBroadcaster broadcaster;
1026611103cSGreg Clayton     const Event *lldb_event = get();
10330fdc8d8SChris Lattner     if (lldb_event)
1046611103cSGreg Clayton         broadcaster.reset (lldb_event->GetBroadcaster(), false);
10530fdc8d8SChris Lattner     return broadcaster;
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
10830fdc8d8SChris Lattner bool
10930fdc8d8SChris Lattner SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
11030fdc8d8SChris Lattner {
11130fdc8d8SChris Lattner     if (broadcaster)
112cfd1acedSGreg Clayton         return BroadcasterMatchesRef (*broadcaster);
11330fdc8d8SChris Lattner     return false;
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
11630fdc8d8SChris Lattner bool
11730fdc8d8SChris Lattner SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
11830fdc8d8SChris Lattner {
119ceb6b139SCaroline Tice 
1206611103cSGreg Clayton     Event *lldb_event = get();
121ceb6b139SCaroline Tice     bool success = false;
12230fdc8d8SChris Lattner     if (lldb_event)
123ceb6b139SCaroline Tice         success = lldb_event->BroadcasterIs (broadcaster.get());
124ceb6b139SCaroline Tice 
125cfd1acedSGreg Clayton     // For logging, this gets a little chatty so only enable this when verbose logging is on
126*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE));
127ceb6b139SCaroline Tice     if (log)
128cfd1acedSGreg Clayton         log->Printf ("SBEvent(%p)::BroadcasterMatchesRef (SBBroadcaster(%p): %s) => %i",
12993aa84e8SGreg Clayton                      get(),
13093aa84e8SGreg Clayton                      broadcaster.get(),
131cfd1acedSGreg Clayton                      broadcaster.GetName(),
1324838131bSGreg Clayton                      success);
133ceb6b139SCaroline Tice 
134ceb6b139SCaroline Tice     return success;
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
13730fdc8d8SChris Lattner void
13830fdc8d8SChris Lattner SBEvent::Clear()
13930fdc8d8SChris Lattner {
1406611103cSGreg Clayton     Event *lldb_event = get();
14130fdc8d8SChris Lattner     if (lldb_event)
14230fdc8d8SChris Lattner         lldb_event->Clear();
14330fdc8d8SChris Lattner }
14430fdc8d8SChris Lattner 
14530fdc8d8SChris Lattner EventSP &
1466611103cSGreg Clayton SBEvent::GetSP () const
14730fdc8d8SChris Lattner {
14830fdc8d8SChris Lattner     return m_event_sp;
14930fdc8d8SChris Lattner }
15030fdc8d8SChris Lattner 
15130fdc8d8SChris Lattner Event *
1526611103cSGreg Clayton SBEvent::get() const
15330fdc8d8SChris Lattner {
15430fdc8d8SChris Lattner     // There is a dangerous accessor call GetSharedPtr which can be used, so if
15530fdc8d8SChris Lattner     // we have anything valid in m_event_sp, we must use that since if it gets
15630fdc8d8SChris Lattner     // used by a function that puts something in there, then it won't update
157efabb123SGreg Clayton     // m_opaque_ptr...
15830fdc8d8SChris Lattner     if (m_event_sp)
159efabb123SGreg Clayton         m_opaque_ptr = m_event_sp.get();
16030fdc8d8SChris Lattner 
161efabb123SGreg Clayton     return m_opaque_ptr;
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner void
1656611103cSGreg Clayton SBEvent::reset (EventSP &event_sp)
16630fdc8d8SChris Lattner {
16730fdc8d8SChris Lattner     m_event_sp = event_sp;
168efabb123SGreg Clayton     m_opaque_ptr = m_event_sp.get();
16930fdc8d8SChris Lattner }
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner void
1726611103cSGreg Clayton SBEvent::reset (Event* event_ptr)
17330fdc8d8SChris Lattner {
174efabb123SGreg Clayton     m_opaque_ptr = event_ptr;
17530fdc8d8SChris Lattner     m_event_sp.reset();
17630fdc8d8SChris Lattner }
17730fdc8d8SChris Lattner 
17830fdc8d8SChris Lattner bool
17930fdc8d8SChris Lattner SBEvent::IsValid() const
18030fdc8d8SChris Lattner {
181efabb123SGreg Clayton     // Do NOT use m_opaque_ptr directly!!! Must use the SBEvent::get()
1826611103cSGreg Clayton     // accessor. See comments in SBEvent::get()....
1836611103cSGreg Clayton     return SBEvent::get() != NULL;
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner }
18630fdc8d8SChris Lattner 
18730fdc8d8SChris Lattner const char *
18830fdc8d8SChris Lattner SBEvent::GetCStringFromEvent (const SBEvent &event)
18930fdc8d8SChris Lattner {
190*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
191ceb6b139SCaroline Tice 
192ceb6b139SCaroline Tice     if (log)
193cfd1acedSGreg Clayton         log->Printf ("SBEvent(%p)::GetCStringFromEvent () => \"%s\"",
19493aa84e8SGreg Clayton                      event.get(),
195ceb6b139SCaroline Tice                      reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())));
196ceb6b139SCaroline Tice 
1976611103cSGreg Clayton     return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
20030fdc8d8SChris Lattner 
201dde9cff3SCaroline Tice bool
202dde9cff3SCaroline Tice SBEvent::GetDescription (SBStream &description)
203dde9cff3SCaroline Tice {
20493aa84e8SGreg Clayton     if (get())
205dde9cff3SCaroline Tice     {
206dac97f31SCaroline Tice         description.ref();
207efabb123SGreg Clayton         m_opaque_ptr->Dump (description.get());
208dde9cff3SCaroline Tice     }
209dde9cff3SCaroline Tice     else
210dde9cff3SCaroline Tice         description.Printf ("No value");
211dde9cff3SCaroline Tice 
212dde9cff3SCaroline Tice     return true;
213dde9cff3SCaroline Tice }
214ceb6b139SCaroline Tice 
215ceb6b139SCaroline Tice bool
216ceb6b139SCaroline Tice SBEvent::GetDescription (SBStream &description) const
217ceb6b139SCaroline Tice {
21893aa84e8SGreg Clayton     if (get())
219ceb6b139SCaroline Tice     {
220ceb6b139SCaroline Tice         description.ref();
221efabb123SGreg Clayton         m_opaque_ptr->Dump (description.get());
222ceb6b139SCaroline Tice     }
223ceb6b139SCaroline Tice     else
224ceb6b139SCaroline Tice         description.Printf ("No value");
225ceb6b139SCaroline Tice 
226ceb6b139SCaroline Tice     return true;
227ceb6b139SCaroline Tice }
228