1254721Semaste//===-- SBCommunication.cpp -------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/API/SBCommunication.h"
11254721Semaste#include "lldb/API/SBBroadcaster.h"
12254721Semaste#include "lldb/Core/Communication.h"
13254721Semaste#include "lldb/Core/ConnectionFileDescriptor.h"
14254721Semaste#include "lldb/Core/Log.h"
15254721Semaste
16254721Semasteusing namespace lldb;
17254721Semasteusing namespace lldb_private;
18254721Semaste
19254721Semaste
20254721Semaste
21254721SemasteSBCommunication::SBCommunication() :
22254721Semaste    m_opaque (NULL),
23254721Semaste    m_opaque_owned (false)
24254721Semaste{
25254721Semaste}
26254721Semaste
27254721SemasteSBCommunication::SBCommunication(const char * broadcaster_name) :
28254721Semaste    m_opaque (new Communication (broadcaster_name)),
29254721Semaste    m_opaque_owned (true)
30254721Semaste{
31254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32254721Semaste
33254721Semaste    if (log)
34254721Semaste        log->Printf ("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
35254721Semaste                     "SBCommunication(%p)", broadcaster_name, m_opaque);
36254721Semaste}
37254721Semaste
38254721SemasteSBCommunication::~SBCommunication()
39254721Semaste{
40254721Semaste    if (m_opaque && m_opaque_owned)
41254721Semaste        delete m_opaque;
42254721Semaste    m_opaque = NULL;
43254721Semaste    m_opaque_owned = false;
44254721Semaste}
45254721Semaste
46254721Semastebool
47254721SemasteSBCommunication::IsValid () const
48254721Semaste{
49254721Semaste    return m_opaque != NULL;
50254721Semaste}
51254721Semaste
52254721Semastebool
53254721SemasteSBCommunication::GetCloseOnEOF ()
54254721Semaste{
55254721Semaste    if (m_opaque)
56254721Semaste        return m_opaque->GetCloseOnEOF ();
57254721Semaste    return false;
58254721Semaste}
59254721Semaste
60254721Semastevoid
61254721SemasteSBCommunication::SetCloseOnEOF (bool b)
62254721Semaste{
63254721Semaste    if (m_opaque)
64254721Semaste        m_opaque->SetCloseOnEOF (b);
65254721Semaste}
66254721Semaste
67254721SemasteConnectionStatus
68254721SemasteSBCommunication::Connect (const char *url)
69254721Semaste{
70254721Semaste    if (m_opaque)
71254721Semaste    {
72254721Semaste        if (!m_opaque->HasConnection ())
73254721Semaste            m_opaque->SetConnection (new ConnectionFileDescriptor());
74254721Semaste        return m_opaque->Connect (url, NULL);
75254721Semaste    }
76254721Semaste    return eConnectionStatusNoConnection;
77254721Semaste}
78254721Semaste
79254721SemasteConnectionStatus
80254721SemasteSBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
81254721Semaste{
82254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
83254721Semaste
84254721Semaste    ConnectionStatus status = eConnectionStatusNoConnection;
85254721Semaste    if (m_opaque)
86254721Semaste    {
87254721Semaste        if (m_opaque->HasConnection ())
88254721Semaste        {
89254721Semaste            if (m_opaque->IsConnected())
90254721Semaste                m_opaque->Disconnect();
91254721Semaste        }
92254721Semaste        m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
93254721Semaste        if (m_opaque->IsConnected())
94254721Semaste            status = eConnectionStatusSuccess;
95254721Semaste        else
96254721Semaste            status = eConnectionStatusLostConnection;
97254721Semaste    }
98254721Semaste
99254721Semaste    if (log)
100254721Semaste        log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
101254721Semaste                     m_opaque, fd, owns_fd, Communication::ConnectionStatusAsCString (status));
102254721Semaste
103254721Semaste    return status;
104254721Semaste}
105254721Semaste
106254721Semaste
107254721SemasteConnectionStatus
108254721SemasteSBCommunication::Disconnect ()
109254721Semaste{
110254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
111254721Semaste
112254721Semaste    ConnectionStatus status= eConnectionStatusNoConnection;
113254721Semaste    if (m_opaque)
114254721Semaste        status = m_opaque->Disconnect ();
115254721Semaste
116254721Semaste    if (log)
117254721Semaste        log->Printf ("SBCommunication(%p)::Disconnect () => %s", m_opaque,
118254721Semaste                     Communication::ConnectionStatusAsCString (status));
119254721Semaste
120254721Semaste    return status;
121254721Semaste}
122254721Semaste
123254721Semastebool
124254721SemasteSBCommunication::IsConnected () const
125254721Semaste{
126254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
127254721Semaste    bool result = false;
128254721Semaste    if (m_opaque)
129254721Semaste        result = m_opaque->IsConnected ();
130254721Semaste
131254721Semaste    if (log)
132254721Semaste        log->Printf ("SBCommunication(%p)::IsConnected () => %i", m_opaque, result);
133254721Semaste
134254721Semaste    return false;
135254721Semaste}
136254721Semaste
137254721Semastesize_t
138254721SemasteSBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
139254721Semaste{
140254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
141254721Semaste    if (log)
142254721Semaste        log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status)...",
143254721Semaste                     m_opaque,
144254721Semaste                     dst,
145254721Semaste                     (uint64_t)dst_len,
146254721Semaste                     timeout_usec);
147254721Semaste    size_t bytes_read = 0;
148254721Semaste    if (m_opaque)
149254721Semaste        bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
150254721Semaste    else
151254721Semaste        status = eConnectionStatusNoConnection;
152254721Semaste
153254721Semaste    if (log)
154254721Semaste        log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status=%s) => %" PRIu64,
155254721Semaste                     m_opaque,
156254721Semaste                     dst,
157254721Semaste                     (uint64_t)dst_len,
158254721Semaste                     timeout_usec,
159254721Semaste                     Communication::ConnectionStatusAsCString (status),
160254721Semaste                     (uint64_t)bytes_read);
161254721Semaste    return bytes_read;
162254721Semaste}
163254721Semaste
164254721Semaste
165254721Semastesize_t
166254721SemasteSBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
167254721Semaste{
168254721Semaste    size_t bytes_written = 0;
169254721Semaste    if (m_opaque)
170254721Semaste        bytes_written = m_opaque->Write (src, src_len, status, NULL);
171254721Semaste    else
172254721Semaste        status = eConnectionStatusNoConnection;
173254721Semaste
174254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
175254721Semaste    if (log)
176254721Semaste        log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64 ", &status=%s) => %" PRIu64,
177254721Semaste                     m_opaque, src, (uint64_t)src_len, Communication::ConnectionStatusAsCString (status), (uint64_t)bytes_written);
178254721Semaste
179254721Semaste    return 0;
180254721Semaste}
181254721Semaste
182254721Semastebool
183254721SemasteSBCommunication::ReadThreadStart ()
184254721Semaste{
185254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
186254721Semaste
187254721Semaste    bool success = false;
188254721Semaste    if (m_opaque)
189254721Semaste        success = m_opaque->StartReadThread ();
190254721Semaste
191254721Semaste    if (log)
192254721Semaste        log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success);
193254721Semaste
194254721Semaste    return success;
195254721Semaste}
196254721Semaste
197254721Semaste
198254721Semastebool
199254721SemasteSBCommunication::ReadThreadStop ()
200254721Semaste{
201254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
202254721Semaste    if (log)
203254721Semaste        log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque);
204254721Semaste
205254721Semaste    bool success = false;
206254721Semaste    if (m_opaque)
207254721Semaste        success = m_opaque->StopReadThread ();
208254721Semaste
209254721Semaste    if (log)
210254721Semaste        log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success);
211254721Semaste
212254721Semaste    return success;
213254721Semaste}
214254721Semaste
215254721Semastebool
216254721SemasteSBCommunication::ReadThreadIsRunning ()
217254721Semaste{
218254721Semaste    bool result = false;
219254721Semaste    if (m_opaque)
220254721Semaste        result = m_opaque->ReadThreadIsRunning ();
221254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
222254721Semaste    if (log)
223254721Semaste        log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result);
224254721Semaste    return result;
225254721Semaste}
226254721Semaste
227254721Semastebool
228254721SemasteSBCommunication::SetReadThreadBytesReceivedCallback
229254721Semaste(
230254721Semaste    ReadThreadBytesReceived callback,
231254721Semaste    void *callback_baton
232254721Semaste)
233254721Semaste{
234254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
235254721Semaste
236254721Semaste    bool result = false;
237254721Semaste    if (m_opaque)
238254721Semaste    {
239254721Semaste        m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
240254721Semaste        result = true;
241254721Semaste    }
242254721Semaste
243254721Semaste    if (log)
244254721Semaste        log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
245254721Semaste                     m_opaque, callback, callback_baton, result);
246254721Semaste
247254721Semaste    return result;
248254721Semaste}
249254721Semaste
250254721SemasteSBBroadcaster
251254721SemasteSBCommunication::GetBroadcaster ()
252254721Semaste{
253254721Semaste    SBBroadcaster broadcaster (m_opaque, false);
254254721Semaste
255254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
256254721Semaste
257254721Semaste    if (log)
258254721Semaste        log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
259254721Semaste                     m_opaque, broadcaster.get());
260254721Semaste
261254721Semaste    return broadcaster;
262254721Semaste}
263254721Semaste
264254721Semasteconst char *
265254721SemasteSBCommunication::GetBroadcasterClass ()
266254721Semaste{
267254721Semaste    return Communication::GetStaticBroadcasterClass().AsCString();
268254721Semaste}
269254721Semaste
270254721Semaste//
271254721Semaste//void
272254721Semaste//SBCommunication::CreateIfNeeded ()
273254721Semaste//{
274254721Semaste//    if (m_opaque == NULL)
275254721Semaste//    {
276254721Semaste//        static uint32_t g_broadcaster_num;
277254721Semaste//        char broadcaster_name[256];
278254721Semaste//        ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
279254721Semaste//        m_opaque = new Communication (broadcaster_name);
280254721Semaste//        m_opaque_owned = true;
281254721Semaste//    }
282254721Semaste//    assert (m_opaque);
283254721Semaste//}
284254721Semaste//
285254721Semaste//
286