blob: 2d4899dd6dcbdeb6b6bba6c1b3322346b40bf3d4 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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"
Greg Claytoncd548032011-02-01 01:31:41 +000020#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000021#include "lldb/Target/Process.h"
Eli Friedmana4083262010-06-09 08:50:27 +000022#include <algorithm>
Chris Lattner24943d22010-06-08 16:52:24 +000023
24using namespace lldb;
25using namespace lldb_private;
26
27//----------------------------------------------------------------------
28// Event constructor
29//----------------------------------------------------------------------
30Event::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
37Event::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//----------------------------------------------------------------------
48Event::~Event ()
49{
50}
51
52void
Chris Lattner24943d22010-06-08 16:52:24 +000053Event::Dump (Stream *s) const
54{
Greg Claytona9552752012-10-29 18:08:18 +000055 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);
Chris Lattner24943d22010-06-08 16:52:24 +000074
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
Chris Lattner24943d22010-06-08 16:52:24 +000085void
86Event::DoOnRemoval ()
87{
88 if (m_data_ap.get())
89 m_data_ap->DoOnRemoval (this);
90}
91
Chris Lattner24943d22010-06-08 16:52:24 +000092EventData::EventData()
93{
94}
95
96EventData::~EventData()
97{
98}
99
100void
101EventData::Dump (Stream *s) const
102{
103 s->PutCString ("Generic Event Data");
104}
105
106EventDataBytes::EventDataBytes () :
107 m_bytes()
108{
109}
110
111EventDataBytes::EventDataBytes (const char *cstr) :
112 m_bytes()
113{
114 SetBytesFromCString (cstr);
115}
116
117EventDataBytes::EventDataBytes (const void *src, size_t src_len) :
118 m_bytes()
119{
120 SetBytes (src, src_len);
121}
122
123EventDataBytes::~EventDataBytes()
124{
125}
126
127const ConstString &
128EventDataBytes::GetFlavorString ()
129{
130 static ConstString g_flavor ("EventDataBytes");
131 return g_flavor;
132}
133
134const ConstString &
135EventDataBytes::GetFlavor () const
136{
137 return EventDataBytes::GetFlavorString ();
138}
139
140void
141EventDataBytes::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 }
Greg Clayton53d68e72010-07-20 22:52:08 +0000148 else if (m_bytes.size() > 0)
Chris Lattner24943d22010-06-08 16:52:24 +0000149 {
150 DataExtractor data;
Greg Claytoncd548032011-02-01 01:31:41 +0000151 data.SetData(&m_bytes[0], m_bytes.size(), lldb::endian::InlHostByteOrder());
Chris Lattner24943d22010-06-08 16:52:24 +0000152 data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
153 }
154}
155
156const void *
157EventDataBytes::GetBytes() const
158{
159 if (m_bytes.empty())
160 return NULL;
Greg Clayton53d68e72010-07-20 22:52:08 +0000161 return &m_bytes[0];
Chris Lattner24943d22010-06-08 16:52:24 +0000162}
163
164size_t
165EventDataBytes::GetByteSize() const
166{
167 return m_bytes.size ();
168}
169
170void
171EventDataBytes::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
179void
180EventDataBytes::SetBytesFromCString (const char *cstr)
181{
182 if (cstr && cstr[0])
183 m_bytes.assign (cstr);
184 else
185 m_bytes.clear();
186}
187
188
189const void *
190EventDataBytes::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
198size_t
199EventDataBytes::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
207const EventDataBytes *
208EventDataBytes::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
Caroline Tice4a348082011-05-02 20:41:46 +0000219void
220EventDataBytes::SwapBytes (std::string &new_bytes)
221{
222 m_bytes.swap (new_bytes);
223}
224
225