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