| //===-- IOStream.h ----------------------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLDB_TOOLS_LLDB_VSCODE_IOSTREAM_H |
| #define LLDB_TOOLS_LLDB_VSCODE_IOSTREAM_H |
| |
| #include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX |
| |
| #if defined(_WIN32) |
| // We need to #define NOMINMAX in order to skip `min()` and `max()` macro |
| // definitions that conflict with other system headers. |
| // We also need to #undef GetObject (which is defined to GetObjectW) because |
| // the JSON code we use also has methods named `GetObject()` and we conflict |
| // against these. |
| #define NOMINMAX |
| #include <windows.h> |
| #else |
| typedef int SOCKET; |
| #endif |
| |
| #include "llvm/ADT/StringRef.h" |
| |
| #include <fstream> |
| #include <string> |
| |
| // Windows requires different system calls for dealing with sockets and other |
| // types of files, so we can't simply have one code path that just uses read |
| // and write everywhere. So we need an abstraction in order to allow us to |
| // treat them identically. |
| namespace lldb_vscode { |
| struct StreamDescriptor { |
| StreamDescriptor(); |
| ~StreamDescriptor(); |
| StreamDescriptor(StreamDescriptor &&other); |
| |
| StreamDescriptor &operator=(StreamDescriptor &&other); |
| |
| static StreamDescriptor from_socket(SOCKET s, bool close); |
| static StreamDescriptor from_file(int fd, bool close); |
| |
| bool m_is_socket = false; |
| bool m_close = false; |
| union { |
| int m_fd; |
| SOCKET m_socket; |
| }; |
| }; |
| |
| struct InputStream { |
| StreamDescriptor descriptor; |
| |
| bool read_full(std::ofstream *log, size_t length, std::string &text); |
| |
| bool read_line(std::ofstream *log, std::string &line); |
| |
| bool read_expected(std::ofstream *log, llvm::StringRef expected); |
| }; |
| |
| struct OutputStream { |
| StreamDescriptor descriptor; |
| |
| bool write_full(llvm::StringRef str); |
| }; |
| } // namespace lldb_vscode |
| |
| #endif |