blob: 3e2f2122bddd5d21bfde049fb1c11aaeca68dbed [file] [log] [blame]
//===-- SBListener.cpp ------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Core/Listener.h"
#include "lldb/lldb-forward-rtti.h"
#include "lldb/Host/TimeValue.h"
#include "lldb/API/SBListener.h"
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBBroadcaster.h"
using namespace lldb;
using namespace lldb_private;
SBListener::SBListener () :
m_opaque_ptr (NULL),
m_opaque_ptr_owned (false)
{
}
SBListener::SBListener (const char *name) :
m_opaque_ptr (new Listener (name)),
m_opaque_ptr_owned (true)
{
}
SBListener::SBListener (Listener &listener) :
m_opaque_ptr (&listener),
m_opaque_ptr_owned (false)
{
}
SBListener::~SBListener ()
{
if (m_opaque_ptr_owned)
{
if (m_opaque_ptr)
{
delete m_opaque_ptr;
m_opaque_ptr = NULL;
}
}
}
bool
SBListener::IsValid() const
{
return m_opaque_ptr != NULL;
}
void
SBListener::AddEvent (const SBEvent &event)
{
EventSP &event_sp = event.GetSP ();
if (event_sp)
m_opaque_ptr->AddEvent (event_sp);
}
void
SBListener::Clear ()
{
if (m_opaque_ptr)
m_opaque_ptr->Clear ();
}
uint32_t
SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
return m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
}
return false;
}
bool
SBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask);
}
return false;
}
bool
SBListener::WaitForEvent (uint32_t num_seconds, SBEvent &event)
{
if (m_opaque_ptr)
{
TimeValue time_value;
if (num_seconds != UINT32_MAX)
{
assert (num_seconds != 0); // Take this out after all calls with timeout set to zero have been removed....
time_value = TimeValue::Now();
time_value.OffsetWithSeconds (num_seconds);
}
EventSP event_sp;
if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
{
event.reset (event_sp);
return true;
}
}
event.reset (NULL);
return false;
}
bool
SBListener::WaitForEventForBroadcaster
(
uint32_t num_seconds,
const SBBroadcaster &broadcaster,
SBEvent &event
)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
TimeValue time_value;
if (num_seconds != UINT32_MAX)
{
time_value = TimeValue::Now();
time_value.OffsetWithSeconds (num_seconds);
}
EventSP event_sp;
if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL,
broadcaster.get(),
event_sp))
{
event.reset (event_sp);
return true;
}
}
event.reset (NULL);
return false;
}
bool
SBListener::WaitForEventForBroadcasterWithType
(
uint32_t num_seconds,
const SBBroadcaster &broadcaster,
uint32_t event_type_mask,
SBEvent &event
)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
TimeValue time_value;
if (num_seconds != UINT32_MAX)
{
time_value = TimeValue::Now();
time_value.OffsetWithSeconds (num_seconds);
}
EventSP event_sp;
if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL,
broadcaster.get(),
event_type_mask,
event_sp))
{
event.reset (event_sp);
return true;
}
}
event.reset (NULL);
return false;
}
bool
SBListener::PeekAtNextEvent (SBEvent &event)
{
if (m_opaque_ptr)
{
event.reset (m_opaque_ptr->PeekAtNextEvent ());
return event.IsValid();
}
event.reset (NULL);
return false;
}
bool
SBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get()));
return event.IsValid();
}
event.reset (NULL);
return false;
}
bool
SBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask,
SBEvent &event)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask));
return event.IsValid();
}
event.reset (NULL);
return false;
}
bool
SBListener::GetNextEvent (SBEvent &event)
{
if (m_opaque_ptr)
{
EventSP event_sp;
if (m_opaque_ptr->GetNextEvent (event_sp))
{
event.reset (event_sp);
return true;
}
}
event.reset (NULL);
return false;
}
bool
SBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
EventSP event_sp;
if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp))
{
event.reset (event_sp);
return true;
}
}
event.reset (NULL);
return false;
}
bool
SBListener::GetNextEventForBroadcasterWithType
(
const SBBroadcaster &broadcaster,
uint32_t event_type_mask,
SBEvent &event
)
{
if (m_opaque_ptr && broadcaster.IsValid())
{
EventSP event_sp;
if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(),
event_type_mask,
event_sp))
{
event.reset (event_sp);
return true;
}
}
event.reset (NULL);
return false;
}
bool
SBListener::HandleBroadcastEvent (const SBEvent &event)
{
if (m_opaque_ptr)
return m_opaque_ptr->HandleBroadcastEvent (event.GetSP());
return false;
}
Listener *
SBListener::operator->() const
{
return m_opaque_ptr;
}
Listener *
SBListener::get() const
{
return m_opaque_ptr;
}
void
SBListener::reset(Listener *listener, bool transfer_ownership)
{
if (m_opaque_ptr_owned && m_opaque_ptr)
delete m_opaque_ptr;
m_opaque_ptr_owned = transfer_ownership;
m_opaque_ptr = listener;
}
Listener &
SBListener::operator *()
{
return *m_opaque_ptr;
}
const Listener &
SBListener::operator *() const
{
return *m_opaque_ptr;
}