1 //===-- SBCommunication.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/API/SBCommunication.h"
11 #include "lldb/API/SBBroadcaster.h"
12 #include "lldb/Core/Communication.h"
13 #include "lldb/Core/Log.h"
14 #include "lldb/Host/ConnectionFileDescriptor.h"
17 using namespace lldb_private;
21 SBCommunication::SBCommunication() :
23 m_opaque_owned (false)
27 SBCommunication::SBCommunication(const char * broadcaster_name) :
28 m_opaque (new Communication (broadcaster_name)),
31 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
34 log->Printf ("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
35 "SBCommunication(%p)", broadcaster_name,
36 static_cast<void*>(m_opaque));
39 SBCommunication::~SBCommunication()
41 if (m_opaque && m_opaque_owned)
44 m_opaque_owned = false;
48 SBCommunication::IsValid () const
50 return m_opaque != NULL;
54 SBCommunication::GetCloseOnEOF ()
57 return m_opaque->GetCloseOnEOF ();
62 SBCommunication::SetCloseOnEOF (bool b)
65 m_opaque->SetCloseOnEOF (b);
69 SBCommunication::Connect (const char *url)
73 if (!m_opaque->HasConnection ())
74 m_opaque->SetConnection(Connection::CreateDefaultConnection(url));
75 return m_opaque->Connect (url, NULL);
77 return eConnectionStatusNoConnection;
81 SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
83 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
85 ConnectionStatus status = eConnectionStatusNoConnection;
88 if (m_opaque->HasConnection ())
90 if (m_opaque->IsConnected())
91 m_opaque->Disconnect();
93 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
94 if (m_opaque->IsConnected())
95 status = eConnectionStatusSuccess;
97 status = eConnectionStatusLostConnection;
101 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
102 static_cast<void*>(m_opaque), fd, owns_fd,
103 Communication::ConnectionStatusAsCString (status));
110 SBCommunication::Disconnect ()
112 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
114 ConnectionStatus status= eConnectionStatusNoConnection;
116 status = m_opaque->Disconnect ();
119 log->Printf ("SBCommunication(%p)::Disconnect () => %s",
120 static_cast<void*>(m_opaque),
121 Communication::ConnectionStatusAsCString (status));
127 SBCommunication::IsConnected () const
129 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
132 result = m_opaque->IsConnected ();
135 log->Printf ("SBCommunication(%p)::IsConnected () => %i",
136 static_cast<void*>(m_opaque), result);
142 SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
144 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
146 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status)...",
147 static_cast<void*>(m_opaque), static_cast<void*>(dst),
148 static_cast<uint64_t>(dst_len), timeout_usec);
149 size_t bytes_read = 0;
151 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
153 status = eConnectionStatusNoConnection;
156 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status=%s) => %" PRIu64,
157 static_cast<void*>(m_opaque), static_cast<void*>(dst),
158 static_cast<uint64_t>(dst_len), timeout_usec,
159 Communication::ConnectionStatusAsCString (status),
160 static_cast<uint64_t>(bytes_read));
166 SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
168 size_t bytes_written = 0;
170 bytes_written = m_opaque->Write (src, src_len, status, NULL);
172 status = eConnectionStatusNoConnection;
174 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
176 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64 ", &status=%s) => %" PRIu64,
177 static_cast<void*>(m_opaque), static_cast<const void*>(src),
178 static_cast<uint64_t>(src_len),
179 Communication::ConnectionStatusAsCString (status),
180 static_cast<uint64_t>(bytes_written));
186 SBCommunication::ReadThreadStart ()
188 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
190 bool success = false;
192 success = m_opaque->StartReadThread ();
195 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i",
196 static_cast<void*>(m_opaque), success);
203 SBCommunication::ReadThreadStop ()
205 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
207 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...",
208 static_cast<void*>(m_opaque));
210 bool success = false;
212 success = m_opaque->StopReadThread ();
215 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i",
216 static_cast<void*>(m_opaque), success);
222 SBCommunication::ReadThreadIsRunning ()
226 result = m_opaque->ReadThreadIsRunning ();
227 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
229 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i",
230 static_cast<void*>(m_opaque), result);
235 SBCommunication::SetReadThreadBytesReceivedCallback
237 ReadThreadBytesReceived callback,
241 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
246 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
251 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i",
252 static_cast<void*>(m_opaque),
253 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(callback)),
254 static_cast<void*>(callback_baton), result);
260 SBCommunication::GetBroadcaster ()
262 SBBroadcaster broadcaster (m_opaque, false);
264 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
267 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
268 static_cast<void*>(m_opaque),
269 static_cast<void*>(broadcaster.get()));
275 SBCommunication::GetBroadcasterClass ()
277 return Communication::GetStaticBroadcasterClass().AsCString();
282 //SBCommunication::CreateIfNeeded ()
284 // if (m_opaque == NULL)
286 // static uint32_t g_broadcaster_num;
287 // char broadcaster_name[256];
288 // ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
289 // m_opaque = new Communication (broadcaster_name);
290 // m_opaque_owned = true;
292 // assert (m_opaque);