/****************************************************************************** License: GNU General Public License v3.0 only Copyright: (C) 2008 - 2021 Alexander Shaduri ******************************************************************************/ /// \file /// \author Alexander Shaduri /// \ingroup applib /// \weakgroup applib /// @{ #ifndef COMMAND_EXECUTOR_3WARE_H #define COMMAND_EXECUTOR_3WARE_H #include "local_glibmm.h" #include "async_command_executor.h" #include "command_executor.h" /// Executor for tw_cli (3ware utility) template class TwCliExecutorGeneric : public ExecutorPolicy { public: /// Constructor TwCliExecutorGeneric(); protected: /// Exit status translate handler static std::string translate_exit_status(int status); /// Import the last error from command executor and clear all errors there void import_error() override; /// This is called when an error occurs in command executor. /// Note: The warnings are already printed via debug_* in cmdex. void on_error_warn(hz::ErrorBase* e) override; }; /// tw_cli executor without GUI support using TwCliExecutor = TwCliExecutorGeneric; /// tw_cli executor with GUI support using TwCliExecutorGui = TwCliExecutorGeneric; // ------------------------------------------- Implementation template TwCliExecutorGeneric::TwCliExecutorGeneric() { ExecutorPolicy::get_async_executor().set_exit_status_translator(&TwCliExecutorGeneric::translate_exit_status); this->set_error_header(std::string(_("An error occurred while executing tw_cli:")) + "\n\n"); } template std::string TwCliExecutorGeneric::translate_exit_status([[maybe_unused]] int status) { return {}; } template void TwCliExecutorGeneric::import_error() { AsyncCommandExecutor& cmdex = this->get_async_executor(); AsyncCommandExecutor::error_list_t errors = cmdex.get_errors(); // these are not clones hz::ErrorBase* e = nullptr; // find the last relevant error. for (auto iter = errors.crbegin(); iter != errors.crend(); ++iter) { // ignore iochannel errors, they may mask the real errors if ((*iter)->get_type() != "giochannel" && (*iter)->get_type() != "custom") { e = (*iter)->clone(); break; } } cmdex.clear_errors(); // and clear them if (e) { // if error is present, alert the user on_error_warn(e); } } template void TwCliExecutorGeneric::on_error_warn(hz::ErrorBase* e) { if (!e) return; // import the error only if it's relevant. std::string error_type = e->get_type(); // ignore giochannel errors - higher level errors will be triggered, and they more user-friendly. if (error_type == "giochannel" || error_type == "custom") { return; } this->set_error_msg(e->get_message()); } #endif /// @}