1 //===-- 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" 14 #include "lldb/Core/Log.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 20 21 SBCommunication::SBCommunication() : 22 m_opaque (NULL), 23 m_opaque_owned (false) 24 { 25 } 26 27 SBCommunication::SBCommunication(const char * broadcaster_name) : 28 m_opaque (new Communication (broadcaster_name)), 29 m_opaque_owned (true) 30 { 31 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 32 33 if (log) 34 log->Printf ("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => " 35 "SBCommunication(%p)", broadcaster_name, m_opaque); 36 } 37 38 SBCommunication::~SBCommunication() 39 { 40 if (m_opaque && m_opaque_owned) 41 delete m_opaque; 42 m_opaque = NULL; 43 m_opaque_owned = false; 44 } 45 46 bool 47 SBCommunication::IsValid () const 48 { 49 return m_opaque != NULL; 50 } 51 52 bool 53 SBCommunication::GetCloseOnEOF () 54 { 55 if (m_opaque) 56 return m_opaque->GetCloseOnEOF (); 57 return false; 58 } 59 60 void 61 SBCommunication::SetCloseOnEOF (bool b) 62 { 63 if (m_opaque) 64 m_opaque->SetCloseOnEOF (b); 65 } 66 67 ConnectionStatus 68 SBCommunication::Connect (const char *url) 69 { 70 if (m_opaque) 71 { 72 if (!m_opaque->HasConnection ()) 73 m_opaque->SetConnection (new ConnectionFileDescriptor()); 74 return m_opaque->Connect (url, NULL); 75 } 76 return eConnectionStatusNoConnection; 77 } 78 79 ConnectionStatus 80 SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd) 81 { 82 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 83 84 ConnectionStatus status = eConnectionStatusNoConnection; 85 if (m_opaque) 86 { 87 if (m_opaque->HasConnection ()) 88 { 89 if (m_opaque->IsConnected()) 90 m_opaque->Disconnect(); 91 } 92 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd)); 93 if (m_opaque->IsConnected()) 94 status = eConnectionStatusSuccess; 95 else 96 status = eConnectionStatusLostConnection; 97 } 98 99 if (log) 100 log->Printf ("SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s", 101 m_opaque, fd, owns_fd, Communication::ConnectionStatusAsCString (status)); 102 103 return status; 104 } 105 106 107 ConnectionStatus 108 SBCommunication::Disconnect () 109 { 110 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 111 112 ConnectionStatus status= eConnectionStatusNoConnection; 113 if (m_opaque) 114 status = m_opaque->Disconnect (); 115 116 if (log) 117 log->Printf ("SBCommunication(%p)::Disconnect () => %s", m_opaque, 118 Communication::ConnectionStatusAsCString (status)); 119 120 return status; 121 } 122 123 bool 124 SBCommunication::IsConnected () const 125 { 126 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 127 bool result = false; 128 if (m_opaque) 129 result = m_opaque->IsConnected (); 130 131 if (log) 132 log->Printf ("SBCommunication(%p)::IsConnected () => %i", m_opaque, result); 133 134 return false; 135 } 136 137 size_t 138 SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status) 139 { 140 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 141 if (log) 142 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status)...", 143 m_opaque, 144 dst, 145 (uint64_t)dst_len, 146 timeout_usec); 147 size_t bytes_read = 0; 148 if (m_opaque) 149 bytes_read = m_opaque->Read (dst, dst_len, timeout_usec, status, NULL); 150 else 151 status = eConnectionStatusNoConnection; 152 153 if (log) 154 log->Printf ("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64 ", timeout_usec=%u, &status=%s) => %" PRIu64, 155 m_opaque, 156 dst, 157 (uint64_t)dst_len, 158 timeout_usec, 159 Communication::ConnectionStatusAsCString (status), 160 (uint64_t)bytes_read); 161 return bytes_read; 162 } 163 164 165 size_t 166 SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status) 167 { 168 size_t bytes_written = 0; 169 if (m_opaque) 170 bytes_written = m_opaque->Write (src, src_len, status, NULL); 171 else 172 status = eConnectionStatusNoConnection; 173 174 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 175 if (log) 176 log->Printf ("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64 ", &status=%s) => %" PRIu64, 177 m_opaque, src, (uint64_t)src_len, Communication::ConnectionStatusAsCString (status), (uint64_t)bytes_written); 178 179 return 0; 180 } 181 182 bool 183 SBCommunication::ReadThreadStart () 184 { 185 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 186 187 bool success = false; 188 if (m_opaque) 189 success = m_opaque->StartReadThread (); 190 191 if (log) 192 log->Printf ("SBCommunication(%p)::ReadThreadStart () => %i", m_opaque, success); 193 194 return success; 195 } 196 197 198 bool 199 SBCommunication::ReadThreadStop () 200 { 201 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 202 if (log) 203 log->Printf ("SBCommunication(%p)::ReadThreadStop ()...", m_opaque); 204 205 bool success = false; 206 if (m_opaque) 207 success = m_opaque->StopReadThread (); 208 209 if (log) 210 log->Printf ("SBCommunication(%p)::ReadThreadStop () => %i", m_opaque, success); 211 212 return success; 213 } 214 215 bool 216 SBCommunication::ReadThreadIsRunning () 217 { 218 bool result = false; 219 if (m_opaque) 220 result = m_opaque->ReadThreadIsRunning (); 221 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 222 if (log) 223 log->Printf ("SBCommunication(%p)::ReadThreadIsRunning () => %i", m_opaque, result); 224 return result; 225 } 226 227 bool 228 SBCommunication::SetReadThreadBytesReceivedCallback 229 ( 230 ReadThreadBytesReceived callback, 231 void *callback_baton 232 ) 233 { 234 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 235 236 bool result = false; 237 if (m_opaque) 238 { 239 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton); 240 result = true; 241 } 242 243 if (log) 244 log->Printf ("SBCommunication(%p)::SetReadThreadBytesReceivedCallback (callback=%p, baton=%p) => %i", 245 m_opaque, callback, callback_baton, result); 246 247 return result; 248 } 249 250 SBBroadcaster 251 SBCommunication::GetBroadcaster () 252 { 253 SBBroadcaster broadcaster (m_opaque, false); 254 255 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 256 257 if (log) 258 log->Printf ("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)", 259 m_opaque, broadcaster.get()); 260 261 return broadcaster; 262 } 263 264 const char * 265 SBCommunication::GetBroadcasterClass () 266 { 267 return Communication::GetStaticBroadcasterClass().AsCString(); 268 } 269 270 // 271 //void 272 //SBCommunication::CreateIfNeeded () 273 //{ 274 // if (m_opaque == NULL) 275 // { 276 // static uint32_t g_broadcaster_num; 277 // char broadcaster_name[256]; 278 // ::snprintf (name, broadcaster_name, "%p SBCommunication", this); 279 // m_opaque = new Communication (broadcaster_name); 280 // m_opaque_owned = true; 281 // } 282 // assert (m_opaque); 283 //} 284 // 285 // 286