aboutsummaryrefslogtreecommitdiff
path: root/source/API/SBListener.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/API/SBListener.cpp')
-rw-r--r--source/API/SBListener.cpp443
1 files changed, 443 insertions, 0 deletions
diff --git a/source/API/SBListener.cpp b/source/API/SBListener.cpp
new file mode 100644
index 000000000000..2e67b4c24e86
--- /dev/null
+++ b/source/API/SBListener.cpp
@@ -0,0 +1,443 @@
+//===-- 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/lldb-python.h"
+
+#include "lldb/API/SBListener.h"
+#include "lldb/API/SBBroadcaster.h"
+#include "lldb/API/SBDebugger.h"
+#include "lldb/API/SBEvent.h"
+#include "lldb/API/SBStream.h"
+#include "lldb/Core/Broadcaster.h"
+#include "lldb/Core/Debugger.h"
+#include "lldb/Core/Listener.h"
+#include "lldb/Core/Log.h"
+#include "lldb/Core/StreamString.h"
+#include "lldb/Host/TimeValue.h"
+
+
+using namespace lldb;
+using namespace lldb_private;
+
+
+SBListener::SBListener () :
+ m_opaque_sp (),
+ m_opaque_ptr (NULL)
+{
+}
+
+SBListener::SBListener (const char *name) :
+ m_opaque_sp (new Listener (name)),
+ m_opaque_ptr (NULL)
+{
+ m_opaque_ptr = m_opaque_sp.get();
+
+ Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+
+ if (log)
+ log->Printf ("SBListener::SBListener (name=\"%s\") => SBListener(%p)",
+ name, m_opaque_ptr);
+}
+
+
+SBListener::SBListener (const SBListener &rhs) :
+ m_opaque_sp (rhs.m_opaque_sp),
+ m_opaque_ptr (rhs.m_opaque_ptr)
+{
+}
+
+const lldb::SBListener &
+SBListener::operator = (const lldb::SBListener &rhs)
+{
+ if (this != &rhs)
+ {
+ m_opaque_sp = rhs.m_opaque_sp;
+ m_opaque_ptr = rhs.m_opaque_ptr;
+ }
+ return *this;
+}
+
+SBListener::SBListener (Listener &listener) :
+ m_opaque_sp (),
+ m_opaque_ptr (&listener)
+{
+}
+
+SBListener::~SBListener ()
+{
+}
+
+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::StartListeningForEventClass (SBDebugger &debugger,
+ const char *broadcaster_class,
+ uint32_t event_mask)
+{
+ if (m_opaque_ptr)
+ {
+ Debugger *lldb_debugger = debugger.get();
+ if (!lldb_debugger)
+ return 0;
+ BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
+ return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec);
+ }
+ else
+ return 0;
+}
+
+bool
+SBListener::StopListeningForEventClass (SBDebugger &debugger,
+ const char *broadcaster_class,
+ uint32_t event_mask)
+{
+ if (m_opaque_ptr)
+ {
+ Debugger *lldb_debugger = debugger.get();
+ if (!lldb_debugger)
+ return false;
+ BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
+ return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec);
+ }
+ else
+ return false;
+}
+
+uint32_t
+SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
+{
+ uint32_t acquired_event_mask = 0;
+ if (m_opaque_ptr && broadcaster.IsValid())
+ {
+ acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
+ }
+
+ Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
+ if (log)
+ {
+ StreamString sstr_requested;
+ StreamString sstr_acquired;
+
+ Broadcaster *lldb_broadcaster = broadcaster.get();
+ if (lldb_broadcaster)
+ {
+ const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false);
+ const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false);
+ log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s",
+ m_opaque_ptr,
+ lldb_broadcaster,
+ lldb_broadcaster->GetBroadcasterName().GetCString(),
+ event_mask,
+ got_requested_names ? " (" : "",
+ sstr_requested.GetData(),
+ got_requested_names ? ")" : "",
+ acquired_event_mask,
+ got_acquired_names ? " (" : "",
+ sstr_acquired.GetData(),
+ got_acquired_names ? ")" : "");
+ }
+ else
+ {
+ log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x",
+ m_opaque_ptr,
+ lldb_broadcaster,
+ event_mask,
+ acquired_event_mask);
+
+ }
+ }
+
+ return acquired_event_mask;
+}
+
+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 timeout_secs, SBEvent &event)
+{
+ Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+ if (log)
+ {
+ if (timeout_secs == UINT32_MAX)
+ {
+ log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...",
+ m_opaque_ptr, event.get());
+ }
+ else
+ {
+ log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...",
+ m_opaque_ptr, timeout_secs, event.get());
+ }
+ }
+ bool success = false;
+
+ if (m_opaque_ptr)
+ {
+ TimeValue time_value;
+ if (timeout_secs != UINT32_MAX)
+ {
+ assert (timeout_secs != 0); // Take this out after all calls with timeout set to zero have been removed....
+ time_value = TimeValue::Now();
+ time_value.OffsetWithSeconds (timeout_secs);
+ }
+ EventSP event_sp;
+ if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
+ {
+ event.reset (event_sp);
+ success = true;
+ }
+ }
+
+ if (log)
+ {
+ if (timeout_secs == UINT32_MAX)
+ {
+ log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i",
+ m_opaque_ptr, event.get(), success);
+ }
+ else
+ {
+ log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i",
+ m_opaque_ptr, timeout_secs, event.get(), success);
+ }
+ }
+ if (!success)
+ event.reset (NULL);
+ return success;
+}
+
+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 owns)
+{
+ if (owns)
+ m_opaque_sp.reset (listener);
+ else
+ m_opaque_sp.reset ();
+ m_opaque_ptr = listener;
+}
+
+Listener &
+SBListener::ref() const
+{
+ return *m_opaque_ptr;
+}
+
+Listener &
+SBListener::operator *()
+{
+ return *m_opaque_ptr;
+}
+
+const Listener &
+SBListener::operator *() const
+{
+ return *m_opaque_ptr;
+}
+
+