1 //===-- SBEvent.cpp ---------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/API/SBEvent.h" 11 #include "lldb/API/SBBroadcaster.h" 12 #include "lldb/API/SBStream.h" 13 14 #include "lldb/Core/Event.h" 15 #include "lldb/Core/Stream.h" 16 #include "lldb/Core/StreamFile.h" 17 #include "lldb/Core/ConstString.h" 18 #include "lldb/Target/Process.h" 19 #include "lldb/Breakpoint/Breakpoint.h" 20 #include "lldb/Interpreter/CommandInterpreter.h" 21 22 using namespace lldb; 23 using namespace lldb_private; 24 25 26 SBEvent::SBEvent () : 27 m_event_sp (), 28 m_opaque (NULL) 29 { 30 } 31 32 SBEvent::SBEvent (uint32_t event_type, const char *cstr, uint32_t cstr_len) : 33 m_event_sp (new Event (event_type, new EventDataBytes (cstr, cstr_len))), 34 m_opaque (m_event_sp.get()) 35 { 36 } 37 38 SBEvent::SBEvent (EventSP &event_sp) : 39 m_event_sp (event_sp), 40 m_opaque (event_sp.get()) 41 { 42 } 43 44 SBEvent::~SBEvent() 45 { 46 } 47 48 const char * 49 SBEvent::GetDataFlavor () 50 { 51 Event *lldb_event = get(); 52 if (lldb_event) 53 return lldb_event->GetData()->GetFlavor().AsCString(); 54 return NULL; 55 } 56 57 uint32_t 58 SBEvent::GetType () const 59 { 60 const Event *lldb_event = get(); 61 if (lldb_event) 62 return lldb_event->GetType(); 63 return 0; 64 } 65 66 SBBroadcaster 67 SBEvent::GetBroadcaster () const 68 { 69 SBBroadcaster broadcaster; 70 const Event *lldb_event = get(); 71 if (lldb_event) 72 broadcaster.reset (lldb_event->GetBroadcaster(), false); 73 return broadcaster; 74 } 75 76 bool 77 SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster) 78 { 79 if (broadcaster) 80 { 81 Event *lldb_event = get(); 82 if (lldb_event) 83 return lldb_event->BroadcasterIs (broadcaster->get()); 84 } 85 return false; 86 } 87 88 bool 89 SBEvent::BroadcasterMatchesRef (const SBBroadcaster &broadcaster) 90 { 91 Event *lldb_event = get(); 92 if (lldb_event) 93 return lldb_event->BroadcasterIs (broadcaster.get()); 94 return false; 95 } 96 97 void 98 SBEvent::Clear() 99 { 100 Event *lldb_event = get(); 101 if (lldb_event) 102 lldb_event->Clear(); 103 } 104 105 EventSP & 106 SBEvent::GetSP () const 107 { 108 return m_event_sp; 109 } 110 111 Event * 112 SBEvent::get() const 113 { 114 // There is a dangerous accessor call GetSharedPtr which can be used, so if 115 // we have anything valid in m_event_sp, we must use that since if it gets 116 // used by a function that puts something in there, then it won't update 117 // m_opaque... 118 if (m_event_sp) 119 m_opaque = m_event_sp.get(); 120 121 return m_opaque; 122 } 123 124 void 125 SBEvent::reset (EventSP &event_sp) 126 { 127 m_event_sp = event_sp; 128 m_opaque = m_event_sp.get(); 129 } 130 131 void 132 SBEvent::reset (Event* event_ptr) 133 { 134 m_opaque = event_ptr; 135 m_event_sp.reset(); 136 } 137 138 bool 139 SBEvent::IsValid() const 140 { 141 // Do NOT use m_opaque directly!!! Must use the SBEvent::get() 142 // accessor. See comments in SBEvent::get().... 143 return SBEvent::get() != NULL; 144 145 } 146 147 const char * 148 SBEvent::GetCStringFromEvent (const SBEvent &event) 149 { 150 return reinterpret_cast<const char *>(EventDataBytes::GetBytesFromEvent (event.get())); 151 } 152 153 154 bool 155 SBEvent::GetDescription (SBStream &description) 156 { 157 if (m_opaque) 158 { 159 description.ref(); 160 m_opaque->Dump (description.get()); 161 } 162 else 163 description.Printf ("No value"); 164 165 return true; 166 } 167