blob: 96c1c56b10ff50ec0ca3425846d1325e4aaa66dd [file] [log] [blame]
//===-- Event.cpp -----------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// C Includes
// C++ Includes
#include <algorithm>
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Event.h"
#include "lldb/Core/Broadcaster.h"
#include "lldb/Core/DataExtractor.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/State.h"
#include "lldb/Core/Stream.h"
#include "lldb/Host/Endian.h"
#include "lldb/Target/Process.h"
using namespace lldb;
using namespace lldb_private;
#pragma mark -
#pragma mark Event
//------------------------------------------------------------------
// Event functions
//------------------------------------------------------------------
Event::Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data) :
m_broadcaster_wp(broadcaster->GetBroadcasterImpl()),
m_type(event_type),
m_data_sp(data)
{
}
Event::Event (Broadcaster *broadcaster, uint32_t event_type, const EventDataSP &event_data_sp) :
m_broadcaster_wp(broadcaster->GetBroadcasterImpl()),
m_type(event_type),
m_data_sp(event_data_sp)
{
}
Event::Event(uint32_t event_type, EventData *data) :
m_broadcaster_wp(),
m_type(event_type),
m_data_sp(data)
{
}
Event::Event(uint32_t event_type, const EventDataSP &event_data_sp) :
m_broadcaster_wp(),
m_type(event_type),
m_data_sp(event_data_sp)
{
}
Event::~Event() = default;
void
Event::Dump (Stream *s) const
{
Broadcaster *broadcaster;
Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
if (broadcaster_impl_sp)
broadcaster = broadcaster_impl_sp->GetBroadcaster();
else
broadcaster = nullptr;
if (broadcaster)
{
StreamString event_name;
if (broadcaster->GetEventNames (event_name, m_type, false))
s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
static_cast<const void*>(this),
static_cast<void*>(broadcaster),
broadcaster->GetBroadcasterName().GetCString(),
m_type, event_name.GetString().c_str());
else
s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
static_cast<const void*>(this),
static_cast<void*>(broadcaster),
broadcaster->GetBroadcasterName().GetCString(), m_type);
}
else
s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
static_cast<const void*>(this), m_type);
if (m_data_sp)
{
s->PutChar('{');
m_data_sp->Dump (s);
s->PutChar('}');
}
else
s->Printf ("<NULL>");
}
void
Event::DoOnRemoval ()
{
if (m_data_sp)
m_data_sp->DoOnRemoval (this);
}
#pragma mark -
#pragma mark EventData
//------------------------------------------------------------------
// EventData functions
//------------------------------------------------------------------
EventData::EventData() = default;
EventData::~EventData() = default;
void
EventData::Dump (Stream *s) const
{
s->PutCString ("Generic Event Data");
}
#pragma mark -
#pragma mark EventDataBytes
//------------------------------------------------------------------
// EventDataBytes functions
//------------------------------------------------------------------
EventDataBytes::EventDataBytes () :
m_bytes()
{
}
EventDataBytes::EventDataBytes (const char *cstr) :
m_bytes()
{
SetBytesFromCString (cstr);
}
EventDataBytes::EventDataBytes (const void *src, size_t src_len) :
m_bytes()
{
SetBytes (src, src_len);
}
EventDataBytes::~EventDataBytes() = default;
const ConstString &
EventDataBytes::GetFlavorString ()
{
static ConstString g_flavor ("EventDataBytes");
return g_flavor;
}
const ConstString &
EventDataBytes::GetFlavor () const
{
return EventDataBytes::GetFlavorString ();
}
void
EventDataBytes::Dump (Stream *s) const
{
size_t num_printable_chars = std::count_if (m_bytes.begin(), m_bytes.end(), isprint);
if (num_printable_chars == m_bytes.size())
{
s->Printf("\"%s\"", m_bytes.c_str());
}
else if (!m_bytes.empty())
{
DataExtractor data;
data.SetData(m_bytes.data(), m_bytes.size(), endian::InlHostByteOrder());
data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
}
}
const void *
EventDataBytes::GetBytes() const
{
return (m_bytes.empty() ? nullptr : m_bytes.data());
}
size_t
EventDataBytes::GetByteSize() const
{
return m_bytes.size ();
}
void
EventDataBytes::SetBytes (const void *src, size_t src_len)
{
if (src != nullptr && src_len > 0)
m_bytes.assign ((const char *)src, src_len);
else
m_bytes.clear();
}
void
EventDataBytes::SetBytesFromCString (const char *cstr)
{
if (cstr != nullptr && cstr[0])
m_bytes.assign (cstr);
else
m_bytes.clear();
}
const void *
EventDataBytes::GetBytesFromEvent (const Event *event_ptr)
{
const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
if (e != nullptr)
return e->GetBytes();
return nullptr;
}
size_t
EventDataBytes::GetByteSizeFromEvent (const Event *event_ptr)
{
const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
if (e != nullptr)
return e->GetByteSize();
return 0;
}
const EventDataBytes *
EventDataBytes::GetEventDataFromEvent (const Event *event_ptr)
{
if (event_ptr != nullptr)
{
const EventData *event_data = event_ptr->GetData();
if (event_data && event_data->GetFlavor() == EventDataBytes::GetFlavorString())
return static_cast <const EventDataBytes *> (event_data);
}
return nullptr;
}
void
EventDataBytes::SwapBytes (std::string &new_bytes)
{
m_bytes.swap (new_bytes);
}
#pragma mark -
#pragma mark EventStructuredData
//------------------------------------------------------------------
// EventDataStructuredData definitions
//------------------------------------------------------------------
EventDataStructuredData::EventDataStructuredData() :
EventData(),
m_process_sp(),
m_object_sp(),
m_plugin_sp()
{
}
EventDataStructuredData::EventDataStructuredData(const ProcessSP &process_sp,
const StructuredData::ObjectSP
&object_sp,
const
lldb::StructuredDataPluginSP
&plugin_sp) :
EventData(),
m_process_sp(process_sp),
m_object_sp(object_sp),
m_plugin_sp(plugin_sp)
{
}
EventDataStructuredData::~EventDataStructuredData()
{
}
//------------------------------------------------------------------
// EventDataStructuredData member functions
//------------------------------------------------------------------
const ConstString &
EventDataStructuredData::GetFlavor() const
{
return EventDataStructuredData::GetFlavorString();
}
void
EventDataStructuredData::Dump(Stream *s) const
{
if (!s)
return;
if (m_object_sp)
m_object_sp->Dump(*s);
}
const ProcessSP&
EventDataStructuredData::GetProcess() const
{
return m_process_sp;
}
const StructuredData::ObjectSP&
EventDataStructuredData::GetObject() const
{
return m_object_sp;
}
const lldb::StructuredDataPluginSP&
EventDataStructuredData::GetStructuredDataPlugin() const
{
return m_plugin_sp;
}
void
EventDataStructuredData::SetProcess(const ProcessSP &process_sp)
{
m_process_sp = process_sp;
}
void
EventDataStructuredData::SetObject(const StructuredData::ObjectSP &object_sp)
{
m_object_sp = object_sp;
}
void
EventDataStructuredData::SetStructuredDataPlugin(const
lldb::StructuredDataPluginSP
&plugin_sp)
{
m_plugin_sp = plugin_sp;
}
//------------------------------------------------------------------
// EventDataStructuredData static functions
//------------------------------------------------------------------
const EventDataStructuredData*
EventDataStructuredData::GetEventDataFromEvent(const Event *event_ptr)
{
if (event_ptr == nullptr)
return nullptr;
const EventData *event_data = event_ptr->GetData();
if (!event_data || event_data->GetFlavor() !=
EventDataStructuredData::GetFlavorString())
return nullptr;
return static_cast<const EventDataStructuredData*>(event_data);
}
ProcessSP
EventDataStructuredData::GetProcessFromEvent(const Event *event_ptr)
{
auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
if (event_data)
return event_data->GetProcess();
else
return ProcessSP();
}
StructuredData::ObjectSP
EventDataStructuredData::GetObjectFromEvent(const Event *event_ptr)
{
auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
if (event_data)
return event_data->GetObject();
else
return StructuredData::ObjectSP();
}
lldb::StructuredDataPluginSP
EventDataStructuredData::GetPluginFromEvent(const Event *event_ptr)
{
auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
if (event_data)
return event_data->GetStructuredDataPlugin();
else
return StructuredDataPluginSP();
}
const ConstString &
EventDataStructuredData::GetFlavorString ()
{
static ConstString s_flavor("EventDataStructuredData");
return s_flavor;
}