xref: /openbmc/phosphor-power/temporary_subdirectory.hpp (revision de5434d86d394a788fdad2f27629f28ff2b84e23)
1*de5434d8SShawn McCarney /**
2*de5434d8SShawn McCarney  * Copyright © 2024 IBM Corporation
3*de5434d8SShawn McCarney  *
4*de5434d8SShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
5*de5434d8SShawn McCarney  * you may not use this file except in compliance with the License.
6*de5434d8SShawn McCarney  * You may obtain a copy of the License at
7*de5434d8SShawn McCarney  *
8*de5434d8SShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
9*de5434d8SShawn McCarney  *
10*de5434d8SShawn McCarney  * Unless required by applicable law or agreed to in writing, software
11*de5434d8SShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
12*de5434d8SShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*de5434d8SShawn McCarney  * See the License for the specific language governing permissions and
14*de5434d8SShawn McCarney  * limitations under the License.
15*de5434d8SShawn McCarney  */
16*de5434d8SShawn McCarney #pragma once
17*de5434d8SShawn McCarney 
18*de5434d8SShawn McCarney #include <filesystem>
19*de5434d8SShawn McCarney #include <utility>
20*de5434d8SShawn McCarney 
21*de5434d8SShawn McCarney namespace phosphor::power::util
22*de5434d8SShawn McCarney {
23*de5434d8SShawn McCarney 
24*de5434d8SShawn McCarney /**
25*de5434d8SShawn McCarney  * @class TemporarySubDirectory
26*de5434d8SShawn McCarney  *
27*de5434d8SShawn McCarney  * A temporary subdirectory in the file system.
28*de5434d8SShawn McCarney  *
29*de5434d8SShawn McCarney  * This class does NOT represent the system temporary directory (such as /tmp).
30*de5434d8SShawn McCarney  * It represents a temporary subdirectory below that directory.
31*de5434d8SShawn McCarney  *
32*de5434d8SShawn McCarney  * The temporary subdirectory is created by the constructor.  The absolute path
33*de5434d8SShawn McCarney  * to the subdirectory can be obtained using getPath().
34*de5434d8SShawn McCarney  *
35*de5434d8SShawn McCarney  * The temporary subdirectory can be deleted by calling remove().  Otherwise the
36*de5434d8SShawn McCarney  * subdirectory will be deleted by the destructor.
37*de5434d8SShawn McCarney  *
38*de5434d8SShawn McCarney  * TemporarySubDirectory objects cannot be copied, but they can be moved.  This
39*de5434d8SShawn McCarney  * enables them to be stored in containers like std::vector.
40*de5434d8SShawn McCarney  */
41*de5434d8SShawn McCarney class TemporarySubDirectory
42*de5434d8SShawn McCarney {
43*de5434d8SShawn McCarney   public:
44*de5434d8SShawn McCarney     // Specify which compiler-generated methods we want
45*de5434d8SShawn McCarney     TemporarySubDirectory(const TemporarySubDirectory&) = delete;
46*de5434d8SShawn McCarney     TemporarySubDirectory& operator=(const TemporarySubDirectory&) = delete;
47*de5434d8SShawn McCarney 
48*de5434d8SShawn McCarney     /**
49*de5434d8SShawn McCarney      * Constructor.
50*de5434d8SShawn McCarney      *
51*de5434d8SShawn McCarney      * Creates a temporary subdirectory below the system temporary directory
52*de5434d8SShawn McCarney      * (such as /tmp).
53*de5434d8SShawn McCarney      *
54*de5434d8SShawn McCarney      * Throws an exception if the subdirectory cannot be created.
55*de5434d8SShawn McCarney      */
56*de5434d8SShawn McCarney     TemporarySubDirectory();
57*de5434d8SShawn McCarney 
58*de5434d8SShawn McCarney     /**
59*de5434d8SShawn McCarney      * Move constructor.
60*de5434d8SShawn McCarney      *
61*de5434d8SShawn McCarney      * Transfers ownership of a temporary subdirectory.
62*de5434d8SShawn McCarney      *
63*de5434d8SShawn McCarney      * @param subdirectory TemporarySubDirectory object being moved
64*de5434d8SShawn McCarney      */
TemporarySubDirectory(TemporarySubDirectory && subdirectory)65*de5434d8SShawn McCarney     TemporarySubDirectory(TemporarySubDirectory&& subdirectory) :
66*de5434d8SShawn McCarney         path{std::move(subdirectory.path)}
67*de5434d8SShawn McCarney     {
68*de5434d8SShawn McCarney         // Clear path in other object; after move path is in unspecified state
69*de5434d8SShawn McCarney         subdirectory.path.clear();
70*de5434d8SShawn McCarney     }
71*de5434d8SShawn McCarney 
72*de5434d8SShawn McCarney     /**
73*de5434d8SShawn McCarney      * Move assignment operator.
74*de5434d8SShawn McCarney      *
75*de5434d8SShawn McCarney      * Deletes the temporary subdirectory owned by this object.  Then transfers
76*de5434d8SShawn McCarney      * ownership of the temporary subdirectory owned by the other object.
77*de5434d8SShawn McCarney      *
78*de5434d8SShawn McCarney      * Throws an exception if an error occurs during the deletion.
79*de5434d8SShawn McCarney      *
80*de5434d8SShawn McCarney      * @param subdirectory TemporarySubDirectory object being moved
81*de5434d8SShawn McCarney      */
82*de5434d8SShawn McCarney     TemporarySubDirectory& operator=(TemporarySubDirectory&& subdirectory);
83*de5434d8SShawn McCarney 
84*de5434d8SShawn McCarney     /**
85*de5434d8SShawn McCarney      * Destructor.
86*de5434d8SShawn McCarney      *
87*de5434d8SShawn McCarney      * Deletes the temporary subdirectory if necessary.
88*de5434d8SShawn McCarney      */
~TemporarySubDirectory()89*de5434d8SShawn McCarney     ~TemporarySubDirectory()
90*de5434d8SShawn McCarney     {
91*de5434d8SShawn McCarney         try
92*de5434d8SShawn McCarney         {
93*de5434d8SShawn McCarney             remove();
94*de5434d8SShawn McCarney         }
95*de5434d8SShawn McCarney         catch (...)
96*de5434d8SShawn McCarney         {
97*de5434d8SShawn McCarney             // Destructors should not throw exceptions
98*de5434d8SShawn McCarney         }
99*de5434d8SShawn McCarney     }
100*de5434d8SShawn McCarney 
101*de5434d8SShawn McCarney     /**
102*de5434d8SShawn McCarney      * Deletes the temporary subdirectory.
103*de5434d8SShawn McCarney      *
104*de5434d8SShawn McCarney      * Does nothing if the subdirectory has already been deleted.
105*de5434d8SShawn McCarney      *
106*de5434d8SShawn McCarney      * Throws an exception if an error occurs during the deletion.
107*de5434d8SShawn McCarney      */
108*de5434d8SShawn McCarney     void remove();
109*de5434d8SShawn McCarney 
110*de5434d8SShawn McCarney     /**
111*de5434d8SShawn McCarney      * Returns the absolute path to the temporary subdirectory.
112*de5434d8SShawn McCarney      *
113*de5434d8SShawn McCarney      * Returns an empty path if the subdirectory has been deleted.
114*de5434d8SShawn McCarney      *
115*de5434d8SShawn McCarney      * @return temporary subdirectory path
116*de5434d8SShawn McCarney      */
getPath() const117*de5434d8SShawn McCarney     const std::filesystem::path& getPath() const
118*de5434d8SShawn McCarney     {
119*de5434d8SShawn McCarney         return path;
120*de5434d8SShawn McCarney     }
121*de5434d8SShawn McCarney 
122*de5434d8SShawn McCarney   private:
123*de5434d8SShawn McCarney     /**
124*de5434d8SShawn McCarney      * Absolute path to the temporary subdirectory.
125*de5434d8SShawn McCarney      *
126*de5434d8SShawn McCarney      * Empty when subdirectory has been deleted.
127*de5434d8SShawn McCarney      */
128*de5434d8SShawn McCarney     std::filesystem::path path{};
129*de5434d8SShawn McCarney };
130*de5434d8SShawn McCarney 
131*de5434d8SShawn McCarney } // namespace phosphor::power::util
132