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