From 91d1e3608e3bb97adcd7bb9259f8771c22becd0f Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Wed, 5 Apr 2006 23:29:37 +0000 Subject: [PATCH] Added hack to treat alert prompts as fatal errors. Added flag for successful finish to webdvd_window and used it to decide the exit code. --- null_prompt_service.cpp | 61 +++++++++++++++++++++++++++++++++++++++-- webdvd.cpp | 27 ++++++++++++++++-- webdvd.hpp | 8 ++++++ 3 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 webdvd.hpp diff --git a/null_prompt_service.cpp b/null_prompt_service.cpp index c1d24be..dca7810 100644 --- a/null_prompt_service.cpp +++ b/null_prompt_service.cpp @@ -1,11 +1,19 @@ // Copyright 2006 Ben Hutchings . // See the file "COPYING" for licence details. +#include + +#include + #include +#include #include #include +#include +#include #include "null_prompt_service.hpp" +#include "webdvd.hpp" #include "xpcom_support.hpp" using xpcom_support::check; @@ -43,20 +51,67 @@ namespace { return NS_ERROR_NOT_IMPLEMENTED; } + + std::string native_error_string(const PRUnichar * text) + { + std::string result; + PRInt32 text_len = 0; + while (text[text_len]) + ++text_len; + + nsCOMPtr conv_manager; + nsCOMPtr encoder; + static const nsCID charset_converter_manager_cid = + NS_ICHARSETCONVERTERMANAGER_CID; + if (NS_SUCCEEDED(CallGetService( + charset_converter_manager_cid, + getter_AddRefs(conv_manager))) + && NS_SUCCEEDED(conv_manager->GetUnicodeEncoder( + nl_langinfo(CODESET), + getter_AddRefs(encoder)))) + { + encoder->SetOutputErrorBehavior( + nsIUnicodeEncoder::kOnError_Replace, NULL, PRUnichar('?')); + + char buf[1000]; // Hopefully long enough for an error message + + char * out = buf; + PRInt32 out_len = sizeof(buf); + encoder->Convert(text, &text_len, out, &out_len); + out += out_len; + + out_len = sizeof(buf) - out_len; + encoder->Finish(out, &out_len); + out += out_len; + + result.assign(buf, out); + } + else + { + // Convert to ASCII + result.resize(text_len); + for (PRInt32 i = 0; i != text_len; ++i) + result[i] = (text[i] < 0x80) ? text[i] : '?'; + } + + return result; + } } NS_IMPL_ISUPPORTS1(null_prompt_service, nsIPromptService) NS_IMETHODIMP null_prompt_service::Alert( - nsIDOMWindow *, const PRUnichar *, const PRUnichar *) + nsIDOMWindow *, const PRUnichar *, const PRUnichar * text) { + fatal_error(native_error_string(text)); return NS_OK; } NS_IMETHODIMP null_prompt_service::AlertCheck( - nsIDOMWindow *, const PRUnichar *, const PRUnichar *, const PRUnichar *, - PRBool *) + nsIDOMWindow *, const PRUnichar *, const PRUnichar * text, + const PRUnichar *, PRBool *) { + fatal_error(native_error_string(text)); return NS_OK; } diff --git a/webdvd.cpp b/webdvd.cpp index c4cf8a9..3c21c28 100644 --- a/webdvd.cpp +++ b/webdvd.cpp @@ -154,6 +154,8 @@ namespace const std::string & main_page_uri, const std::string & output_dir); + bool is_finished() const; + private: dvd_contents::pgc_ref add_menu(const std::string & uri); dvd_contents::pgc_ref add_title(const std::string & uri); @@ -185,6 +187,8 @@ namespace std::auto_ptr background_temp_; struct page_state; std::auto_ptr page_state_; + + bool finished_; }; webdvd_window::webdvd_window( @@ -196,7 +200,8 @@ namespace stylesheet_(load_css("file://" WEBDVD_LIB_DIR "/webdvd.css")), pending_window_update_(false), pending_req_count_(0), - have_tweaked_page_(false) + have_tweaked_page_(false), + finished_(false) { set_size_request(frame_params_.width, frame_params_.height); set_resizable(false); @@ -210,6 +215,11 @@ namespace load_next_page(); } + bool webdvd_window::is_finished() const + { + return finished_; + } + dvd_contents::pgc_ref webdvd_window::add_menu(const std::string & uri) { dvd_contents::pgc_ref next_menu(dvd_contents::menu_pgc, @@ -357,7 +367,10 @@ namespace try { if (!process_page()) + { + finished_ = true; Gtk::Main::quit(); + } } catch (std::exception & e) { @@ -820,6 +833,12 @@ namespace } // namespace +void fatal_error(const std::string & message) +{ + std::cerr << "Fatal error: " << message << "\n"; + Gtk::Main::quit(); +} + int main(int argc, char ** argv) { try @@ -943,12 +962,14 @@ int main(int argc, char ** argv) // Run the browser/converter webdvd_window window(frame_params, menu_url, output_dir); Gtk::Main::run(window); + + return ((preview_mode || window.is_finished()) + ? EXIT_SUCCESS + : EXIT_FAILURE); } catch (std::exception & e) { std::cerr << "Fatal error: " << e.what() << "\n"; return EXIT_FAILURE; } - - return EXIT_SUCCESS; } diff --git a/webdvd.hpp b/webdvd.hpp new file mode 100644 index 0000000..d281814 --- /dev/null +++ b/webdvd.hpp @@ -0,0 +1,8 @@ +#ifndef INC_WEBDVD_HPP +#define INC_WEBDVD_HPP + +#include + +void fatal_error(const std::string & message); + +#endif // !INC_WEBDVD_HPP -- 2.39.2