Skip to content

Conversation

@XY0797
Copy link
Contributor

@XY0797 XY0797 commented Feb 10, 2024

本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编译测试

@XY0797
Copy link
Contributor Author

XY0797 commented Feb 10, 2024

这个和#29的内容是一样的,因为我是复制的xmake.lua,导致换行符制式与develop分支的xmake.lua不同,可能会对你们合并有影响,于是我把旧的PR关闭了,在这个PR我改用下载文件的方法避免了xmake.lua内容的不同,其它地方没有变化

@ShrBox ShrBox merged commit d3237c6 into LiteLDev:main Feb 10, 2024
ShrBox pushed a commit that referenced this pull request Feb 10, 2024
@XY0797 XY0797 deleted the master branch February 10, 2024 14:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants