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
23 typedef 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.
35 namespace lldb_vscode {
36 struct 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 
54 struct 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 
64 struct OutputStream {
65   StreamDescriptor descriptor;
66 
67   bool write_full(llvm::StringRef str);
68 };
69 } // namespace lldb_vscode
70 
71 #endif
72