1 //===-- Event.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 // C Includes 11 // C++ Includes 12 // Other libraries and framework includes 13 // Project includes 14 #include "lldb/Core/Event.h" 15 #include "lldb/Core/Broadcaster.h" 16 #include "lldb/Core/DataExtractor.h" 17 #include "lldb/Core/Log.h" 18 #include "lldb/Core/State.h" 19 #include "lldb/Core/Stream.h" 20 #include "lldb/Host/Endian.h" 21 #include "lldb/Target/Process.h" 22 #include <algorithm> 23 24 using namespace lldb; 25 using namespace lldb_private; 26 27 //---------------------------------------------------------------------- 28 // Event constructor 29 //---------------------------------------------------------------------- 30 Event::Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data) : 31 m_broadcaster (broadcaster), 32 m_type (event_type), 33 m_data_ap (data) 34 { 35 } 36 37 Event::Event(uint32_t event_type, EventData *data) : 38 m_broadcaster (NULL), // Set by the broadcaster when this event gets broadcast 39 m_type (event_type), 40 m_data_ap (data) 41 { 42 } 43 44 45 //---------------------------------------------------------------------- 46 // Event destructor 47 //---------------------------------------------------------------------- 48 Event::~Event () 49 { 50 } 51 52 void 53 Event::Dump (Stream *s) const 54 { 55 if (m_broadcaster) 56 { 57 StreamString event_name; 58 if (m_broadcaster->GetEventNames (event_name, m_type, false)) 59 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ", 60 this, 61 m_broadcaster, 62 m_broadcaster->GetBroadcasterName().GetCString(), 63 m_type, 64 event_name.GetString().c_str()); 65 else 66 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ", 67 this, 68 m_broadcaster, 69 m_broadcaster->GetBroadcasterName().GetCString(), 70 m_type); 71 } 72 else 73 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ", this, m_type); 74 75 if (m_data_ap.get() == NULL) 76 s->Printf ("<NULL>"); 77 else 78 { 79 s->PutChar('{'); 80 m_data_ap->Dump (s); 81 s->PutChar('}'); 82 } 83 } 84 85 void 86 Event::DoOnRemoval () 87 { 88 if (m_data_ap.get()) 89 m_data_ap->DoOnRemoval (this); 90 } 91 92 EventData::EventData() 93 { 94 } 95 96 EventData::~EventData() 97 { 98 } 99 100 void 101 EventData::Dump (Stream *s) const 102 { 103 s->PutCString ("Generic Event Data"); 104 } 105 106 EventDataBytes::EventDataBytes () : 107 m_bytes() 108 { 109 } 110 111 EventDataBytes::EventDataBytes (const char *cstr) : 112 m_bytes() 113 { 114 SetBytesFromCString (cstr); 115 } 116 117 EventDataBytes::EventDataBytes (const void *src, size_t src_len) : 118 m_bytes() 119 { 120 SetBytes (src, src_len); 121 } 122 123 EventDataBytes::~EventDataBytes() 124 { 125 } 126 127 const ConstString & 128 EventDataBytes::GetFlavorString () 129 { 130 static ConstString g_flavor ("EventDataBytes"); 131 return g_flavor; 132 } 133 134 const ConstString & 135 EventDataBytes::GetFlavor () const 136 { 137 return EventDataBytes::GetFlavorString (); 138 } 139 140 void 141 EventDataBytes::Dump (Stream *s) const 142 { 143 size_t num_printable_chars = std::count_if (m_bytes.begin(), m_bytes.end(), isprint); 144 if (num_printable_chars == m_bytes.size()) 145 { 146 s->Printf("\"%s\"", m_bytes.c_str()); 147 } 148 else if (m_bytes.size() > 0) 149 { 150 DataExtractor data; 151 data.SetData(&m_bytes[0], m_bytes.size(), lldb::endian::InlHostByteOrder()); 152 data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0); 153 } 154 } 155 156 const void * 157 EventDataBytes::GetBytes() const 158 { 159 if (m_bytes.empty()) 160 return NULL; 161 return &m_bytes[0]; 162 } 163 164 size_t 165 EventDataBytes::GetByteSize() const 166 { 167 return m_bytes.size (); 168 } 169 170 void 171 EventDataBytes::SetBytes (const void *src, size_t src_len) 172 { 173 if (src && src_len > 0) 174 m_bytes.assign ((const char *)src, src_len); 175 else 176 m_bytes.clear(); 177 } 178 179 void 180 EventDataBytes::SetBytesFromCString (const char *cstr) 181 { 182 if (cstr && cstr[0]) 183 m_bytes.assign (cstr); 184 else 185 m_bytes.clear(); 186 } 187 188 189 const void * 190 EventDataBytes::GetBytesFromEvent (const Event *event_ptr) 191 { 192 const EventDataBytes *e = GetEventDataFromEvent (event_ptr); 193 if (e) 194 return e->GetBytes(); 195 return NULL; 196 } 197 198 size_t 199 EventDataBytes::GetByteSizeFromEvent (const Event *event_ptr) 200 { 201 const EventDataBytes *e = GetEventDataFromEvent (event_ptr); 202 if (e) 203 return e->GetByteSize(); 204 return 0; 205 } 206 207 const EventDataBytes * 208 EventDataBytes::GetEventDataFromEvent (const Event *event_ptr) 209 { 210 if (event_ptr) 211 { 212 const EventData *event_data = event_ptr->GetData(); 213 if (event_data && event_data->GetFlavor() == EventDataBytes::GetFlavorString()) 214 return static_cast <const EventDataBytes *> (event_data); 215 } 216 return NULL; 217 } 218 219 void 220 EventDataBytes::SwapBytes (std::string &new_bytes) 221 { 222 m_bytes.swap (new_bytes); 223 } 224 225 226