1 //===-- SBListener.cpp ------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/lldb-python.h"
12 #include "lldb/API/SBListener.h"
13 #include "lldb/API/SBBroadcaster.h"
14 #include "lldb/API/SBDebugger.h"
15 #include "lldb/API/SBEvent.h"
16 #include "lldb/API/SBStream.h"
17 #include "lldb/Core/Broadcaster.h"
18 #include "lldb/Core/Debugger.h"
19 #include "lldb/Core/Listener.h"
20 #include "lldb/Core/Log.h"
21 #include "lldb/Core/StreamString.h"
22 #include "lldb/Host/TimeValue.h"
26 using namespace lldb_private;
29 SBListener::SBListener () :
35 SBListener::SBListener (const char *name) :
36 m_opaque_sp (new Listener (name)),
39 m_opaque_ptr = m_opaque_sp.get();
41 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
44 log->Printf ("SBListener::SBListener (name=\"%s\") => SBListener(%p)",
49 SBListener::SBListener (const SBListener &rhs) :
50 m_opaque_sp (rhs.m_opaque_sp),
51 m_opaque_ptr (rhs.m_opaque_ptr)
55 const lldb::SBListener &
56 SBListener::operator = (const lldb::SBListener &rhs)
60 m_opaque_sp = rhs.m_opaque_sp;
61 m_opaque_ptr = rhs.m_opaque_ptr;
66 SBListener::SBListener (Listener &listener) :
68 m_opaque_ptr (&listener)
72 SBListener::~SBListener ()
77 SBListener::IsValid() const
79 return m_opaque_ptr != NULL;
83 SBListener::AddEvent (const SBEvent &event)
85 EventSP &event_sp = event.GetSP ();
87 m_opaque_ptr->AddEvent (event_sp);
94 m_opaque_ptr->Clear ();
98 SBListener::StartListeningForEventClass (SBDebugger &debugger,
99 const char *broadcaster_class,
104 Debugger *lldb_debugger = debugger.get();
107 BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
108 return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec);
115 SBListener::StopListeningForEventClass (SBDebugger &debugger,
116 const char *broadcaster_class,
121 Debugger *lldb_debugger = debugger.get();
124 BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
125 return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec);
132 SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
134 uint32_t acquired_event_mask = 0;
135 if (m_opaque_ptr && broadcaster.IsValid())
137 acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
140 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
143 StreamString sstr_requested;
144 StreamString sstr_acquired;
146 Broadcaster *lldb_broadcaster = broadcaster.get();
147 if (lldb_broadcaster)
149 const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false);
150 const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false);
151 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s",
154 lldb_broadcaster->GetBroadcasterName().GetCString(),
156 got_requested_names ? " (" : "",
157 sstr_requested.GetData(),
158 got_requested_names ? ")" : "",
160 got_acquired_names ? " (" : "",
161 sstr_acquired.GetData(),
162 got_acquired_names ? ")" : "");
166 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x",
170 acquired_event_mask);
175 return acquired_event_mask;
179 SBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
181 if (m_opaque_ptr && broadcaster.IsValid())
183 return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask);
189 SBListener::WaitForEvent (uint32_t timeout_secs, SBEvent &event)
191 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
194 if (timeout_secs == UINT32_MAX)
196 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...",
197 m_opaque_ptr, event.get());
201 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...",
202 m_opaque_ptr, timeout_secs, event.get());
205 bool success = false;
209 TimeValue time_value;
210 if (timeout_secs != UINT32_MAX)
212 assert (timeout_secs != 0); // Take this out after all calls with timeout set to zero have been removed....
213 time_value = TimeValue::Now();
214 time_value.OffsetWithSeconds (timeout_secs);
217 if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
219 event.reset (event_sp);
226 if (timeout_secs == UINT32_MAX)
228 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i",
229 m_opaque_ptr, event.get(), success);
233 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i",
234 m_opaque_ptr, timeout_secs, event.get(), success);
243 SBListener::WaitForEventForBroadcaster
245 uint32_t num_seconds,
246 const SBBroadcaster &broadcaster,
250 if (m_opaque_ptr && broadcaster.IsValid())
252 TimeValue time_value;
253 if (num_seconds != UINT32_MAX)
255 time_value = TimeValue::Now();
256 time_value.OffsetWithSeconds (num_seconds);
259 if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL,
263 event.reset (event_sp);
273 SBListener::WaitForEventForBroadcasterWithType
275 uint32_t num_seconds,
276 const SBBroadcaster &broadcaster,
277 uint32_t event_type_mask,
281 if (m_opaque_ptr && broadcaster.IsValid())
283 TimeValue time_value;
284 if (num_seconds != UINT32_MAX)
286 time_value = TimeValue::Now();
287 time_value.OffsetWithSeconds (num_seconds);
290 if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL,
295 event.reset (event_sp);
304 SBListener::PeekAtNextEvent (SBEvent &event)
308 event.reset (m_opaque_ptr->PeekAtNextEvent ());
309 return event.IsValid();
316 SBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
318 if (m_opaque_ptr && broadcaster.IsValid())
320 event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get()));
321 return event.IsValid();
328 SBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask,
331 if (m_opaque_ptr && broadcaster.IsValid())
333 event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask));
334 return event.IsValid();
341 SBListener::GetNextEvent (SBEvent &event)
346 if (m_opaque_ptr->GetNextEvent (event_sp))
348 event.reset (event_sp);
357 SBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
359 if (m_opaque_ptr && broadcaster.IsValid())
362 if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp))
364 event.reset (event_sp);
373 SBListener::GetNextEventForBroadcasterWithType
375 const SBBroadcaster &broadcaster,
376 uint32_t event_type_mask,
380 if (m_opaque_ptr && broadcaster.IsValid())
383 if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(),
387 event.reset (event_sp);
396 SBListener::HandleBroadcastEvent (const SBEvent &event)
399 return m_opaque_ptr->HandleBroadcastEvent (event.GetSP());
404 SBListener::operator->() const
410 SBListener::get() const
416 SBListener::reset(Listener *listener, bool owns)
419 m_opaque_sp.reset (listener);
421 m_opaque_sp.reset ();
422 m_opaque_ptr = listener;
426 SBListener::ref() const
428 return *m_opaque_ptr;
432 SBListener::operator *()
434 return *m_opaque_ptr;
438 SBListener::operator *() const
440 return *m_opaque_ptr;