]> git.decadent.org.uk Git - videolink.git/blobdiff - null_prompt_service.cpp
Release versions 1.2.11 and 1.2.11-1
[videolink.git] / null_prompt_service.cpp
index c1d24be55a6ef3da5880c49ad6f7e1e14c6a9ca3..68d6d9010a287cb6189cd93137afb4d54273afe7 100644 (file)
@@ -1,11 +1,23 @@
-// Copyright 2006 Ben Hutchings <ben@decadentplace.org.uk>.
+// Copyright 2006 Ben Hutchings <ben@decadent.org.uk>.
 // See the file "COPYING" for licence details.
 
+#include <new>
+#include <string>
+
+#include <langinfo.h>
+
+#include "wchar_t_short.h"
 #include <nsCOMPtr.h>
+#include <nsICharsetConverterManager.h>
 #include <nsIComponentManager.h>
 #include <nsIFactory.h>
+#include <nsIComponentRegistrar.h>
+#include <nsServiceManagerUtils.h>
+#include <nsIUnicodeEncoder.h>
+#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<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;
 }
 
@@ -135,10 +196,11 @@ void null_prompt_service::install()
        {0xb4, 0x6a, 0x25, 0xc0, 0xb3, 0x8, 0xcb, 0xd0}
     };
     nsCOMPtr<nsIFactory> prompt_factory(new null_prompt_service_factory);
-    check(nsComponentManager::RegisterFactory(
+    nsCOMPtr<nsIComponentRegistrar> 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));   
 }