1//===-- IOStream.h ----------------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLDB_TOOLS_LLDB_VSCODE_IOSTREAM_H 10#define LLDB_TOOLS_LLDB_VSCODE_IOSTREAM_H 11 12#include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX 13 14#if defined(_WIN32) 15// We need to #define NOMINMAX in order to skip `min()` and `max()` macro 16// definitions that conflict with other system headers. 17// We also need to #undef GetObject (which is defined to GetObjectW) because 18// the JSON code we use also has methods named `GetObject()` and we conflict 19// against these. 20#define NOMINMAX 21#include <windows.h> 22#else 23typedef int SOCKET; 24#endif 25 26#include "llvm/ADT/StringRef.h" 27 28#include <fstream> 29#include <string> 30 31// Windows requires different system calls for dealing with sockets and other 32// types of files, so we can't simply have one code path that just uses read 33// and write everywhere. So we need an abstraction in order to allow us to 34// treat them identically. 35namespace lldb_vscode { 36struct StreamDescriptor { 37 StreamDescriptor(); 38 ~StreamDescriptor(); 39 StreamDescriptor(StreamDescriptor &&other); 40 41 StreamDescriptor &operator=(StreamDescriptor &&other); 42 43 static StreamDescriptor from_socket(SOCKET s, bool close); 44 static StreamDescriptor from_file(int fd, bool close); 45 46 bool m_is_socket = false; 47 bool m_close = false; 48 union { 49 int m_fd; 50 SOCKET m_socket; 51 }; 52}; 53 54struct InputStream { 55 StreamDescriptor descriptor; 56 57 bool read_full(std::ofstream *log, size_t length, std::string &text); 58 59 bool read_line(std::ofstream *log, std::string &line); 60 61 bool read_expected(std::ofstream *log, llvm::StringRef expected); 62}; 63 64struct OutputStream { 65 StreamDescriptor descriptor; 66 67 bool write_full(llvm::StringRef str); 68}; 69} // namespace lldb_vscode 70 71#endif 72