Initial checkin of lldb code from internal Apple repo.

llvm-svn: 105619
diff --git a/lldb/source/API/SBCommunication.cpp b/lldb/source/API/SBCommunication.cpp
new file mode 100644
index 0000000..e2a7917
--- /dev/null
+++ b/lldb/source/API/SBCommunication.cpp
@@ -0,0 +1,194 @@
+//===-- SBCommunication.cpp -------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/API/SBCommunication.h"
+#include "lldb/API/SBBroadcaster.h"
+#include "lldb/Core/Communication.h"
+#include "lldb/Core/ConnectionFileDescriptor.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+
+
+SBCommunication::SBCommunication() :
+    m_lldb_object (NULL),
+    m_lldb_object_owned (false)
+{
+}
+
+SBCommunication::SBCommunication(const char * broadcaster_name) :
+    m_lldb_object (new Communication (broadcaster_name)),
+    m_lldb_object_owned (true)
+{
+}
+
+SBCommunication::~SBCommunication()
+{
+    if (m_lldb_object && m_lldb_object_owned)
+        delete m_lldb_object;
+    m_lldb_object = NULL;
+    m_lldb_object_owned = false;
+}
+
+ConnectionStatus
+SBCommunication::CheckIfBytesAvailable ()
+{
+    if (m_lldb_object)
+        return m_lldb_object->BytesAvailable (0, NULL);
+    return eConnectionStatusNoConnection;
+}
+
+ConnectionStatus
+SBCommunication::WaitForBytesAvailableInfinite ()
+{
+    if (m_lldb_object)
+        return m_lldb_object->BytesAvailable (UINT32_MAX, NULL);
+    return eConnectionStatusNoConnection;
+}
+
+ConnectionStatus
+SBCommunication::WaitForBytesAvailableWithTimeout (uint32_t timeout_usec)
+{
+    if (m_lldb_object)
+        return m_lldb_object->BytesAvailable (timeout_usec, NULL);
+    return eConnectionStatusNoConnection;
+}
+
+ConnectionStatus
+SBCommunication::Connect (const char *url)
+{
+    if (m_lldb_object)
+    {
+        if (!m_lldb_object->HasConnection ())
+            m_lldb_object->SetConnection (new ConnectionFileDescriptor());
+        return m_lldb_object->Connect (url, NULL);
+    }
+    return eConnectionStatusNoConnection;
+}
+
+ConnectionStatus
+SBCommunication::AdoptFileDesriptor (int fd, bool owns_fd)
+{
+    if (m_lldb_object)
+    {
+        if (m_lldb_object->HasConnection ())
+        {
+            if (m_lldb_object->IsConnected())
+                m_lldb_object->Disconnect ();
+        }
+        m_lldb_object->SetConnection (new ConnectionFileDescriptor (fd, owns_fd));
+        if (m_lldb_object->IsConnected())
+            return eConnectionStatusSuccess;
+        else
+            return eConnectionStatusLostConnection;
+    }
+    return eConnectionStatusNoConnection;
+}
+
+
+ConnectionStatus
+SBCommunication::Disconnect ()
+{
+    if (m_lldb_object)
+        return m_lldb_object->Disconnect ();
+    return eConnectionStatusNoConnection;
+}
+
+bool
+SBCommunication::IsConnected () const
+{
+    if (m_lldb_object)
+        return m_lldb_object->IsConnected ();
+    return false;
+}
+
+size_t
+SBCommunication::Read (void *dst, size_t dst_len, uint32_t timeout_usec, ConnectionStatus &status)
+{
+    if (m_lldb_object)
+        return m_lldb_object->Read (dst, dst_len, timeout_usec, status, NULL);
+    status = eConnectionStatusNoConnection;
+    return 0;
+}
+
+
+size_t
+SBCommunication::Write (const void *src, size_t src_len, ConnectionStatus &status)
+{
+    if (m_lldb_object)
+        return m_lldb_object->Write (src, src_len, status, NULL);
+    status = eConnectionStatusNoConnection;
+    return 0;
+}
+
+bool
+SBCommunication::ReadThreadStart ()
+{
+    if (m_lldb_object)
+        return m_lldb_object->StartReadThread ();
+    return false;
+}
+
+
+bool
+SBCommunication::ReadThreadStop ()
+{
+    if (m_lldb_object)
+        return m_lldb_object->StopReadThread ();
+    return false;
+}
+
+bool
+SBCommunication::ReadThreadIsRunning ()
+{
+    if (m_lldb_object)
+        return m_lldb_object->ReadThreadIsRunning ();
+    return false;
+}
+
+bool
+SBCommunication::SetReadThreadBytesReceivedCallback
+(
+    ReadThreadBytesReceived callback,
+    void *callback_baton
+)
+{
+    if (m_lldb_object)
+    {
+        m_lldb_object->SetReadThreadBytesReceivedCallback (callback, callback_baton);
+        return true;
+    }
+    return false;
+}
+
+SBBroadcaster
+SBCommunication::GetBroadcaster ()
+{
+    SBBroadcaster broadcaster (m_lldb_object, false);
+    return broadcaster;
+}
+
+
+//
+//void
+//SBCommunication::CreateIfNeeded ()
+//{
+//    if (m_lldb_object == NULL)
+//    {
+//        static uint32_t g_broadcaster_num;
+//        char broadcaster_name[256];
+//        ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
+//        m_lldb_object = new Communication (broadcaster_name);
+//        m_lldb_object_owned = true;
+//    }
+//    assert (m_lldb_object);
+//}
+//
+//