/** * Copyright © 2024 IBM Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include namespace phosphor::power::util { /** * @class TemporarySubDirectory * * A temporary subdirectory in the file system. * * This class does NOT represent the system temporary directory (such as /tmp). * It represents a temporary subdirectory below that directory. * * The temporary subdirectory is created by the constructor. The absolute path * to the subdirectory can be obtained using getPath(). * * The temporary subdirectory can be deleted by calling remove(). Otherwise the * subdirectory will be deleted by the destructor. * * TemporarySubDirectory objects cannot be copied, but they can be moved. This * enables them to be stored in containers like std::vector. */ class TemporarySubDirectory { public: // Specify which compiler-generated methods we want TemporarySubDirectory(const TemporarySubDirectory&) = delete; TemporarySubDirectory& operator=(const TemporarySubDirectory&) = delete; /** * Constructor. * * Creates a temporary subdirectory below the system temporary directory * (such as /tmp). * * Throws an exception if the subdirectory cannot be created. */ TemporarySubDirectory(); /** * Move constructor. * * Transfers ownership of a temporary subdirectory. * * @param subdirectory TemporarySubDirectory object being moved */ TemporarySubDirectory(TemporarySubDirectory&& subdirectory) : path{std::move(subdirectory.path)} { // Clear path in other object; after move path is in unspecified state subdirectory.path.clear(); } /** * Move assignment operator. * * Deletes the temporary subdirectory owned by this object. Then transfers * ownership of the temporary subdirectory owned by the other object. * * Throws an exception if an error occurs during the deletion. * * @param subdirectory TemporarySubDirectory object being moved */ TemporarySubDirectory& operator=(TemporarySubDirectory&& subdirectory); /** * Destructor. * * Deletes the temporary subdirectory if necessary. */ ~TemporarySubDirectory() { try { remove(); } catch (...) { // Destructors should not throw exceptions } } /** * Deletes the temporary subdirectory. * * Does nothing if the subdirectory has already been deleted. * * Throws an exception if an error occurs during the deletion. */ void remove(); /** * Returns the absolute path to the temporary subdirectory. * * Returns an empty path if the subdirectory has been deleted. * * @return temporary subdirectory path */ const std::filesystem::path& getPath() const { return path; } private: /** * Absolute path to the temporary subdirectory. * * Empty when subdirectory has been deleted. */ std::filesystem::path path{}; }; } // namespace phosphor::power::util