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 //----------------------------------------------------------------------
Event(Broadcaster * broadcaster,uint32_t event_type,EventData * data)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
Event(uint32_t event_type,EventData * data)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 //----------------------------------------------------------------------
~Event()48 Event::~Event ()
49 {
50 }
51
52 void
Dump(Stream * s) const53 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
DoOnRemoval()86 Event::DoOnRemoval ()
87 {
88 if (m_data_ap.get())
89 m_data_ap->DoOnRemoval (this);
90 }
91
EventData()92 EventData::EventData()
93 {
94 }
95
~EventData()96 EventData::~EventData()
97 {
98 }
99
100 void
Dump(Stream * s) const101 EventData::Dump (Stream *s) const
102 {
103 s->PutCString ("Generic Event Data");
104 }
105
EventDataBytes()106 EventDataBytes::EventDataBytes () :
107 m_bytes()
108 {
109 }
110
EventDataBytes(const char * cstr)111 EventDataBytes::EventDataBytes (const char *cstr) :
112 m_bytes()
113 {
114 SetBytesFromCString (cstr);
115 }
116
EventDataBytes(const void * src,size_t src_len)117 EventDataBytes::EventDataBytes (const void *src, size_t src_len) :
118 m_bytes()
119 {
120 SetBytes (src, src_len);
121 }
122
~EventDataBytes()123 EventDataBytes::~EventDataBytes()
124 {
125 }
126
127 const ConstString &
GetFlavorString()128 EventDataBytes::GetFlavorString ()
129 {
130 static ConstString g_flavor ("EventDataBytes");
131 return g_flavor;
132 }
133
134 const ConstString &
GetFlavor() const135 EventDataBytes::GetFlavor () const
136 {
137 return EventDataBytes::GetFlavorString ();
138 }
139
140 void
Dump(Stream * s) const141 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 *
GetBytes() const157 EventDataBytes::GetBytes() const
158 {
159 if (m_bytes.empty())
160 return NULL;
161 return &m_bytes[0];
162 }
163
164 size_t
GetByteSize() const165 EventDataBytes::GetByteSize() const
166 {
167 return m_bytes.size ();
168 }
169
170 void
SetBytes(const void * src,size_t src_len)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
SetBytesFromCString(const char * cstr)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 *
GetBytesFromEvent(const Event * event_ptr)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
GetByteSizeFromEvent(const Event * event_ptr)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 *
GetEventDataFromEvent(const Event * event_ptr)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
SwapBytes(std::string & new_bytes)220 EventDataBytes::SwapBytes (std::string &new_bytes)
221 {
222 m_bytes.swap (new_bytes);
223 }
224
225
226