X-Git-Url: https://git.decadent.org.uk/gitweb/?p=videolink.git;a=blobdiff_plain;f=null_prompt_service.cpp;h=68d6d9010a287cb6189cd93137afb4d54273afe7;hp=c1d24be55a6ef3da5880c49ad6f7e1e14c6a9ca3;hb=HEAD;hpb=80da930b8321600a81d3d9ae39ff4b27def501c3 diff --git a/null_prompt_service.cpp b/null_prompt_service.cpp index c1d24be..68d6d90 100644 --- a/null_prompt_service.cpp +++ b/null_prompt_service.cpp @@ -1,11 +1,23 @@ -// Copyright 2006 Ben Hutchings . +// Copyright 2006 Ben Hutchings . // See the file "COPYING" for licence details. +#include +#include + +#include + +#include "wchar_t_short.h" #include +#include #include #include +#include +#include +#include +#include "wchar_t_default.h" #include "null_prompt_service.hpp" +#include "videolink.hpp" #include "xpcom_support.hpp" using xpcom_support::check; @@ -28,35 +40,84 @@ namespace if (!iid.Equals(prompt_service_iid)) return NS_ERROR_NO_INTERFACE; - try + if (null_prompt_service * service = + new (std::nothrow) null_prompt_service) { - *result = new null_prompt_service; + service->AddRef(); + *result = service; return NS_OK; } - catch (std::bad_alloc &) + else { return NS_ERROR_OUT_OF_MEMORY; } } - NS_IMETHODIMP null_prompt_service_factory::LockFactory(PRBool lock) + NS_IMETHODIMP null_prompt_service_factory::LockFactory(PRBool /*lock*/) { 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; } @@ -135,10 +196,11 @@ void null_prompt_service::install() {0xb4, 0x6a, 0x25, 0xc0, 0xb3, 0x8, 0xcb, 0xd0} }; nsCOMPtr prompt_factory(new null_prompt_service_factory); - check(nsComponentManager::RegisterFactory( + nsCOMPtr comp_registrar; + check(NS_GetComponentRegistrar(getter_AddRefs(comp_registrar))); + check(comp_registrar->RegisterFactory( prompt_service_cid, "Prompt Service", "@mozilla.org/embedcomp/prompt-service;1", - prompt_factory, - PR_TRUE)); // replace existing + prompt_factory)); }