blob: 0eb9b6fefb0dca4e858f55db581b2a534de01149 [file] [log] [blame]
//===-- 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