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