From ce9f381013fed6c6f644d05d0e88ff6274943608 Mon Sep 17 00:00:00 2001 From: Alex Alabuzhev Date: Sun, 14 May 2017 19:15:25 +0000 Subject: [PATCH] added GetError method to adapter API --- far/changelog | 7 +++++++ far/plclass.cpp | 38 ++++++++++++++++++++++++++++++++++---- far/plclass.hpp | 3 +++ far/plugin.hpp | 7 +++++++ far/vbuild.m4 | 2 +- 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/far/changelog b/far/changelog index 24cd7b0617..757021f599 100644 --- a/far/changelog +++ b/far/changelog @@ -1,3 +1,10 @@ +drkns 14.05.2017 20:09:37 +0000 - build 4959 + +1. Расширим немного Adapter API: + BOOL WINAPI GetError(ErrorInfo* info) + - Far вызывает эту функцию после каждого обращения к адаптеру чтобы узнать, всё ли там хорошо. + Если не всё - будет показано сообщение с текстом ошибки. + drkns 13.05.2017 20:07:39 +0000 - build 4958 1. Поправим погнутую сортировку. diff --git a/far/plclass.cpp b/far/plclass.cpp index 86fe3343b1..663c3f087e 100644 --- a/far/plclass.cpp +++ b/far/plclass.cpp @@ -1222,7 +1222,7 @@ class custom_plugin_factory: public plugin_factory Info.Author && *Info.Author) { m_Success = CheckVersion(&FAR_VERSION, &Info.MinFarVersion) != FALSE; - + ProcessError(L"Initialize"); // TODO: store info, show message if version is bad } } @@ -1234,13 +1234,16 @@ class custom_plugin_factory: public plugin_factory ExitInfo Info = { sizeof(Info) }; m_Imports.pFree(&Info); + ProcessError(L"Free"); } bool Success() const { return m_Success; } virtual bool IsPlugin(const string& Filename) const override { - return m_Imports.pIsPlugin(Filename.data()) != FALSE; + const auto Result = m_Imports.pIsPlugin(Filename.data()) != FALSE; + ProcessError(L"IsPlugin"); + return Result; } virtual plugin_module_ptr Create(const string& Filename) override @@ -1251,6 +1254,7 @@ class custom_plugin_factory: public plugin_factory Global->CatchError(); Module.reset(); } + ProcessError(L"Create"); return Module; } @@ -1258,12 +1262,36 @@ class custom_plugin_factory: public plugin_factory { const auto Result = m_Imports.pDestroyInstance(static_cast(Module.get())->get_opaque()) != FALSE; Module.reset(); + ProcessError(L"Destroy"); return Result; } virtual function_address GetFunction(const plugin_module_ptr& Instance, const export_name& Name) override { - return *Name.UName? m_Imports.pGetFunctionAddress(static_cast(Instance.get())->get_opaque(), Name.UName) : nullptr; + if (!*Name.UName) + return nullptr; + const auto Result = m_Imports.pGetFunctionAddress(static_cast(Instance.get())->get_opaque(), Name.UName); + ProcessError(L"GetFunction"); + return Result; + } + + virtual void ProcessError(const wchar_t* Function) const override + { + if (!m_Imports.pGetError) + return; + + ErrorInfo Info = { sizeof(Info) }; + if (!m_Imports.pGetError(&Info)) + return; + + std::vector MessageLines; + string Summary = Info.Summary, Description = Info.Description; + const auto Enumerator = enum_tokens(Description, L"\n"); + std::transform(ALL_CONST_RANGE(Enumerator), std::back_inserter(MessageLines), [](const string_view& View) { return make_string(View); }); + Message(MSG_WARNING | MSG_LEFTALIGN, + Summary, + MessageLines, + { lng::MOk }); } private: @@ -1274,6 +1302,7 @@ class custom_plugin_factory: public plugin_factory os::rtdl::function_pointer pIsPlugin; os::rtdl::function_pointer pCreateInstance; os::rtdl::function_pointer pGetFunctionAddress; + os::rtdl::function_pointer pGetError; os::rtdl::function_pointer pDestroyInstance; os::rtdl::function_pointer pFree; @@ -1283,10 +1312,11 @@ class custom_plugin_factory: public plugin_factory INIT_IMPORT(IsPlugin), INIT_IMPORT(CreateInstance), INIT_IMPORT(GetFunctionAddress), + INIT_IMPORT(GetError), INIT_IMPORT(DestroyInstance), INIT_IMPORT(Free), #undef INIT_IMPORT - m_IsValid(pInitialize && pIsPlugin && pCreateInstance && pGetFunctionAddress && pDestroyInstance && pFree) + m_IsValid(pInitialize && pIsPlugin && pCreateInstance && pGetFunctionAddress && pGetError && pDestroyInstance && pFree) { } diff --git a/far/plclass.hpp b/far/plclass.hpp index b2c36b56ed..9a1a64cf52 100644 --- a/far/plclass.hpp +++ b/far/plclass.hpp @@ -128,6 +128,8 @@ class plugin_factory virtual bool Destroy(plugin_module_ptr& module) = 0; virtual function_address GetFunction(const plugin_module_ptr& Instance, const export_name& Name) = 0; + virtual void ProcessError(const wchar_t* Function) const {} + auto GetOwner() const { return m_owner; } const auto& ExportsNames() const { return m_ExportsNames; } @@ -306,6 +308,7 @@ class Plugin: noncopyable { detail::ExecuteFunctionImpl(es, reinterpret_cast>(Exports[T::export_id::value].first), std::forward(Args)...); RethrowIfNeeded(GlobalExceptionPtr()); + m_Factory->ProcessError(m_Factory->ExportsNames()[T::export_id::value].UName); } catch (const std::exception& e) { diff --git a/far/plugin.hpp b/far/plugin.hpp index a94b4976ca..3c9bb020c2 100644 --- a/far/plugin.hpp +++ b/far/plugin.hpp @@ -2989,6 +2989,13 @@ struct GetContentDataInfo void* Instance; }; +struct ErrorInfo +{ + size_t StructSize; + const wchar_t* Summary; + const wchar_t* Description; +}; + #ifdef FAR_USE_INTERNALS #else // ELSE FAR_USE_INTERNALS static const GUID FarGuid = diff --git a/far/vbuild.m4 b/far/vbuild.m4 index dde1a6325f..c0d69a2b21 100644 --- a/far/vbuild.m4 +++ b/far/vbuild.m4 @@ -1 +1 @@ -m4_define(BUILD,4958)m4_dnl +m4_define(BUILD,4959)m4_dnl