LiteLDev / LegacyScriptEngine

A plugin engine for running LLSE plugins on LeviLamina
GNU General Public License v3.0
48 stars 8 forks source link

fix: fixed chinese path related problems v2(issues#24) #29

Closed XY0797 closed 9 months ago

XY0797 commented 9 months ago

本PR修复issues#24

下面是解释说明:

插件含中文路径名问题

而在本项目的加载逻辑中: (/src/lse/PluginManager.cpp:73)

        if (!::PluginManager::loadPlugin(entryPath.string(), false, true)) {
            throw std::runtime_error(fmt::format("failed to load plugin {}", manifest.name));
        }

把它替换成

        if (!::PluginManager::loadPlugin(ll::string_utils::u8str2str(entryPath.u8string()), false, true)) {
            throw std::runtime_error(fmt::format("failed to load plugin {}", manifest.name));
        }

然后报错编码错误,问题来自: (/src/legacy/main/PluginManager.cpp:57)

    bool   isPluginPackage = std::filesystem::is_directory(fileOrDirPath);

直接使用了string去构造path,替换为

    bool isPluginPackage = std::filesystem::is_directory(ll::string_utils::str2wstr(fileOrDirPath));

问题就解决了

插件名称为中文时的问题

如果插件名称为中文,需要migratePlugin时

ERROR IN LOGGER API:
C++ Exception: std::runtime_error, from <LeviLamina>:
invalid utf8
migrating legacy plugin at plugins/聊天拦截插件.js
16:17:09.417 ERROR [LeviLamina] C++ Exception: nlohmann::json_abi_v3_11_2::detail::type_error, from <legacy-script-engine-quickjs>:
16:17:09.417 ERROR [LeviLamina] [json.exception.type_error.316] invalid UTF-8 byte at index 0: 0xC1

会出现两个错误,第一个是log api遇到了非u8字符 第二个是生成json时遇到了非u8字符 定位问题在: (/src/lse/PluginMigration.cpp:34)

logger.info("migrating legacy plugin at {}", path.string());

(/src/lse/PluginMigration.cpp:59)

        .entry = pluginFileName.string(),
        .name  = pluginFileBaseName.string(),

替换为:

logger.info("migrating legacy plugin at {}", ll::string_utils::u8str2str(path.u8string()));
        .entry = ll::string_utils::u8str2str(pluginFileName.u8string()),
        .name  = ll::string_utils::u8str2str(pluginFileBaseName.u8string()),

除此之外这个文件下的抛出异常代码也没有正确处理编码,这里省略不诉 然后在加载插件前还有编码异常的代码: (/src/lse/PluginManager.cpp:70)

auto pluginDir = std::filesystem::canonical(ll::plugin::getPluginsRoot() / manifest.name);
auto entryPath = pluginDir / manifest.entry;

manifest里面的成员都是装着utf8的string,path无法把string正确识别为utf8进行构造,需要改成wstr:

auto pluginDir = std::filesystem::canonical(ll::plugin::getPluginsRoot() / ll::string_utils::str2wstr(manifest.name));
auto entryPath = pluginDir / ll::string_utils::str2wstr(manifest.entry);

其它的编码问题

因为ll的架构设计,所有使用stlpath.string()的地方都是有BUG的,应该换成:ll::string_utils::u8str2str(stlpath.u8string()) 此外,所有重载为path的/运算符都应该检查右边是否为纯英语,否则必须转为wstr,不过目前没在其它地方发现有这个的问题

stlpath.string()导致的问题清单

src\legacy\main\Loader.cpp:
  44                  lse::getSelfPluginInstance().getLogger().info(
  45:                     "llse.loader.loadDepends.success"_tr(i.path().filename().string())
  46                  );

  48                  lse::getSelfPluginInstance().getLogger().warn(
  49:                     "llse.loader.loadDepends.fail"_tr(i.path().filename().string())
  50                  );

  53                  lse::getSelfPluginInstance().getLogger().warn(
  54:                     "llse.loader.loadDepends.fail"_tr(i.path().filename().string())
  55                  );

src\lse\Entry.cpp:
  152      if (!content) {
  153:         throw std::runtime_error(fmt::format("failed to read {}", path.string()));
  154      }
  155  
  156:     depends.emplace(path.string(), *content);
  157  

具体的修复过程就不在赘述了,请直接看文件变动

验证BUG是否修复

本地编译测试

在插件目录下创建一个中文名的插件和一个英文名的插件,同时BDS放置在英文目录下测试

migrating正常:

image

关闭后重启,加载正常:

image-1

然后更换到中文路径下重新实验:

migrating正常:

image-2

关闭后重启,加载正常:

image-3

Github Action编译测试

image-4

在插件目录下创建一个中文名的插件和一个英文名的插件,同时BDS放置在英文目录下测试

migrating正常:

image-5

关闭后重启,加载正常:

image-6

然后更换到中文路径下重新实验:

migrating正常:

image-7

关闭后重启,加载正常:

image-8

所有测试均通过

备注:因为xmake依赖的库被修改了,所以说我同步了develop分支的xmake.lua,否则无法完成Github Action编译测试