|  | // Copyright 2020 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef SRC_DEVELOPER_DEBUG_ZXDB_DEBUG_ADAPTER_SERVER_H_ | 
|  | #define SRC_DEVELOPER_DEBUG_ZXDB_DEBUG_ADAPTER_SERVER_H_ | 
|  |  | 
|  | #include <thread> | 
|  |  | 
|  | #include "src/developer/debug/shared/buffered_fd.h" | 
|  | #include "src/developer/debug/zxdb/client/session.h" | 
|  | #include "src/developer/debug/zxdb/debug_adapter/context.h" | 
|  |  | 
|  | namespace zxdb { | 
|  |  | 
|  | class DebugAdapterContext; | 
|  |  | 
|  | // Observer interface for DebugAdapterServer. Mainly used in tests. | 
|  | class DebugAdapterServerObserver { | 
|  | public: | 
|  | virtual void ClientConnected() {} | 
|  | virtual void ClientDisconnected() {} | 
|  | }; | 
|  |  | 
|  | // Waits for a single client connection and creates debug adapter context to cater to client | 
|  | // requests. Monitors the socket for connection loss and restarts the process of waiting for | 
|  | // incoming connections. | 
|  | class DebugAdapterServer { | 
|  | public: | 
|  | DebugAdapterServer(Session* session, uint16_t port); | 
|  |  | 
|  | ~DebugAdapterServer(); | 
|  |  | 
|  | // Setup server and wait for incoming connections on a background thread. | 
|  | Err Init(); | 
|  |  | 
|  | bool IsConnected() { return !!buffer_; } | 
|  |  | 
|  | void AddObserver(DebugAdapterServerObserver* observer) { observers_.AddObserver(observer); } | 
|  | void RemoveObserver(DebugAdapterServerObserver* observer) { observers_.RemoveObserver(observer); } | 
|  |  | 
|  | private: | 
|  | Session* session_; | 
|  | uint16_t port_; | 
|  |  | 
|  | fbl::unique_fd server_socket_; | 
|  | debug::MessageLoop* main_loop_ = nullptr; | 
|  |  | 
|  | std::unique_ptr<std::thread> background_thread_; | 
|  | bool background_thread_exit_ = false; | 
|  | fbl::unique_fd exit_pipe_[2]; | 
|  | std::unique_ptr<DebugAdapterContext> context_; | 
|  | std::unique_ptr<debug::BufferedFD> buffer_; | 
|  |  | 
|  | fxl::ObserverList<DebugAdapterServerObserver> observers_; | 
|  |  | 
|  | // NOTE: Only this method is executed on the background thread. All other methods must be called | 
|  | // from main thread. | 
|  | void ListenBackgroundThread(); | 
|  |  | 
|  | // Launch background thread and wait for new connections. | 
|  | void ListenConnection(); | 
|  |  | 
|  | // Create debug adapter context to cater to the client requests. | 
|  | void ConnectionResolvedMainThread(fbl::unique_fd client); | 
|  |  | 
|  | bool Accept(fbl::unique_fd& client); | 
|  |  | 
|  | void OnDisconnect(); | 
|  |  | 
|  | void ResetClientConnection(); | 
|  | FXL_DISALLOW_COPY_AND_ASSIGN(DebugAdapterServer); | 
|  | }; | 
|  |  | 
|  | }  // namespace zxdb | 
|  |  | 
|  | #endif  // SRC_DEVELOPER_DEBUG_ZXDB_DEBUG_ADAPTER_SERVER_H_ |