124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBListener.cpp ------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBListener.h"
1349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBBroadcaster.h"
145a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham#include "lldb/API/SBDebugger.h"
1549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBEvent.h"
1649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBStream.h"
1749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/Core/Broadcaster.h"
185a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham#include "lldb/Core/Debugger.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Listener.h"
207826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h"
2149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/Core/StreamString.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/TimeValue.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2963094e0bb161580564954dee512955c1c79d3476Greg ClaytonSBListener::SBListener () :
30538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (),
31538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (NULL)
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::SBListener (const char *name) :
36538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (new Listener (name)),
37538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (NULL)
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr = m_opaque_sp.get();
40538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
41952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
427826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
437826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
4449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        log->Printf ("SBListener::SBListener (name=\"%s\") => SBListener(%p)",
4561ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     name, m_opaque_ptr);
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
49538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::SBListener (const SBListener &rhs) :
50538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (rhs.m_opaque_sp),
51538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (rhs.m_opaque_ptr)
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55538eb82a89a68dbc57251915080bd5152b333978Greg Claytonconst lldb::SBListener &
56538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::operator = (const lldb::SBListener &rhs)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    if (this != &rhs)
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
60538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp = rhs.m_opaque_sp;
61538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_ptr = rhs.m_opaque_ptr;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
63538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    return *this;
64538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
65538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
66538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::SBListener (Listener &listener) :
67538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (),
68538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (&listener)
69538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
70538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
71538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
72538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::~SBListener ()
73538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::IsValid() const
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7963094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ptr != NULL;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::AddEvent (const SBEvent &event)
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8563094e0bb161580564954dee512955c1c79d3476Greg Clayton    EventSP &event_sp = event.GetSP ();
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (event_sp)
8763094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ptr->AddEvent (event_sp);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::Clear ()
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9363094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
9463094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ptr->Clear ();
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
974c87ebf1b443573929c149eebb969a40bcb410d4Jim Inghamuint32_t
984c87ebf1b443573929c149eebb969a40bcb410d4Jim InghamSBListener::StartListeningForEventClass (SBDebugger &debugger,
994c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham                             const char *broadcaster_class,
1004c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham                             uint32_t event_mask)
1014c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham{
1024c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham    if (m_opaque_ptr)
1035a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    {
1044c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        Debugger *lldb_debugger = debugger.get();
1054c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        if (!lldb_debugger)
1065a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            return 0;
1074c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
1084c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec);
1095a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    }
1104c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham    else
1114c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        return 0;
1124c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham}
1134c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham
1144c87ebf1b443573929c149eebb969a40bcb410d4Jim Inghambool
1154c87ebf1b443573929c149eebb969a40bcb410d4Jim InghamSBListener::StopListeningForEventClass (SBDebugger &debugger,
1164c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham                            const char *broadcaster_class,
1174c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham                            uint32_t event_mask)
1184c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham{
1194c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham    if (m_opaque_ptr)
1205a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    {
1214c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        Debugger *lldb_debugger = debugger.get();
1224c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        if (!lldb_debugger)
1235a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            return false;
1244c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
1254c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec);
1265a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    }
1274c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham    else
1284c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham        return false;
1294c87ebf1b443573929c149eebb969a40bcb410d4Jim Ingham}
1305a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    uint32_t acquired_event_mask = 0;
13563094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1397826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
14008f60c88b61c42c35abf3233f0cbe19d29fbe814Jason Molenda    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
1417826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
14249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
14349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        StreamString sstr_requested;
14449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        StreamString sstr_acquired;
14549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
14649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        Broadcaster *lldb_broadcaster = broadcaster.get();
14749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (lldb_broadcaster)
14849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
14949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false);
15049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false);
15149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s",
15249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr,
15349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         lldb_broadcaster,
15449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         lldb_broadcaster->GetBroadcasterName().GetCString(),
15549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         event_mask,
15649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_requested_names ? " (" : "",
15749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         sstr_requested.GetData(),
15849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_requested_names ? ")" : "",
15949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         acquired_event_mask,
16049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_acquired_names ? " (" : "",
16149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         sstr_acquired.GetData(),
16249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_acquired_names ? ")" : "");
16349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
16449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
16549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
16649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x",
16749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr,
16849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         lldb_broadcaster,
16949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         event_mask,
17049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         acquired_event_mask);
17149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
17249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
17349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
1747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
17549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return acquired_event_mask;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18363094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18949ce682dfa7993d31206cea19ce7006cd3f3077eGreg ClaytonSBListener::WaitForEvent (uint32_t timeout_secs, SBEvent &event)
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
191952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
19249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (log)
19349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
19449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (timeout_secs == UINT32_MAX)
19549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
19649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...",
19749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, event.get());
19849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
19949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
20049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
20149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...",
20249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, timeout_secs, event.get());
20349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
20449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
20549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    bool success = false;
2067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
20763094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue time_value;
21049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (timeout_secs != UINT32_MAX)
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            assert (timeout_secs != 0); // Take this out after all calls with timeout set to zero have been removed....
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value = TimeValue::Now();
21449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            time_value.OffsetWithSeconds (timeout_secs);
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
21763094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21963094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
22049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            success = true;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
22549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
22649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (timeout_secs == UINT32_MAX)
22749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
22849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i",
22949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, event.get(), success);
23049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
23149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
23249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
23349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i",
23449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, timeout_secs, event.get(), success);
23549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
23649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
23749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (!success)
23849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        event.reset (NULL);
23949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return success;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::WaitForEventForBroadcaster
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_seconds,
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SBBroadcaster &broadcaster,
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBEvent &event
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue time_value;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_seconds != UINT32_MAX)
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value = TimeValue::Now();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value.OffsetWithSeconds (num_seconds);
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
25963094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL,
26063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                         broadcaster.get(),
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                         event_sp))
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26363094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26863094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::WaitForEventForBroadcasterWithType
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_seconds,
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SBBroadcaster &broadcaster,
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t event_type_mask,
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBEvent &event
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue time_value;
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_seconds != UINT32_MAX)
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value = TimeValue::Now();
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value.OffsetWithSeconds (num_seconds);
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
29063094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL,
29163094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              broadcaster.get(),
29263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_type_mask,
29363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_sp))
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29563094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29963094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::PeekAtNextEvent (SBEvent &event)
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30663094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30863094e0bb161580564954dee512955c1c79d3476Greg Clayton        event.reset (m_opaque_ptr->PeekAtNextEvent ());
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return event.IsValid();
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31163094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31863094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32063094e0bb161580564954dee512955c1c79d3476Greg Clayton        event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get()));
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return event.IsValid();
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32363094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask,
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   SBEvent &event)
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33363094e0bb161580564954dee512955c1c79d3476Greg Clayton        event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask));
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return event.IsValid();
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33663094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::GetNextEvent (SBEvent &event)
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34363094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
34663094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->GetNextEvent (event_sp))
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34863094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35263094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35963094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
36263094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp))
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36463094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36863094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::GetNextEventForBroadcasterWithType
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SBBroadcaster &broadcaster,
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t event_type_mask,
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBEvent &event
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
38363094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(),
38463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_type_mask,
38563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_sp))
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
38763094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39163094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::HandleBroadcastEvent (const SBEvent &event)
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39863094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
39963094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_opaque_ptr->HandleBroadcastEvent (event.GetSP());
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40363094e0bb161580564954dee512955c1c79d3476Greg ClaytonListener *
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::operator->() const
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40663094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ptr;
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40963094e0bb161580564954dee512955c1c79d3476Greg ClaytonListener *
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::get() const
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41263094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ptr;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41563094e0bb161580564954dee512955c1c79d3476Greg Claytonvoid
416538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::reset(Listener *listener, bool owns)
41763094e0bb161580564954dee512955c1c79d3476Greg Clayton{
418538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    if (owns)
419538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp.reset (listener);
420538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    else
421538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp.reset ();
42263094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ptr = listener;
42363094e0bb161580564954dee512955c1c79d3476Greg Clayton}
42463094e0bb161580564954dee512955c1c79d3476Greg Clayton
425271a5db096ae183e9235ebd273c4a6aab6130b3eGreg ClaytonListener &
426271a5db096ae183e9235ebd273c4a6aab6130b3eGreg ClaytonSBListener::ref() const
427271a5db096ae183e9235ebd273c4a6aab6130b3eGreg Clayton{
428271a5db096ae183e9235ebd273c4a6aab6130b3eGreg Clayton    return *m_opaque_ptr;
429271a5db096ae183e9235ebd273c4a6aab6130b3eGreg Clayton}
43063094e0bb161580564954dee512955c1c79d3476Greg Clayton
43163094e0bb161580564954dee512955c1c79d3476Greg ClaytonListener &
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::operator *()
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43463094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_ptr;
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43763094e0bb161580564954dee512955c1c79d3476Greg Claytonconst Listener &
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::operator *() const
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44063094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_ptr;
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
444