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"
12*dde9cff3SCaroline 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 {
606611103cSGreg Clayton     const Event *lldb_event = get();
6130fdc8d8SChris Lattner     if (lldb_event)
6230fdc8d8SChris Lattner         return lldb_event->GetType();
6330fdc8d8SChris Lattner     return 0;
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner SBBroadcaster
6730fdc8d8SChris Lattner SBEvent::GetBroadcaster () const
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner     SBBroadcaster broadcaster;
706611103cSGreg Clayton     const Event *lldb_event = get();
7130fdc8d8SChris Lattner     if (lldb_event)
726611103cSGreg Clayton         broadcaster.reset (lldb_event->GetBroadcaster(), false);
7330fdc8d8SChris Lattner     return broadcaster;
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner bool
7730fdc8d8SChris Lattner SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
7830fdc8d8SChris Lattner {
7930fdc8d8SChris Lattner     if (broadcaster)
8030fdc8d8SChris Lattner     {
816611103cSGreg Clayton         Event *lldb_event = get();
8230fdc8d8SChris Lattner         if (lldb_event)
836611103cSGreg Clayton             return lldb_event->BroadcasterIs (broadcaster->get());
8430fdc8d8SChris Lattner     }
8530fdc8d8SChris Lattner     return false;
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
8830fdc8d8SChris Lattner bool
8930fdc8d8SChris Lattner SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster)
9030fdc8d8SChris Lattner {
916611103cSGreg Clayton     Event *lldb_event = get();
9230fdc8d8SChris Lattner     if (lldb_event)
936611103cSGreg Clayton         return lldb_event->BroadcasterIs (broadcaster.get());
9430fdc8d8SChris Lattner     return false;
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner void
9830fdc8d8SChris Lattner SBEvent::Clear()
9930fdc8d8SChris Lattner {
1006611103cSGreg Clayton     Event *lldb_event = get();
10130fdc8d8SChris Lattner     if (lldb_event)
10230fdc8d8SChris Lattner         lldb_event->Clear();
10330fdc8d8SChris Lattner }
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner EventSP &
1066611103cSGreg Clayton SBEvent::GetSP () const
10730fdc8d8SChris Lattner {
10830fdc8d8SChris Lattner     return m_event_sp;
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
11130fdc8d8SChris Lattner Event *
1126611103cSGreg Clayton SBEvent::get() const
11330fdc8d8SChris Lattner {
11430fdc8d8SChris Lattner     // There is a dangerous accessor call GetSharedPtr which can be used, so if
11530fdc8d8SChris Lattner     // we have anything valid in m_event_sp, we must use that since if it gets
11630fdc8d8SChris Lattner     // used by a function that puts something in there, then it won't update
1176611103cSGreg Clayton     // m_opaque...
11830fdc8d8SChris Lattner     if (m_event_sp)
1196611103cSGreg Clayton         m_opaque = m_event_sp.get();
12030fdc8d8SChris Lattner 
1216611103cSGreg Clayton     return m_opaque;
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
12430fdc8d8SChris Lattner void
1256611103cSGreg Clayton SBEvent::reset (EventSP &event_sp)
12630fdc8d8SChris Lattner {
12730fdc8d8SChris Lattner     m_event_sp = event_sp;
1286611103cSGreg Clayton     m_opaque = m_event_sp.get();
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
13130fdc8d8SChris Lattner void
1326611103cSGreg Clayton SBEvent::reset (Event* event_ptr)
13330fdc8d8SChris Lattner {
1346611103cSGreg Clayton     m_opaque = event_ptr;
13530fdc8d8SChris Lattner     m_event_sp.reset();
13630fdc8d8SChris Lattner }
13730fdc8d8SChris Lattner 
13830fdc8d8SChris Lattner bool
13930fdc8d8SChris Lattner SBEvent::IsValid() const
14030fdc8d8SChris Lattner {
1416611103cSGreg Clayton     // Do NOT use m_opaque directly!!! Must use the SBEvent::get()
1426611103cSGreg Clayton     // accessor. See comments in SBEvent::get()....
1436611103cSGreg Clayton     return SBEvent::get() != NULL;
14430fdc8d8SChris Lattner 
14530fdc8d8SChris Lattner }
14630fdc8d8SChris Lattner 
14730fdc8d8SChris Lattner const char *
14830fdc8d8SChris Lattner SBEvent::GetCStringFromEvent (const SBEvent &event)
14930fdc8d8SChris Lattner {
1506611103cSGreg Clayton     return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get()));
15130fdc8d8SChris Lattner }
15230fdc8d8SChris Lattner 
15330fdc8d8SChris Lattner 
154*dde9cff3SCaroline Tice bool
155*dde9cff3SCaroline Tice SBEvent::GetDescription (SBStream &description)
156*dde9cff3SCaroline Tice {
157*dde9cff3SCaroline Tice     if (m_opaque)
158*dde9cff3SCaroline Tice       {
159*dde9cff3SCaroline Tice         m_opaque->Dump (description.get());
160*dde9cff3SCaroline Tice       }
161*dde9cff3SCaroline Tice     else
162*dde9cff3SCaroline Tice       description.Printf ("No value");
163*dde9cff3SCaroline Tice 
164*dde9cff3SCaroline Tice     return true;
165*dde9cff3SCaroline Tice }
166*dde9cff3SCaroline Tice 
167*dde9cff3SCaroline Tice PyObject *
168*dde9cff3SCaroline Tice SBEvent::__repr__ ()
169*dde9cff3SCaroline Tice {
170*dde9cff3SCaroline Tice     SBStream description;
171*dde9cff3SCaroline Tice     description.ref();
172*dde9cff3SCaroline Tice     GetDescription (description);
173*dde9cff3SCaroline Tice     return PyString_FromString (description.GetData());
174*dde9cff3SCaroline Tice }
175