Split the GDBRemoteCommunication class into three classes:
GDBRemoteCommunication - The base GDB remote communication class
GDBRemoteCommunicationClient - designed to be used for clients the connect to
                               a remote GDB server
GDBRemoteCommunicationServer - designed to be used on the server side of a
                               GDB server implementation.





git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@128070 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp
new file mode 100644
index 0000000..2e4ff70
--- /dev/null
+++ b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp
@@ -0,0 +1,134 @@
+//===-- GDBRemoteCommunicationServer.cpp ------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#include "GDBRemoteCommunicationServer.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+#include "llvm/ADT/Triple.h"
+#include "lldb/Interpreter/Args.h"
+#include "lldb/Core/ConnectionFileDescriptor.h"
+#include "lldb/Core/Log.h"
+#include "lldb/Core/State.h"
+#include "lldb/Core/StreamString.h"
+#include "lldb/Host/Host.h"
+#include "lldb/Host/TimeValue.h"
+
+// Project includes
+#include "Utility/StringExtractorGDBRemote.h"
+#include "ProcessGDBRemote.h"
+#include "ProcessGDBRemoteLog.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//----------------------------------------------------------------------
+// GDBRemoteCommunicationServer constructor
+//----------------------------------------------------------------------
+GDBRemoteCommunicationServer::GDBRemoteCommunicationServer() :
+    GDBRemoteCommunication ("gdb-remote.server", "gdb-remote.server.rx_packet"),
+    m_async_thread (LLDB_INVALID_HOST_THREAD),
+    m_send_acks (true)
+{
+}
+
+//----------------------------------------------------------------------
+// Destructor
+//----------------------------------------------------------------------
+GDBRemoteCommunicationServer::~GDBRemoteCommunicationServer()
+{
+}
+
+
+//void *
+//GDBRemoteCommunicationServer::AsyncThread (void *arg)
+//{
+//    GDBRemoteCommunicationServer *server = (GDBRemoteCommunicationServer*) arg;
+//
+//    LogSP log;// (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
+//    if (log)
+//        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, arg, process->GetID());
+//
+//    StringExtractorGDBRemote packet;
+//    
+//    while ()
+//    {
+//        if (packet.
+//    }
+//
+//    if (log)
+//        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, arg, process->GetID());
+//
+//    process->m_async_thread = LLDB_INVALID_HOST_THREAD;
+//    return NULL;
+//}
+//
+bool
+GDBRemoteCommunicationServer::GetPacketAndSendResponse (const TimeValue* timeout_time_ptr)
+{
+    StringExtractorGDBRemote packet;
+    if (WaitForPacketNoLock (packet, timeout_time_ptr))
+    {
+        const StringExtractorGDBRemote::ServerPacketType packet_type = packet.GetServerPacketType ();
+        switch (packet_type)
+        {
+        case StringExtractorGDBRemote::eServerPacketType_nack:
+        case StringExtractorGDBRemote::eServerPacketType_ack:
+            break;
+
+        case StringExtractorGDBRemote::eServerPacketType_invalid:
+        case StringExtractorGDBRemote::eServerPacketType_unimplemented:
+            return SendUnimplementedResponse () > 0;
+
+        case StringExtractorGDBRemote::eServerPacketType_qHostInfo:
+            return Handle_qHostInfo ();
+        }
+        return true;
+    }
+    return false;
+}
+
+size_t
+GDBRemoteCommunicationServer::SendUnimplementedResponse ()
+{
+    return SendPacket ("");
+}
+
+
+bool
+GDBRemoteCommunicationServer::Handle_qHostInfo ()
+{
+    StreamString response;
+    
+    // $cputype:16777223;cpusubtype:3;ostype:Darwin;vendor:apple;endian:little;ptrsize:8;#00
+
+    ArchSpec host_arch (Host::GetArchitecture ());
+    
+    const llvm::Triple &host_triple = host_arch.GetTriple();
+    const llvm::StringRef arch_name (host_triple.getArchName());
+    const llvm::StringRef vendor_name (host_triple.getOSName());
+    const llvm::StringRef os_name (host_triple.getVendorName());
+    response.Printf ("arch:%.*s;ostype:%.*s;vendor:%.*s;ptrsize:%u", 
+                     (int)arch_name.size(), arch_name.data(),
+                     (int)os_name.size(), os_name.data(),
+                     (int)vendor_name.size(), vendor_name.data(),
+                     host_arch.GetAddressByteSize());
+
+    switch (lldb::endian::InlHostByteOrder())
+    {
+    case eByteOrderBig:     response.PutCString ("endian:big;"); break;
+    case eByteOrderLittle:  response.PutCString ("endian:little;"); break;
+    case eByteOrderPDP:     response.PutCString ("endian:pdp;"); break;
+    default:                response.PutCString ("endian:unknown;"); break;
+    }
+    
+    return SendPacket (response.GetString().c_str(),response.GetString().size()) > 0;
+}