X-Git-Url: https://git.decadent.org.uk/gitweb/?p=videolink.git;a=blobdiff_plain;f=null_prompt_service.cpp;h=878f7ff268f71057127e1f997287ad0b024d0077;hp=c1d24be55a6ef3da5880c49ad6f7e1e14c6a9ca3;hb=c5f98ff303d670f72a5d491a5f4e1989d2043219;hpb=80da930b8321600a81d3d9ae39ff4b27def501c3 diff --git a/null_prompt_service.cpp b/null_prompt_service.cpp index c1d24be..878f7ff 100644 --- a/null_prompt_service.cpp +++ b/null_prompt_service.cpp @@ -1,11 +1,19 @@ -// Copyright 2006 Ben Hutchings . +// 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; }