1 //===-- FifoFiles.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_FIFOFILES_H
10 #define LLDB_TOOLS_LLDB_VSCODE_FIFOFILES_H
11 
12 #include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX
13 #include "llvm/Support/Error.h"
14 
15 #include "JSONUtils.h"
16 
17 namespace lldb_vscode {
18 
19 /// Struct that controls the life of a fifo file in the filesystem.
20 ///
21 /// The file is destroyed when the destructor is invoked.
22 struct FifoFile {
23   FifoFile(llvm::StringRef path);
24 
25   ~FifoFile();
26 
27   std::string m_path;
28 };
29 
30 /// Create a fifo file in the filesystem.
31 ///
32 /// \param[in] path
33 ///     The path for the fifo file.
34 ///
35 /// \return
36 ///     A \a std::shared_ptr<FifoFile> if the file could be created, or an
37 ///     \a llvm::Error in case of failures.
38 llvm::Expected<std::shared_ptr<FifoFile>> CreateFifoFile(llvm::StringRef path);
39 
40 class FifoFileIO {
41 public:
42   /// \param[in] fifo_file
43   ///     The path to an input fifo file that exists in the file system.
44   ///
45   /// \param[in] other_endpoint_name
46   ///     A human readable name for the other endpoint that will communicate
47   ///     using this file. This is used for error messages.
48   FifoFileIO(llvm::StringRef fifo_file, llvm::StringRef other_endpoint_name);
49 
50   /// Read the next JSON object from the underlying input fifo file.
51   ///
52   /// The JSON object is expected to be a single line delimited with \a
53   /// std::endl.
54   ///
55   /// \return
56   ///     An \a llvm::Error object indicating the success or failure of this
57   ///     operation. Failures arise if the timeout is hit, the next line of text
58   ///     from the fifo file is not a valid JSON object, or is it impossible to
59   ///     read from the file.
60   llvm::Expected<llvm::json::Value> ReadJSON(std::chrono::milliseconds timeout);
61 
62   /// Serialize a JSON object and write it to the underlying output fifo file.
63   ///
64   /// \param[in] json
65   ///     The JSON object to send. It will be printed as a single line delimited
66   ///     with \a std::endl.
67   ///
68   /// \param[in] timeout
69   ///     A timeout for how long we should until for the data to be consumed.
70   ///
71   /// \return
72   ///     An \a llvm::Error object indicating whether the data was consumed by
73   ///     a reader or not.
74   llvm::Error SendJSON(
75       const llvm::json::Value &json,
76       std::chrono::milliseconds timeout = std::chrono::milliseconds(20000));
77 
78 private:
79   std::string m_fifo_file;
80   std::string m_other_endpoint_name;
81 };
82 
83 } // namespace lldb_vscode
84 
85 #endif // LLDB_TOOLS_LLDB_VSCODE_FIFOFILES_H
86