// SPDX-License-Identifier: LGPL-2.1-or-later /*************************************************************************************************** * * * Copyright (c) 2025 The FreeCAD project association AISBL * * * * This file is part of FreeCAD. * * * * FreeCAD is free software: you can redistribute it and/or modify it under the terms of the * * GNU Lesser General Public License as published by the Free Software Foundation, either * * version 2.1 of the License, or (at your option) any later version. * * * * FreeCAD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public License along with FreeCAD. * * If not, see . * * * **************************************************************************************************/ #include #include #include #include #include "Application.h" // inclusion of the generated files (generated out of ApplicationDirectories.pyi) #include #include // NOLINT namespace fs = std::filesystem; using namespace App; // NOLINTBEGIN(cppcoreguidelines-pro-type-vararg) // returns a string which represent the object e.g. when printed in python std::string ApplicationDirectoriesPy::representation() const { return {""}; } [[maybe_unused]] PyObject* ApplicationDirectoriesPy::usingCurrentVersionConfig(PyObject* args) { char *path = nullptr; if (!PyArg_ParseTuple(args, "s", &path)) { return nullptr; } bool result = App::Application::directories()->usingCurrentVersionConfig(Base::FileInfo::stringToPath(path)); return Py::new_reference_to(Py::Boolean(result)); } [[maybe_unused]] PyObject* ApplicationDirectoriesPy::migrateAllPaths(PyObject* args) { PyObject* object {nullptr}; if (!PyArg_ParseTuple(args, "O", &object)) { return nullptr; } if (PyTuple_Check(object) || PyList_Check(object)) { Py::Sequence seq(object); Py::Sequence::size_type size = seq.size(); std::vector paths; paths.resize(size); for (Py::Sequence::size_type i = 0; i < size; i++) { Py::Object item = seq[i]; if (!PyUnicode_Check(item.ptr())) { PyErr_SetString(PyExc_RuntimeError, "path was not a string"); return nullptr; } const char* s = PyUnicode_AsUTF8(item.ptr()); if (!s) { return nullptr; // PyUnicode_AsUTF8 sets an error } paths[i] = Base::FileInfo::stringToPath(s); } App::Application::directories()->migrateAllPaths(paths); } Py_Return; } [[maybe_unused]] PyObject* ApplicationDirectoriesPy::versionStringForPath(PyObject* args) { int major {0}; int minor {0}; if (!PyArg_ParseTuple(args, "ii", &major, &minor)) { return nullptr; } auto result = App::ApplicationDirectories::versionStringForPath(major, minor); return Py::new_reference_to(Py::String(result)); } [[maybe_unused]] PyObject* ApplicationDirectoriesPy::isVersionedPath(PyObject* args) { char *path = nullptr; if (!PyArg_ParseTuple(args, "s", &path)) { return nullptr; } bool result = App::Application::directories()->isVersionedPath(Base::FileInfo::stringToPath(path)); return Py::new_reference_to(Py::Boolean(result)); } [[maybe_unused]] PyObject* ApplicationDirectoriesPy::mostRecentAvailableConfigVersion(PyObject* args) { char *path = nullptr; if (!PyArg_ParseTuple(args, "s", &path)) { return nullptr; } std::string result = App::Application::directories()->mostRecentAvailableConfigVersion(Base::FileInfo::stringToPath(path)); return Py::new_reference_to(Py::String(result)); } [[maybe_unused]] PyObject* ApplicationDirectoriesPy::mostRecentConfigFromBase(PyObject* args) { char *path = nullptr; if (!PyArg_ParseTuple(args, "s", &path)) { return nullptr; } fs::path result = App::Application::directories()->mostRecentConfigFromBase(Base::FileInfo::stringToPath(path)); return Py::new_reference_to(Py::String(Base::FileInfo::pathToString(result))); } [[maybe_unused]] PyObject* ApplicationDirectoriesPy::migrateConfig(PyObject* args) { char *oldPath = nullptr; char *newPath = nullptr; if (!PyArg_ParseTuple(args, "ss", &oldPath, &newPath)) { return nullptr; } App::ApplicationDirectories::migrateConfig( Base::FileInfo::stringToPath(oldPath), Base::FileInfo::stringToPath(newPath)); Py_Return; } PyObject* ApplicationDirectoriesPy::getCustomAttributes([[maybe_unused]] const char* attr) const { return nullptr; } int ApplicationDirectoriesPy::setCustomAttributes([[maybe_unused]] const char* attr, [[maybe_unused]] PyObject* obj) { return 0; } // NOLINTEND(cppcoreguidelines-pro-type-vararg)