]> git.decadent.org.uk Git - videolink.git/blob - null_prompt_service.cpp
68d6d9010a287cb6189cd93137afb4d54273afe7
[videolink.git] / null_prompt_service.cpp
1 // Copyright 2006 Ben Hutchings <ben@decadent.org.uk>.
2 // See the file "COPYING" for licence details.
3
4 #include <new>
5 #include <string>
6
7 #include <langinfo.h>
8
9 #include "wchar_t_short.h"
10 #include <nsCOMPtr.h>
11 #include <nsICharsetConverterManager.h>
12 #include <nsIComponentManager.h>
13 #include <nsIFactory.h>
14 #include <nsIComponentRegistrar.h>
15 #include <nsServiceManagerUtils.h>
16 #include <nsIUnicodeEncoder.h>
17 #include "wchar_t_default.h"
18
19 #include "null_prompt_service.hpp"
20 #include "videolink.hpp"
21 #include "xpcom_support.hpp"
22
23 using xpcom_support::check;
24
25 namespace
26 {
27     NS_DEFINE_IID(prompt_service_iid, NS_IPROMPTSERVICE_IID);
28
29     class null_prompt_service_factory : public nsIFactory
30     {
31         NS_DECL_ISUPPORTS
32         NS_DECL_NSIFACTORY
33     };
34
35     NS_IMPL_ISUPPORTS1(null_prompt_service_factory, nsIFactory)
36
37     NS_IMETHODIMP null_prompt_service_factory::CreateInstance(
38         nsISupports *, const nsIID & iid, void ** result)
39     {
40         if (!iid.Equals(prompt_service_iid))
41             return NS_ERROR_NO_INTERFACE;
42
43         if (null_prompt_service * service =
44                 new (std::nothrow) null_prompt_service)
45         {
46             service->AddRef();
47             *result = service;
48             return NS_OK;
49         }
50         else
51         {
52             return NS_ERROR_OUT_OF_MEMORY;
53         }
54     }
55
56     NS_IMETHODIMP null_prompt_service_factory::LockFactory(PRBool /*lock*/)
57     {
58         return NS_ERROR_NOT_IMPLEMENTED;
59     }
60
61     std::string native_error_string(const PRUnichar * text)
62     {
63         std::string result;
64         PRInt32 text_len = 0;
65         while (text[text_len])
66             ++text_len;
67
68         nsCOMPtr<nsICharsetConverterManager> conv_manager;
69         nsCOMPtr<nsIUnicodeEncoder> encoder;
70         static const nsCID charset_converter_manager_cid =
71             NS_ICHARSETCONVERTERMANAGER_CID;
72         if (NS_SUCCEEDED(CallGetService<nsICharsetConverterManager>(
73                              charset_converter_manager_cid,
74                              getter_AddRefs(conv_manager)))
75             && NS_SUCCEEDED(conv_manager->GetUnicodeEncoder(
76                                 nl_langinfo(CODESET),
77                                 getter_AddRefs(encoder))))
78         {
79             encoder->SetOutputErrorBehavior(
80                 nsIUnicodeEncoder::kOnError_Replace, NULL, PRUnichar('?'));
81
82             char buf[1000];  // Hopefully long enough for an error message
83
84             char * out = buf;
85             PRInt32 out_len = sizeof(buf);
86             encoder->Convert(text, &text_len, out, &out_len);
87             out += out_len;
88
89             out_len = sizeof(buf) - out_len;
90             encoder->Finish(out, &out_len);
91             out += out_len;
92
93             result.assign(buf, out);
94         }
95         else
96         {
97             // Convert to ASCII
98             result.resize(text_len);
99             for (PRInt32 i = 0; i != text_len; ++i)
100                 result[i] = (text[i] < 0x80) ? text[i] : '?';
101         }
102
103         return result;
104     }
105 }
106
107 NS_IMPL_ISUPPORTS1(null_prompt_service, nsIPromptService)
108
109 NS_IMETHODIMP null_prompt_service::Alert(
110     nsIDOMWindow *, const PRUnichar *, const PRUnichar * text)
111 {
112     fatal_error(native_error_string(text));
113     return NS_OK;
114 }
115
116 NS_IMETHODIMP null_prompt_service::AlertCheck(
117     nsIDOMWindow *, const PRUnichar *, const PRUnichar * text,
118     const PRUnichar *, PRBool *)
119 {
120     fatal_error(native_error_string(text));
121     return NS_OK;
122 }
123
124 NS_IMETHODIMP null_prompt_service::Confirm(
125     nsIDOMWindow *, const PRUnichar *, const PRUnichar *, PRBool * result)
126 {
127     // Cancel
128     *result = false;
129     return NS_OK;
130 }
131
132 NS_IMETHODIMP null_prompt_service::ConfirmCheck(
133     nsIDOMWindow *, const PRUnichar *, const PRUnichar *,
134     const PRUnichar *, PRBool *, PRBool * result)
135 {
136     // Cancel
137     *result = false;
138     return NS_OK;
139 }
140
141 NS_IMETHODIMP null_prompt_service::ConfirmEx(
142     nsIDOMWindow *, const PRUnichar *, const PRUnichar *,
143     PRUint32 flags, const PRUnichar *, const PRUnichar *, const PRUnichar *,
144     const PRUnichar *, PRBool *, PRInt32 * result)
145 {
146     // Accept the default
147     if (flags & BUTTON_POS_1_DEFAULT)
148         *result = 1;
149     else if (flags & BUTTON_POS_2_DEFAULT)
150         *result = 2;
151     else
152         *result = 0;
153     return NS_OK;
154 }
155
156 NS_IMETHODIMP null_prompt_service::Prompt(
157     nsIDOMWindow *, const PRUnichar *, const PRUnichar *, PRUnichar **,
158     const PRUnichar *, PRBool *, PRBool * result)
159 {
160     // Cancel
161     *result = false;
162     return NS_OK;
163 }
164
165 NS_IMETHODIMP null_prompt_service::PromptUsernameAndPassword(
166     nsIDOMWindow *, const PRUnichar *, const PRUnichar *,
167     PRUnichar **, PRUnichar **, const PRUnichar *, PRBool *, PRBool * result)
168 {
169     // Cancel
170     *result = false;
171     return NS_OK;
172 }
173
174 NS_IMETHODIMP null_prompt_service::PromptPassword(
175     nsIDOMWindow *, const PRUnichar *, const PRUnichar *, PRUnichar **,
176     const PRUnichar *, PRBool *, PRBool * result)
177 {
178     // Cancel
179     *result = false;
180     return NS_OK;
181 }
182
183 NS_IMETHODIMP null_prompt_service::Select(
184     nsIDOMWindow *, const PRUnichar *, const PRUnichar *, PRUint32,
185     const PRUnichar **, PRInt32 *, PRBool * result)
186 {
187     // Cancel
188     *result = false;
189     return NS_OK;
190 }
191
192 void null_prompt_service::install()
193 {
194     static const nsCID prompt_service_cid = {
195         0xa2112d6a, 0x0e28, 0x421f,
196         {0xb4, 0x6a, 0x25, 0xc0, 0xb3, 0x8, 0xcb, 0xd0}
197     };
198     nsCOMPtr<nsIFactory> prompt_factory(new null_prompt_service_factory);
199     nsCOMPtr<nsIComponentRegistrar> comp_registrar;
200     check(NS_GetComponentRegistrar(getter_AddRefs(comp_registrar)));
201     check(comp_registrar->RegisterFactory(
202               prompt_service_cid,
203               "Prompt Service",
204               "@mozilla.org/embedcomp/prompt-service;1",
205               prompt_factory));   
206 }