blob: b1ae37b33154885ee917a5660bbc3096cb99f985 [file] [log] [blame]
Chris Lattner24943d22010-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"
14
15using namespace lldb;
16using namespace lldb_private;
17
18
19
20SBCommunication::SBCommunication() :
Greg Clayton63094e02010-06-23 01:19:29 +000021 m_opaque (NULL),
22 m_opaque_owned (false)
Chris Lattner24943d22010-06-08 16:52:24 +000023{
24}
25
26SBCommunication::SBCommunication(const char * broadcaster_name) :
Greg Clayton63094e02010-06-23 01:19:29 +000027 m_opaque (new Communication (broadcaster_name)),
28 m_opaque_owned (true)
Chris Lattner24943d22010-06-08 16:52:24 +000029{
30}
31
32SBCommunication::~SBCommunication()
33{
Greg Clayton63094e02010-06-23 01:19:29 +000034 if (m_opaque && m_opaque_owned)
35 delete m_opaque;
36 m_opaque = NULL;
37 m_opaque_owned = false;
Chris Lattner24943d22010-06-08 16:52:24 +000038}
39
40ConnectionStatus
41SBCommunication::CheckIfBytesAvailable ()
42{
Greg Clayton63094e02010-06-23 01:19:29 +000043 if (m_opaque)
44 return m_opaque->BytesAvailable (0, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000045 return eConnectionStatusNoConnection;
46}
47
48ConnectionStatus
49SBCommunication::WaitForBytesAvailableInfinite ()
50{
Greg Clayton63094e02010-06-23 01:19:29 +000051 if (m_opaque)
52 return m_opaque->BytesAvailable (UINT32_MAX, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000053 return eConnectionStatusNoConnection;
54}
55
56ConnectionStatus
57SBCommunication::WaitForBytesAvailableWithTimeout (uint32_t timeout_usec)
58{
Greg Clayton63094e02010-06-23 01:19:29 +000059 if (m_opaque)
60 return m_opaque->BytesAvailable (timeout_usec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000061 return eConnectionStatusNoConnection;
62}
63
64ConnectionStatus
65SBCommunication::Connect (const char *url)
66{
Greg Clayton63094e02010-06-23 01:19:29 +000067 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +000068 {
Greg Clayton63094e02010-06-23 01:19:29 +000069 if (!m_opaque->HasConnection ())
70 m_opaque->SetConnection (new ConnectionFileDescriptor());
71 return m_opaque->Connect (url, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +000072 }
73 return eConnectionStatusNoConnection;
74}
75
76ConnectionStatus
77SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
78{
Greg Clayton63094e02010-06-23 01:19:29 +000079 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +000080 {
Greg Clayton63094e02010-06-23 01:19:29 +000081 if (m_opaque->HasConnection ())
Chris Lattner24943d22010-06-08 16:52:24 +000082 {
Greg Clayton63094e02010-06-23 01:19:29 +000083 if (m_opaque->IsConnected())
84 m_opaque->Disconnect ();
Chris Lattner24943d22010-06-08 16:52:24 +000085 }
Greg Clayton63094e02010-06-23 01:19:29 +000086 m_opaque->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
87 if (m_opaque->IsConnected())
Chris Lattner24943d22010-06-08 16:52:24 +000088 return eConnectionStatusSuccess;
89 else
90 return eConnectionStatusLostConnection;
91 }
92 return eConnectionStatusNoConnection;
93}
94
95
96ConnectionStatus
97SBCommunication::Disconnect ()
98{
Greg Clayton63094e02010-06-23 01:19:29 +000099 if (m_opaque)
100 return m_opaque->Disconnect ();
Chris Lattner24943d22010-06-08 16:52:24 +0000101 return eConnectionStatusNoConnection;
102}
103
104bool
105SBCommunication::IsConnected () const
106{
Greg Clayton63094e02010-06-23 01:19:29 +0000107 if (m_opaque)
108 return m_opaque->IsConnected ();
Chris Lattner24943d22010-06-08 16:52:24 +0000109 return false;
110}
111
112size_t
113SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
114{
Greg Clayton63094e02010-06-23 01:19:29 +0000115 if (m_opaque)
116 return m_opaque->Read (dst, dst_len, timeout_usec, status, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000117 status = eConnectionStatusNoConnection;
118 return 0;
119}
120
121
122size_t
123SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
124{
Greg Clayton63094e02010-06-23 01:19:29 +0000125 if (m_opaque)
126 return m_opaque->Write (src, src_len, status, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000127 status = eConnectionStatusNoConnection;
128 return 0;
129}
130
131bool
132SBCommunication::ReadThreadStart ()
133{
Greg Clayton63094e02010-06-23 01:19:29 +0000134 if (m_opaque)
135 return m_opaque->StartReadThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000136 return false;
137}
138
139
140bool
141SBCommunication::ReadThreadStop ()
142{
Greg Clayton63094e02010-06-23 01:19:29 +0000143 if (m_opaque)
144 return m_opaque->StopReadThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000145 return false;
146}
147
148bool
149SBCommunication::ReadThreadIsRunning ()
150{
Greg Clayton63094e02010-06-23 01:19:29 +0000151 if (m_opaque)
152 return m_opaque->ReadThreadIsRunning ();
Chris Lattner24943d22010-06-08 16:52:24 +0000153 return false;
154}
155
156bool
157SBCommunication::SetReadThreadBytesReceivedCallback
158(
159 ReadThreadBytesReceived callback,
160 void *callback_baton
161)
162{
Greg Clayton63094e02010-06-23 01:19:29 +0000163 if (m_opaque)
Chris Lattner24943d22010-06-08 16:52:24 +0000164 {
Greg Clayton63094e02010-06-23 01:19:29 +0000165 m_opaque->SetReadThreadBytesReceivedCallback (callback, callback_baton);
Chris Lattner24943d22010-06-08 16:52:24 +0000166 return true;
167 }
168 return false;
169}
170
171SBBroadcaster
172SBCommunication::GetBroadcaster ()
173{
Greg Clayton63094e02010-06-23 01:19:29 +0000174 SBBroadcaster broadcaster (m_opaque, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000175 return broadcaster;
176}
177
178
179//
180//void
181//SBCommunication::CreateIfNeeded ()
182//{
Greg Clayton63094e02010-06-23 01:19:29 +0000183// if (m_opaque == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000184// {
185// static uint32_t g_broadcaster_num;
186// char broadcaster_name[256];
187// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton63094e02010-06-23 01:19:29 +0000188// m_opaque = new Communication (broadcaster_name);
189// m_opaque_owned = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000190// }
Greg Clayton63094e02010-06-23 01:19:29 +0000191// assert (m_opaque);
Chris Lattner24943d22010-06-08 16:52:24 +0000192//}
193//
194//