SBListener.cpp revision d891f9b872103235cfd2ed452c6f14a4394d9b3a
1//===-- SBListener.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#include "lldb/lldb-python.h"
11
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"
23
24
25using namespace lldb;
26using namespace lldb_private;
27
28
29SBListener::SBListener () :
30    m_opaque_sp (),
31    m_opaque_ptr (NULL)
32{
33}
34
35SBListener::SBListener (const char *name) :
36    m_opaque_sp (new Listener (name)),
37    m_opaque_ptr (NULL)
38{
39    m_opaque_ptr = m_opaque_sp.get();
40
41    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
42
43    if (log)
44        log->Printf ("SBListener::SBListener (name=\"%s\") => SBListener(%p)",
45                     name, m_opaque_ptr);
46}
47
48
49SBListener::SBListener (const SBListener &rhs) :
50    m_opaque_sp (rhs.m_opaque_sp),
51    m_opaque_ptr (rhs.m_opaque_ptr)
52{
53}
54
55const lldb::SBListener &
56SBListener::operator = (const lldb::SBListener &rhs)
57{
58    if (this != &rhs)
59    {
60        m_opaque_sp = rhs.m_opaque_sp;
61        m_opaque_ptr = rhs.m_opaque_ptr;
62    }
63    return *this;
64}
65
66SBListener::SBListener (Listener &listener) :
67    m_opaque_sp (),
68    m_opaque_ptr (&listener)
69{
70}
71
72SBListener::~SBListener ()
73{
74}
75
76bool
77SBListener::IsValid() const
78{
79    return m_opaque_ptr != NULL;
80}
81
82void
83SBListener::AddEvent (const SBEvent &event)
84{
85    EventSP &event_sp = event.GetSP ();
86    if (event_sp)
87        m_opaque_ptr->AddEvent (event_sp);
88}
89
90void
91SBListener::Clear ()
92{
93    if (m_opaque_ptr)
94        m_opaque_ptr->Clear ();
95}
96
97uint32_t
98SBListener::StartListeningForEventClass (SBDebugger &debugger,
99                             const char *broadcaster_class,
100                             uint32_t event_mask)
101{
102    if (m_opaque_ptr)
103    {
104        Debugger *lldb_debugger = debugger.get();
105        if (!lldb_debugger)
106            return 0;
107        BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
108        return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec);
109    }
110    else
111        return 0;
112}
113
114bool
115SBListener::StopListeningForEventClass (SBDebugger &debugger,
116                            const char *broadcaster_class,
117                            uint32_t event_mask)
118{
119    if (m_opaque_ptr)
120    {
121        Debugger *lldb_debugger = debugger.get();
122        if (!lldb_debugger)
123            return false;
124        BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
125        return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec);
126    }
127    else
128        return false;
129}
130
131uint32_t
132SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
133{
134    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
135
136    uint32_t acquired_event_mask = 0;
137    if (m_opaque_ptr && broadcaster.IsValid())
138    {
139        acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
140    }
141
142    log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
143    if (log)
144    {
145        StreamString sstr_requested;
146        StreamString sstr_acquired;
147
148        Broadcaster *lldb_broadcaster = broadcaster.get();
149        if (lldb_broadcaster)
150        {
151            const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false);
152            const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false);
153            log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s",
154                         m_opaque_ptr,
155                         lldb_broadcaster,
156                         lldb_broadcaster->GetBroadcasterName().GetCString(),
157                         event_mask,
158                         got_requested_names ? " (" : "",
159                         sstr_requested.GetData(),
160                         got_requested_names ? ")" : "",
161                         acquired_event_mask,
162                         got_acquired_names ? " (" : "",
163                         sstr_acquired.GetData(),
164                         got_acquired_names ? ")" : "");
165        }
166        else
167        {
168            log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x",
169                         m_opaque_ptr,
170                         lldb_broadcaster,
171                         event_mask,
172                         acquired_event_mask);
173
174        }
175    }
176
177    return acquired_event_mask;
178}
179
180bool
181SBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
182{
183    if (m_opaque_ptr && broadcaster.IsValid())
184    {
185        return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask);
186    }
187    return false;
188}
189
190bool
191SBListener::WaitForEvent (uint32_t timeout_secs, SBEvent &event)
192{
193    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
194    if (log)
195    {
196        if (timeout_secs == UINT32_MAX)
197        {
198            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...",
199                         m_opaque_ptr, event.get());
200        }
201        else
202        {
203            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...",
204                         m_opaque_ptr, timeout_secs, event.get());
205        }
206    }
207    bool success = false;
208
209    if (m_opaque_ptr)
210    {
211        TimeValue time_value;
212        if (timeout_secs != UINT32_MAX)
213        {
214            assert (timeout_secs != 0); // Take this out after all calls with timeout set to zero have been removed....
215            time_value = TimeValue::Now();
216            time_value.OffsetWithSeconds (timeout_secs);
217        }
218        EventSP event_sp;
219        if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
220        {
221            event.reset (event_sp);
222            success = true;
223        }
224    }
225
226    if (log)
227    {
228        if (timeout_secs == UINT32_MAX)
229        {
230            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i",
231                         m_opaque_ptr, event.get(), success);
232        }
233        else
234        {
235            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i",
236                         m_opaque_ptr, timeout_secs, event.get(), success);
237        }
238    }
239    if (!success)
240        event.reset (NULL);
241    return success;
242}
243
244bool
245SBListener::WaitForEventForBroadcaster
246(
247    uint32_t num_seconds,
248    const SBBroadcaster &broadcaster,
249    SBEvent &event
250)
251{
252    if (m_opaque_ptr && broadcaster.IsValid())
253    {
254        TimeValue time_value;
255        if (num_seconds != UINT32_MAX)
256        {
257            time_value = TimeValue::Now();
258            time_value.OffsetWithSeconds (num_seconds);
259        }
260        EventSP event_sp;
261        if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL,
262                                                         broadcaster.get(),
263                                                         event_sp))
264        {
265            event.reset (event_sp);
266            return true;
267        }
268
269    }
270    event.reset (NULL);
271    return false;
272}
273
274bool
275SBListener::WaitForEventForBroadcasterWithType
276(
277    uint32_t num_seconds,
278    const SBBroadcaster &broadcaster,
279    uint32_t event_type_mask,
280    SBEvent &event
281)
282{
283    if (m_opaque_ptr && broadcaster.IsValid())
284    {
285        TimeValue time_value;
286        if (num_seconds != UINT32_MAX)
287        {
288            time_value = TimeValue::Now();
289            time_value.OffsetWithSeconds (num_seconds);
290        }
291        EventSP event_sp;
292        if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL,
293                                                              broadcaster.get(),
294                                                              event_type_mask,
295                                                              event_sp))
296        {
297            event.reset (event_sp);
298            return true;
299        }
300    }
301    event.reset (NULL);
302    return false;
303}
304
305bool
306SBListener::PeekAtNextEvent (SBEvent &event)
307{
308    if (m_opaque_ptr)
309    {
310        event.reset (m_opaque_ptr->PeekAtNextEvent ());
311        return event.IsValid();
312    }
313    event.reset (NULL);
314    return false;
315}
316
317bool
318SBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
319{
320    if (m_opaque_ptr && broadcaster.IsValid())
321    {
322        event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get()));
323        return event.IsValid();
324    }
325    event.reset (NULL);
326    return false;
327}
328
329bool
330SBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask,
331                                                   SBEvent &event)
332{
333    if (m_opaque_ptr && broadcaster.IsValid())
334    {
335        event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask));
336        return event.IsValid();
337    }
338    event.reset (NULL);
339    return false;
340}
341
342bool
343SBListener::GetNextEvent (SBEvent &event)
344{
345    if (m_opaque_ptr)
346    {
347        EventSP event_sp;
348        if (m_opaque_ptr->GetNextEvent (event_sp))
349        {
350            event.reset (event_sp);
351            return true;
352        }
353    }
354    event.reset (NULL);
355    return false;
356}
357
358bool
359SBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
360{
361    if (m_opaque_ptr && broadcaster.IsValid())
362    {
363        EventSP event_sp;
364        if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp))
365        {
366            event.reset (event_sp);
367            return true;
368        }
369    }
370    event.reset (NULL);
371    return false;
372}
373
374bool
375SBListener::GetNextEventForBroadcasterWithType
376(
377    const SBBroadcaster &broadcaster,
378    uint32_t event_type_mask,
379    SBEvent &event
380)
381{
382    if (m_opaque_ptr && broadcaster.IsValid())
383    {
384        EventSP event_sp;
385        if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(),
386                                                              event_type_mask,
387                                                              event_sp))
388        {
389            event.reset (event_sp);
390            return true;
391        }
392    }
393    event.reset (NULL);
394    return false;
395}
396
397bool
398SBListener::HandleBroadcastEvent (const SBEvent &event)
399{
400    if (m_opaque_ptr)
401        return m_opaque_ptr->HandleBroadcastEvent (event.GetSP());
402    return false;
403}
404
405Listener *
406SBListener::operator->() const
407{
408    return m_opaque_ptr;
409}
410
411Listener *
412SBListener::get() const
413{
414    return m_opaque_ptr;
415}
416
417void
418SBListener::reset(Listener *listener, bool owns)
419{
420    if (owns)
421        m_opaque_sp.reset (listener);
422    else
423        m_opaque_sp.reset ();
424    m_opaque_ptr = listener;
425}
426
427Listener &
428SBListener::ref() const
429{
430    return *m_opaque_ptr;
431}
432
433Listener &
434SBListener::operator *()
435{
436    return *m_opaque_ptr;
437}
438
439const Listener &
440SBListener::operator *() const
441{
442    return *m_opaque_ptr;
443}
444
445
446