blob: fd5c7d72af502ebc71e8a1581de039e74cef235e [file] [log] [blame]
Jayanth Othayothbf54cbb2021-06-03 04:36:48 -05001#pragma once
2
3#include <filesystem>
4#include <utility>
5
6namespace openpower
7{
8namespace pels
9{
10namespace util
11{
12
13namespace fs = std::filesystem;
14
15/**
16 * @class TemporaryFile
17 *
18 * A temporary file in the file system.
19 *
20 * The temporary file is created by the constructor. The absolute path to the
21 * file can be obtained using getPath().
22 *
23 * Note: Callers responsibility to delete the file after usage.
24 * The temporary file can be deleted by calling remove().
25 *
26 * TemporaryFile objects cannot be copied, but they can be moved. This enables
27 * them to be stored in containers like std::vector.
28 */
29class TemporaryFile
30{
31 public:
32 // Specify which compiler-generated methods we want
33 TemporaryFile(const TemporaryFile&) = delete;
34 TemporaryFile& operator=(const TemporaryFile&) = delete;
35
36 /**
37 * Constructor.
38 *
39 * Creates a temporary file in the temporary directory (normally /tmp).
40 *
41 * Throws an exception if the file cannot be created.
42 *
43 * @param data - data buffer
44 * @param len - length of the data buffer
45 */
46 TemporaryFile(const char* data, const uint32_t len);
47
48 /**
49 * Move constructor.
50 *
51 * Transfers ownership of a temporary file.
52 *
53 * @param file TemporaryFile object being moved
54 */
55 TemporaryFile(TemporaryFile&& file) : path{std::move(file.path)}
56 {
57 // Clear path in other object; after move path is in unspecified state
58 file.path.clear();
59 }
60
61 /**
62 * Move assignment operator.
63 *
64 * Deletes the temporary file owned by this object. Then transfers
65 * ownership of the temporary file owned by the other object.
66 *
67 * Throws an exception if an error occurs during the deletion.
68 *
69 * @param file TemporaryFile object being moved
70 */
71 TemporaryFile& operator=(TemporaryFile&& file);
72
73 /**
74 * Destructor.
75 */
Patrick Williams2544b412022-10-04 08:41:06 -050076 ~TemporaryFile() {}
Jayanth Othayothbf54cbb2021-06-03 04:36:48 -050077
78 /**
79 * Deletes the temporary file.
80 *
81 * Does nothing if the file has already been deleted.
82 *
83 * Throws an exception if an error occurs during the deletion.
84 */
85 void remove();
86
87 /**
88 * Returns the absolute path to the temporary file.
89 *
90 * Returns an empty path if the file has been deleted.
91 *
92 * @return temporary file path
93 */
94 const fs::path& getPath() const
95 {
96 return path;
97 }
98
99 int getFd() const
100 {
101 return fd;
102 }
103
104 private:
105 /**
106 * Absolute path to the temporary file.
107 */
108 fs::path path{};
109
110 /**
111 * File descriptor of the temporary file.
112 */
113 int fd;
114};
115
116} // namespace util
117} // namespace pels
118} // namespace openpower