blob: b6ca30d54e3737f12b2418cfcdacf5e0321c3a2a [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBCommunication.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/API/SBCommunication.h"
11#include "lldb/API/SBBroadcaster.h"
12#include "lldb/Core/Communication.h"
13#include "lldb/Core/ConnectionFileDescriptor.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000014#include "lldb/Core/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
16using namespace lldb;
17using namespace lldb_private;
18
19
20
21SBCommunication::SBCommunication() :
Greg Clayton66111032010-06-23 01:19:29 +000022 m_opaque (NULL),
23 m_opaque_owned (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024{
Caroline Ticeceb6b132010-10-26 03:11:13 +000025 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
26
27 if (log)
28 log->Printf ("SBCommunication::SBCommunication () ==> this = %p", this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029}
30
31SBCommunication::SBCommunication(const char * broadcaster_name) :
Greg Clayton66111032010-06-23 01:19:29 +000032 m_opaque (new Communication (broadcaster_name)),
33 m_opaque_owned (true)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000034{
Caroline Ticeceb6b132010-10-26 03:11:13 +000035 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
36
37 if (log)
38 log->Printf ("SBCommunication::SBCommunication (const char *broadcaster_name) broadcaster_name = '%s' ==> "
39 "this = %p (m_opaque = %p)", broadcaster_name, this, m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040}
41
42SBCommunication::~SBCommunication()
43{
Greg Clayton66111032010-06-23 01:19:29 +000044 if (m_opaque && m_opaque_owned)
45 delete m_opaque;
46 m_opaque = NULL;
47 m_opaque_owned = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048}
49
50ConnectionStatus
51SBCommunication::CheckIfBytesAvailable ()
52{
Greg Clayton66111032010-06-23 01:19:29 +000053 if (m_opaque)
54 return m_opaque->BytesAvailable (0, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055 return eConnectionStatusNoConnection;
56}
57
58ConnectionStatus
59SBCommunication::WaitForBytesAvailableInfinite ()
60{
Greg Clayton66111032010-06-23 01:19:29 +000061 if (m_opaque)
62 return m_opaque->BytesAvailable (UINT32_MAX, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063 return eConnectionStatusNoConnection;
64}
65
66ConnectionStatus
67SBCommunication::WaitForBytesAvailableWithTimeout (uint32_t timeout_usec)
68{
Greg Clayton66111032010-06-23 01:19:29 +000069 if (m_opaque)
70 return m_opaque->BytesAvailable (timeout_usec, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071 return eConnectionStatusNoConnection;
72}
73
74ConnectionStatus
75SBCommunication::Connect (const char *url)
76{
Greg Clayton66111032010-06-23 01:19:29 +000077 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000078 {
Greg Clayton66111032010-06-23 01:19:29 +000079 if (!m_opaque->HasConnection ())
80 m_opaque->SetConnection (new ConnectionFileDescriptor());
81 return m_opaque->Connect (url, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000082 }
83 return eConnectionStatusNoConnection;
84}
85
86ConnectionStatus
87SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
88{
Caroline Ticeceb6b132010-10-26 03:11:13 +000089 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
90
91 if (log)
92 log->Printf ("SBCommunication::AdoptFileDescriptor (%d, %s)", fd, (owns_fd ? "true" : "false"));
93
Greg Clayton66111032010-06-23 01:19:29 +000094 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095 {
Greg Clayton66111032010-06-23 01:19:29 +000096 if (m_opaque->HasConnection ())
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097 {
Greg Clayton66111032010-06-23 01:19:29 +000098 if (m_opaque->IsConnected())
Caroline Ticeceb6b132010-10-26 03:11:13 +000099 m_opaque->Disconnect();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000100 }
Greg Clayton66111032010-06-23 01:19:29 +0000101 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
102 if (m_opaque->IsConnected())
Caroline Ticeceb6b132010-10-26 03:11:13 +0000103 {
104 if (log)
105 log->Printf ("SBCommunication::AdoptFileDescriptor ==> eConnectionStatusSuccess");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000106 return eConnectionStatusSuccess;
Caroline Ticeceb6b132010-10-26 03:11:13 +0000107 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000108 else
Caroline Ticeceb6b132010-10-26 03:11:13 +0000109 {
110 if (log)
111 log->Printf ("SBCommunication::AdoptFileDescriptor ==> eConnectionStatusLostConnection");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000112 return eConnectionStatusLostConnection;
Caroline Ticeceb6b132010-10-26 03:11:13 +0000113 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000114 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000115
116 if (log)
117 log->Printf ("SBCommunication::AdoptFileDescriptor ==> eConnectionStatusNoConnection");
118
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000119 return eConnectionStatusNoConnection;
120}
121
122
123ConnectionStatus
124SBCommunication::Disconnect ()
125{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000126 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
127
128 if (log)
129 log->Printf ("SBCommunication::Disconnect ()");
130
131 ConnectionStatus status= eConnectionStatusNoConnection;
Greg Clayton66111032010-06-23 01:19:29 +0000132 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000133 status = m_opaque->Disconnect ();
134
135 if (log)
136 log->Printf ("SBCommunication::Disconnect ==> %s", Communication::ConnectionStatusAsCString (status));
137
138 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000139}
140
141bool
142SBCommunication::IsConnected () const
143{
Greg Clayton66111032010-06-23 01:19:29 +0000144 if (m_opaque)
145 return m_opaque->IsConnected ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000146 return false;
147}
148
149size_t
150SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
151{
Greg Clayton66111032010-06-23 01:19:29 +0000152 if (m_opaque)
153 return m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000154 status = eConnectionStatusNoConnection;
155 return 0;
156}
157
158
159size_t
160SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
161{
Greg Clayton66111032010-06-23 01:19:29 +0000162 if (m_opaque)
163 return m_opaque->Write (src, src_len, status, NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000164 status = eConnectionStatusNoConnection;
165 return 0;
166}
167
168bool
169SBCommunication::ReadThreadStart ()
170{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000171 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
172
173 if (log)
174 log->Printf ("SBCommunication::ReadThreadStart ()");
175
176 bool success = false;
Greg Clayton66111032010-06-23 01:19:29 +0000177 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000178 success = m_opaque->StartReadThread ();
179
180 if (log)
181 log->Printf ("SBCommunication::ReadThreadStart ==> %s", (success ? "true" : "false"));
182
183 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000184}
185
186
187bool
188SBCommunication::ReadThreadStop ()
189{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000190 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
191
192 if (log)
193 log->Printf ("SBCommunication::ReadThreadStop ()");
194
195 bool success = false;
Greg Clayton66111032010-06-23 01:19:29 +0000196 if (m_opaque)
Caroline Ticeceb6b132010-10-26 03:11:13 +0000197 success = m_opaque->StopReadThread ();
198
199 if (log)
200 log->Printf ("SBCommunication::ReadThreadStop ==> %s", (success ? "true" : "false"));
201
202 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000203}
204
205bool
206SBCommunication::ReadThreadIsRunning ()
207{
Greg Clayton66111032010-06-23 01:19:29 +0000208 if (m_opaque)
209 return m_opaque->ReadThreadIsRunning ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000210 return false;
211}
212
213bool
214SBCommunication::SetReadThreadBytesReceivedCallback
215(
216 ReadThreadBytesReceived callback,
217 void *callback_baton
218)
219{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000220 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
221
222 if (log)
223 log->Printf ("SBCommunication::SetReadThreadBytesReceivedCallback (callback, baton)");
224 // CAROLINE: Fixme: Fix the arguments printed out in the log message above
225
Greg Clayton66111032010-06-23 01:19:29 +0000226 if (m_opaque)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000227 {
Greg Clayton66111032010-06-23 01:19:29 +0000228 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000229 if (log)
230 log->Printf ("SBCommunication::SetReaDThreadBytesReceivedCallback ==> true");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000231 return true;
232 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000233
234 if (log)
235 log->Printf ("SBCommunication::SetReaDThreadBytesReceivedCallback ==> false");
236
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000237 return false;
238}
239
240SBBroadcaster
241SBCommunication::GetBroadcaster ()
242{
Greg Clayton66111032010-06-23 01:19:29 +0000243 SBBroadcaster broadcaster (m_opaque, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000244 return broadcaster;
245}
246
247
248//
249//void
250//SBCommunication::CreateIfNeeded ()
251//{
Greg Clayton66111032010-06-23 01:19:29 +0000252// if (m_opaque == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000253// {
254// static uint32_t g_broadcaster_num;
255// char broadcaster_name[256];
256// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton66111032010-06-23 01:19:29 +0000257// m_opaque = new Communication (broadcaster_name);
258// m_opaque_owned = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000259// }
Greg Clayton66111032010-06-23 01:19:29 +0000260// assert (m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000261//}
262//
263//