// Copyright 2006 Ben Hutchings <ben@decadentplace.org.uk>.
// See the file "COPYING" for licence details.
+#include <string>
+
+#include <langinfo.h>
+
#include <nsCOMPtr.h>
+#include <nsICharsetConverterManager.h>
#include <nsIComponentManager.h>
#include <nsIFactory.h>
+#include <nsIServiceManagerUtils.h>
+#include <nsIUnicodeEncoder.h>
#include "null_prompt_service.hpp"
+#include "webdvd.hpp"
#include "xpcom_support.hpp"
using xpcom_support::check;
{
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<nsICharsetConverterManager> conv_manager;
+ nsCOMPtr<nsIUnicodeEncoder> encoder;
+ static const nsCID charset_converter_manager_cid =
+ NS_ICHARSETCONVERTERMANAGER_CID;
+ if (NS_SUCCEEDED(CallGetService<nsICharsetConverterManager>(
+ 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;
}
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);
std::auto_ptr<temp_file> background_temp_;
struct page_state;
std::auto_ptr<page_state> page_state_;
+
+ bool finished_;
};
webdvd_window::webdvd_window(
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);
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,
try
{
if (!process_page())
+ {
+ finished_ = true;
Gtk::Main::quit();
+ }
}
catch (std::exception & e)
{
} // namespace
+void fatal_error(const std::string & message)
+{
+ std::cerr << "Fatal error: " << message << "\n";
+ Gtk::Main::quit();
+}
+
int main(int argc, char ** argv)
{
try
// 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;
}