diff --git a/Poedit.vcxproj b/Poedit.vcxproj index dbe0456de8..0ab8793585 100644 --- a/Poedit.vcxproj +++ b/Poedit.vcxproj @@ -135,6 +135,7 @@ + diff --git a/Poedit.vcxproj.filters b/Poedit.vcxproj.filters index c78cd7bf16..be3e01c8ec 100644 --- a/Poedit.vcxproj.filters +++ b/Poedit.vcxproj.filters @@ -210,6 +210,9 @@ Source Files + + Source Files + diff --git a/Poedit.xcodeproj/project.pbxproj b/Poedit.xcodeproj/project.pbxproj index e792856f37..db2ec2260d 100644 --- a/Poedit.xcodeproj/project.pbxproj +++ b/Poedit.xcodeproj/project.pbxproj @@ -94,6 +94,8 @@ B26E2C8F25A245BD008D6DF1 /* CloseButtonTemplate@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B26E2C8B25A245BC008D6DF1 /* CloseButtonTemplate@2x.png */; }; B26E2C9025A245BD008D6DF1 /* CloseButtonTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = B26E2C8C25A245BC008D6DF1 /* CloseButtonTemplate.png */; }; B26E2C9125A245BD008D6DF1 /* CloseButtonHoverTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = B26E2C8D25A245BD008D6DF1 /* CloseButtonHoverTemplate.png */; }; + B273818C2BD5027E005F24DA /* errors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B273818B2BD5027E005F24DA /* errors.cpp */; }; + B273818D2BD5027E005F24DA /* errors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B273818B2BD5027E005F24DA /* errors.cpp */; }; B27959DE1E85850A00DBA47D /* qa_checks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B27959DC1E85850A00DBA47D /* qa_checks.cpp */; }; B280E84D1A92776D009F4A98 /* http_client_macos.mm in Sources */ = {isa = PBXBuildFile; fileRef = B280E84B1A92776D009F4A98 /* http_client_macos.mm */; }; B28602441DDB279400FCA617 /* colorscheme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B28602421DDB279400FCA617 /* colorscheme.cpp */; }; @@ -388,6 +390,7 @@ B26E2C8B25A245BC008D6DF1 /* CloseButtonTemplate@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "CloseButtonTemplate@2x.png"; path = "macos/CloseButtonTemplate@2x.png"; sourceTree = ""; }; B26E2C8C25A245BC008D6DF1 /* CloseButtonTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = CloseButtonTemplate.png; path = macos/CloseButtonTemplate.png; sourceTree = ""; }; B26E2C8D25A245BD008D6DF1 /* CloseButtonHoverTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = CloseButtonHoverTemplate.png; path = macos/CloseButtonHoverTemplate.png; sourceTree = ""; }; + B273818B2BD5027E005F24DA /* errors.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = errors.cpp; sourceTree = ""; }; B27959DC1E85850A00DBA47D /* qa_checks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qa_checks.cpp; sourceTree = ""; }; B27959DD1E85850A00DBA47D /* qa_checks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qa_checks.h; sourceTree = ""; }; B27D1FC519EFFA2800AB1913 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -759,6 +762,7 @@ B21B7B481DD4DB9F002A4C62 /* editing_area.h */, B28F1CBC16F629D30018AF7E /* edlistctrl.cpp */, B28F1CBD16F629D30018AF7E /* edlistctrl.h */, + B273818B2BD5027E005F24DA /* errors.cpp */, B29AE89B17105306008D1F8A /* errors.h */, B28F1CE216F629D30018AF7E /* export_html.cpp */, B238F674261237C4002D6845 /* filemonitor.cpp */, @@ -1503,6 +1507,7 @@ B28F1CF916F629D30018AF7E /* progressinfo.cpp in Sources */, B28F1CFA16F629D30018AF7E /* propertiesdlg.cpp in Sources */, B26D0655182697200069C378 /* welcomescreen.cpp in Sources */, + B273818C2BD5027E005F24DA /* errors.cpp in Sources */, B2E11F121A2C66FB00E4E42C /* text_control.cpp in Sources */, B28F1CFB16F629D30018AF7E /* cat_update.cpp in Sources */, B2CE2FEF1A94EBF50020A620 /* crowdin_client.cpp in Sources */, @@ -1533,6 +1538,7 @@ B260089529AF88A000349A0E /* catalog_json.cpp in Sources */, B201EBE41DCF8C0100FFB541 /* configuration.cpp in Sources */, B2DAD7121AD198DE00DCB398 /* language.cpp in Sources */, + B273818D2BD5027E005F24DA /* errors.cpp in Sources */, B201EBE31DCF8BFD00FFB541 /* catalog.cpp in Sources */, B2DAD70F1AD1984200DCB398 /* utility.cpp in Sources */, B260AA682BB2BDAE0003E378 /* unicode_helpers.cpp in Sources */, diff --git a/src/Makefile.am b/src/Makefile.am index 109a8a5649..e79eb92390 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,7 +39,7 @@ poedit_SOURCES = \ edframe.cpp edframe.h \ editing_area.cpp editing_area.h \ edlistctrl.cpp edlistctrl.h \ - errors.h \ + errors.cpp errors.h \ export_html.cpp \ extractors/extractor.cpp extractors/extractor.h \ extractors/extractor_gettext.cpp \ diff --git a/src/concurrency.cpp b/src/concurrency.cpp index d244ea8d78..732f981ed2 100644 --- a/src/concurrency.cpp +++ b/src/concurrency.cpp @@ -117,8 +117,8 @@ void detail::dispatch_async_cxx(boost::executors::work&& f, detail::queue q) namespace { -std::unique_ptr gs_background_executor; -std::unique_ptr gs_main_thread_executor; +std::unique_ptr gs_background_executor; +std::unique_ptr gs_main_thread_executor; static std::once_flag gs_background_executor_flag, gs_main_thread_executor_flag; } diff --git a/src/errors.cpp b/src/errors.cpp new file mode 100644 index 0000000000..7e3198ed87 --- /dev/null +++ b/src/errors.cpp @@ -0,0 +1,56 @@ +/* + * This file is part of Poedit (https://poedit.net) + * + * Copyright (C) 2013-2023 Vaclav Slavik + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "errors.h" + +wxString errors::detail::DescribeExceptionImpl(Rethrower& rethrower) +{ + try + { + rethrower.rethrow(); + return "no error"; // silence stupid VC++ + } + catch (const Exception& e) + { + return e.What(); + } + catch (const std::exception& e) + { + const char *msg = e.what(); + // try interpreting as UTF-8 first as the most likely one (from external sources) + wxString s = wxString::FromUTF8(msg); + if (s.empty()) + { + s = wxString(msg); + if (s.empty()) // not in current locale either, fall back to Latin1 + s = wxString(msg, wxConvISO8859_1); + } + return s; + } + catch (...) + { + return "unknown error"; + } +} diff --git a/src/errors.h b/src/errors.h index 9cf33c080b..51be31c07b 100644 --- a/src/errors.h +++ b/src/errors.h @@ -23,12 +23,13 @@ * */ -#ifndef _ERRORS_H_ -#define _ERRORS_H_ +#ifndef Poedit_errors_h +#define Poedit_errors_h #include #include #include +#include #include @@ -55,46 +56,44 @@ class Exception : public std::runtime_error }; -/// Helper to convert an exception into a human-readable string -template -inline wxString DoDescribeException(Rethrow&& rethrow_exception) +namespace errors::detail +{ + +struct Rethrower { - try - { - rethrow_exception(); - return "no error"; // silence stupid VC++ - } - catch (const Exception& e) - { - return e.What(); - } - catch (const std::exception& e) - { - const char *msg = e.what(); - // try interpreting as UTF-8 first as the most likely one (from external sources) - wxString s = wxString::FromUTF8(msg); - if (s.empty()) - { - s = wxString(msg); - if (s.empty()) // not in current locale either, fall back to Latin1 - s = wxString(msg, wxConvISO8859_1); - } - return s; - } - catch (...) - { - return "unknown error"; - } + virtual void rethrow() = 0; + virtual ~Rethrower() {} +}; + +template +struct RethrowerImpl : public Rethrower +{ + RethrowerImpl(T&& func) : rethrow_exception(std::move(func)) {} + void rethrow() override { rethrow_exception(); } + + T rethrow_exception; +}; + +wxString DescribeExceptionImpl(Rethrower& rethrower); + +template +inline wxString DescribeException(T&& rethrow_exception) +{ + RethrowerImpl rethrower(std::move(rethrow_exception)); + return DescribeExceptionImpl(rethrower); } +} // namespace errors::detail + +/// Helper to convert an exception into a human-readable string inline wxString DescribeException(std::exception_ptr e) { - return DoDescribeException([e]{ std::rethrow_exception(e); }); + return errors::detail::DescribeException([e]{ std::rethrow_exception(e); }); } inline wxString DescribeException(boost::exception_ptr e) { - return DoDescribeException([e]{ boost::rethrow_exception(e); }); + return errors::detail::DescribeException([e]{ boost::rethrow_exception(e); }); } inline wxString DescribeCurrentException() @@ -102,4 +101,4 @@ inline wxString DescribeCurrentException() return DescribeException(std::current_exception()); } -#endif // _ERRORS_H_ +#endif // Poedit_errors_h