mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-31 06:42:07 +00:00
move the storage directory outside the actual plugin code folder
This commit is contained in:
@@ -632,7 +632,7 @@ void parse_metadata_rfc822(const std::string& content,
|
|||||||
bool is_ignored_plugin_directory(const boost::filesystem::path& path)
|
bool is_ignored_plugin_directory(const boost::filesystem::path& path)
|
||||||
{
|
{
|
||||||
const std::string name = path.filename().string();
|
const std::string name = path.filename().string();
|
||||||
return name.empty() || name[0] == '.' || name.rfind("__", 0) == 0 || name == PLUGIN_SUBSCRIBED_DIR;
|
return name.empty() || name[0] == '.' || name.rfind("__", 0) == 0 || name == PLUGIN_SUBSCRIBED_DIR || name == PLUGIN_DATA_DIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_safe_relative_path(const boost::filesystem::path& path)
|
bool is_safe_relative_path(const boost::filesystem::path& path)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#define PLUGIN_SUBSCRIBED_DIR "_subscribed"
|
#define PLUGIN_SUBSCRIBED_DIR "_subscribed"
|
||||||
|
#define PLUGIN_DATA_DIR "plugin_data"
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
|
|||||||
@@ -486,6 +486,38 @@ bool PluginManager::try_get_plugin_descriptor_for_capability(const std::string&
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string PluginManager::get_storage_dir(const std::string& plugin_key) const
|
||||||
|
{
|
||||||
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
|
PluginDescriptor descriptor;
|
||||||
|
if (!try_get_plugin_descriptor(plugin_key, descriptor))
|
||||||
|
throw std::runtime_error("The current plugin is not registered");
|
||||||
|
|
||||||
|
const fs::path base_storage_dir = fs::path(get_orca_plugins_dir()) / PLUGIN_DATA_DIR;
|
||||||
|
|
||||||
|
if (!descriptor.is_cloud_plugin()) {
|
||||||
|
const fs::path local_storage_dir = base_storage_dir / plugin_key;
|
||||||
|
fs::create_directories(local_storage_dir);
|
||||||
|
return local_storage_dir.string();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto agent = m_cloud_service.get_cloud_agent();
|
||||||
|
if (!agent)
|
||||||
|
throw std::runtime_error("Cloud plugin storage is unavailable before networking is initialized");
|
||||||
|
|
||||||
|
const std::string user_id = agent->get_user_id();
|
||||||
|
if (user_id.empty())
|
||||||
|
throw std::runtime_error("Cloud plugin storage is unavailable without a logged-in user");
|
||||||
|
|
||||||
|
if (!is_valid_plugin_id(plugin_key))
|
||||||
|
throw std::runtime_error("The current cloud plugin key is not a valid folder name");
|
||||||
|
|
||||||
|
const fs::path cloud_storage_dir = base_storage_dir / PLUGIN_SUBSCRIBED_DIR / user_id / plugin_key;
|
||||||
|
fs::create_directories(cloud_storage_dir);
|
||||||
|
return cloud_storage_dir.string();
|
||||||
|
}
|
||||||
|
|
||||||
// ── Capability instances ────────────────────────────────────────────────────────────────────
|
// ── Capability instances ────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
std::vector<std::shared_ptr<PluginCapabilityInterface>> PluginManager::get_plugin_capabilities(const std::string& plugin_key,
|
std::vector<std::shared_ptr<PluginCapabilityInterface>> PluginManager::get_plugin_capabilities(const std::string& plugin_key,
|
||||||
|
|||||||
@@ -138,6 +138,10 @@ public:
|
|||||||
bool try_get_plugin_descriptor_for_capability(const std::string& capability_name,
|
bool try_get_plugin_descriptor_for_capability(const std::string& capability_name,
|
||||||
PluginCapabilityType type,
|
PluginCapabilityType type,
|
||||||
PluginDescriptor& out) const;
|
PluginDescriptor& out) const;
|
||||||
|
// Per-plugin storage directory under orca_plugins/plugin_data, created if missing. Throws
|
||||||
|
// std::runtime_error if the plugin is unregistered, the key is invalid, or (cloud plugins)
|
||||||
|
// no user is logged in yet.
|
||||||
|
std::string get_storage_dir(const std::string& plugin_key) const;
|
||||||
|
|
||||||
std::vector<std::shared_ptr<PluginCapabilityInterface>> get_plugin_capabilities(
|
std::vector<std::shared_ptr<PluginCapabilityInterface>> get_plugin_capabilities(
|
||||||
const std::string& plugin_key = "", // "" => all plugins
|
const std::string& plugin_key = "", // "" => all plugins
|
||||||
|
|||||||
@@ -2,10 +2,7 @@
|
|||||||
#include "PluginHostBindings.hpp"
|
#include "PluginHostBindings.hpp"
|
||||||
#include "PluginHostUi.hpp"
|
#include "PluginHostUi.hpp"
|
||||||
#include <slic3r/plugin/PluginAuditManager.hpp>
|
#include <slic3r/plugin/PluginAuditManager.hpp>
|
||||||
#include <slic3r/plugin/PluginDescriptor.hpp>
|
|
||||||
#include <slic3r/plugin/PluginFsUtils.hpp>
|
|
||||||
#include <slic3r/plugin/PluginManager.hpp>
|
#include <slic3r/plugin/PluginManager.hpp>
|
||||||
#include <slic3r/GUI/GUI_App.hpp>
|
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
@@ -23,32 +20,7 @@ void register_plugin(pybind11::module_& host)
|
|||||||
if (plugin_key.empty())
|
if (plugin_key.empty())
|
||||||
throw std::runtime_error("plugin.storage() must be called from a plugin callback");
|
throw std::runtime_error("plugin.storage() must be called from a plugin callback");
|
||||||
|
|
||||||
PluginDescriptor descriptor;
|
return PluginManager::instance().get_storage_dir(plugin_key);
|
||||||
if (!PluginManager::instance().try_get_plugin_descriptor(plugin_key, descriptor))
|
|
||||||
throw std::runtime_error("The current plugin is not registered");
|
|
||||||
|
|
||||||
// plugin_root is populated for installed packages. If it is unavailable, the entry
|
|
||||||
// path still identifies the same package directory. This is important for local
|
|
||||||
// plugins: their directory is based on the source filename (including its extension),
|
|
||||||
// while plugin_key is based on the filename stem.
|
|
||||||
const boost::filesystem::path plugin_root = resolve_plugin_root_from_descriptor(descriptor);
|
|
||||||
if (!plugin_root.empty())
|
|
||||||
return plugin_root.string();
|
|
||||||
|
|
||||||
if (!descriptor.is_cloud_plugin())
|
|
||||||
throw std::runtime_error("The current local plugin folder is unavailable");
|
|
||||||
|
|
||||||
if (wxTheApp == nullptr || GUI::wxGetApp().getAgent() == nullptr)
|
|
||||||
throw std::runtime_error("Cloud plugin storage is unavailable before networking is initialized");
|
|
||||||
|
|
||||||
const std::string user_id = GUI::wxGetApp().getAgent()->get_user_id();
|
|
||||||
if (user_id.empty())
|
|
||||||
throw std::runtime_error("Cloud plugin storage is unavailable without a logged-in user");
|
|
||||||
|
|
||||||
if (!is_valid_plugin_id(plugin_key))
|
|
||||||
throw std::runtime_error("The current cloud plugin key is not a valid folder name");
|
|
||||||
|
|
||||||
return (boost::filesystem::path(get_cloud_plugin_dir(user_id)) / plugin_key).string();
|
|
||||||
},
|
},
|
||||||
"Return the installed folder of the current plugin.");
|
"Return the installed folder of the current plugin.");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user