diff options
Diffstat (limited to 'lldb/tools/lldb-vscode/IOStream.h')
-rw-r--r-- | lldb/tools/lldb-vscode/IOStream.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lldb/tools/lldb-vscode/IOStream.h b/lldb/tools/lldb-vscode/IOStream.h new file mode 100644 index 00000000000..8414c09e9fe --- /dev/null +++ b/lldb/tools/lldb-vscode/IOStream.h @@ -0,0 +1,69 @@ +//===-- 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 LLDBVSCODE_IOSTREAM_H_ +#define LLDBVSCODE_IOSTREAM_H_ + +#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 |