Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "MobileMessageCallback.h"
7 #include "nsContentUtils.h"
8 #include "nsCxPusher.h"
9 #include "nsIDOMMozSmsMessage.h"
10 #include "nsIDOMMozMmsMessage.h"
11 #include "nsIDOMSmsSegmentInfo.h"
12 #include "nsIScriptGlobalObject.h"
13 #include "nsPIDOMWindow.h"
14 #include "MmsMessage.h"
15 #include "jsapi.h"
16 #include "xpcpublic.h"
17 #include "nsServiceManagerUtils.h"
18 #include "nsTArrayHelpers.h"
20 namespace mozilla {
21 namespace dom {
22 namespace mobilemessage {
24 NS_IMPL_ADDREF(MobileMessageCallback)
25 NS_IMPL_RELEASE(MobileMessageCallback)
27 NS_INTERFACE_MAP_BEGIN(MobileMessageCallback)
28 NS_INTERFACE_MAP_ENTRY(nsIMobileMessageCallback)
29 NS_INTERFACE_MAP_ENTRY(nsISupports)
30 NS_INTERFACE_MAP_END
32 MobileMessageCallback::MobileMessageCallback(DOMRequest* aDOMRequest)
33 : mDOMRequest(aDOMRequest)
34 {
35 }
37 MobileMessageCallback::~MobileMessageCallback()
38 {
39 }
42 nsresult
43 MobileMessageCallback::NotifySuccess(JS::Handle<JS::Value> aResult, bool aAsync)
44 {
45 if (aAsync) {
46 nsCOMPtr<nsIDOMRequestService> rs =
47 do_GetService(DOMREQUEST_SERVICE_CONTRACTID);
48 NS_ENSURE_TRUE(rs, NS_ERROR_FAILURE);
50 return rs->FireSuccessAsync(mDOMRequest, aResult);
51 }
53 mDOMRequest->FireSuccess(aResult);
54 return NS_OK;
55 }
57 nsresult
58 MobileMessageCallback::NotifySuccess(nsISupports *aMessage, bool aAsync)
59 {
60 nsresult rv;
61 nsIScriptContext* scriptContext = mDOMRequest->GetContextForEventHandlers(&rv);
62 NS_ENSURE_SUCCESS(rv, rv);
63 NS_ENSURE_TRUE(scriptContext, NS_ERROR_FAILURE);
65 AutoPushJSContext cx(scriptContext->GetNativeContext());
66 NS_ENSURE_TRUE(cx, NS_ERROR_FAILURE);
68 JS::Rooted<JSObject*> global(cx, scriptContext->GetWindowProxy());
69 NS_ENSURE_TRUE(global, NS_ERROR_FAILURE);
71 JSAutoCompartment ac(cx, global);
73 JS::Rooted<JS::Value> wrappedMessage(cx);
74 rv = nsContentUtils::WrapNative(cx, aMessage, &wrappedMessage);
75 NS_ENSURE_SUCCESS(rv, rv);
77 return NotifySuccess(wrappedMessage, aAsync);
78 }
80 nsresult
81 MobileMessageCallback::NotifyError(int32_t aError, bool aAsync)
82 {
83 nsAutoString errorStr;
84 switch (aError) {
85 case nsIMobileMessageCallback::NO_SIGNAL_ERROR:
86 errorStr = NS_LITERAL_STRING("NoSignalError");
87 break;
88 case nsIMobileMessageCallback::NOT_FOUND_ERROR:
89 errorStr = NS_LITERAL_STRING("NotFoundError");
90 break;
91 case nsIMobileMessageCallback::UNKNOWN_ERROR:
92 errorStr = NS_LITERAL_STRING("UnknownError");
93 break;
94 case nsIMobileMessageCallback::INTERNAL_ERROR:
95 errorStr = NS_LITERAL_STRING("InternalError");
96 break;
97 case nsIMobileMessageCallback::NO_SIM_CARD_ERROR:
98 errorStr = NS_LITERAL_STRING("NoSimCardError");
99 break;
100 case nsIMobileMessageCallback::RADIO_DISABLED_ERROR:
101 errorStr = NS_LITERAL_STRING("RadioDisabledError");
102 break;
103 case nsIMobileMessageCallback::INVALID_ADDRESS_ERROR:
104 errorStr = NS_LITERAL_STRING("InvalidAddressError");
105 break;
106 case nsIMobileMessageCallback::FDN_CHECK_ERROR:
107 errorStr = NS_LITERAL_STRING("FdnCheckError");
108 break;
109 case nsIMobileMessageCallback::NON_ACTIVE_SIM_CARD_ERROR:
110 errorStr = NS_LITERAL_STRING("NonActiveSimCardError");
111 break;
112 case nsIMobileMessageCallback::STORAGE_FULL_ERROR:
113 errorStr = NS_LITERAL_STRING("StorageFullError");
114 break;
115 case nsIMobileMessageCallback::SIM_NOT_MATCHED_ERROR:
116 errorStr = NS_LITERAL_STRING("SimNotMatchedError");
117 break;
118 default: // SUCCESS_NO_ERROR is handled above.
119 MOZ_CRASH("Should never get here!");
120 }
122 if (aAsync) {
123 nsCOMPtr<nsIDOMRequestService> rs =
124 do_GetService(DOMREQUEST_SERVICE_CONTRACTID);
125 NS_ENSURE_TRUE(rs, NS_ERROR_FAILURE);
127 return rs->FireErrorAsync(mDOMRequest, errorStr);
128 }
130 mDOMRequest->FireError(errorStr);
131 return NS_OK;
132 }
134 NS_IMETHODIMP
135 MobileMessageCallback::NotifyMessageSent(nsISupports *aMessage)
136 {
137 return NotifySuccess(aMessage);
138 }
140 NS_IMETHODIMP
141 MobileMessageCallback::NotifySendMessageFailed(int32_t aError)
142 {
143 return NotifyError(aError);
144 }
146 NS_IMETHODIMP
147 MobileMessageCallback::NotifyMessageGot(nsISupports *aMessage)
148 {
149 return NotifySuccess(aMessage);
150 }
152 NS_IMETHODIMP
153 MobileMessageCallback::NotifyGetMessageFailed(int32_t aError)
154 {
155 return NotifyError(aError);
156 }
158 NS_IMETHODIMP
159 MobileMessageCallback::NotifyMessageDeleted(bool *aDeleted, uint32_t aSize)
160 {
161 if (aSize == 1) {
162 AutoJSContext cx;
163 JS::Rooted<JS::Value> val(cx, aDeleted[0] ? JSVAL_TRUE : JSVAL_FALSE);
164 return NotifySuccess(val);
165 }
167 nsresult rv;
168 nsIScriptContext* sc = mDOMRequest->GetContextForEventHandlers(&rv);
169 NS_ENSURE_SUCCESS(rv, rv);
170 NS_ENSURE_TRUE(sc, NS_ERROR_FAILURE);
172 AutoPushJSContext cx(sc->GetNativeContext());
173 NS_ENSURE_TRUE(cx, NS_ERROR_FAILURE);
175 JS::Rooted<JSObject*> deleteArrayObj(cx,
176 JS_NewArrayObject(cx, aSize));
177 for (uint32_t i = 0; i < aSize; i++) {
178 JS_SetElement(cx, deleteArrayObj, i, aDeleted[i]);
179 }
181 JS::Rooted<JS::Value> deleteArrayVal(cx, JS::ObjectValue(*deleteArrayObj));
182 return NotifySuccess(deleteArrayVal);
183 }
185 NS_IMETHODIMP
186 MobileMessageCallback::NotifyDeleteMessageFailed(int32_t aError)
187 {
188 return NotifyError(aError);
189 }
191 NS_IMETHODIMP
192 MobileMessageCallback::NotifyMessageMarkedRead(bool aRead)
193 {
194 AutoJSContext cx;
195 JS::Rooted<JS::Value> val(cx, aRead ? JSVAL_TRUE : JSVAL_FALSE);
196 return NotifySuccess(val);
197 }
199 NS_IMETHODIMP
200 MobileMessageCallback::NotifyMarkMessageReadFailed(int32_t aError)
201 {
202 return NotifyError(aError);
203 }
205 NS_IMETHODIMP
206 MobileMessageCallback::NotifySegmentInfoForTextGot(nsIDOMMozSmsSegmentInfo *aInfo)
207 {
208 return NotifySuccess(aInfo, true);
209 }
211 NS_IMETHODIMP
212 MobileMessageCallback::NotifyGetSegmentInfoForTextFailed(int32_t aError)
213 {
214 return NotifyError(aError, true);
215 }
217 NS_IMETHODIMP
218 MobileMessageCallback::NotifyGetSmscAddress(const nsAString& aSmscAddress)
219 {
220 AutoJSContext cx;
221 JSString* smsc = JS_NewUCStringCopyN(cx,
222 static_cast<const jschar *>(aSmscAddress.BeginReading()),
223 aSmscAddress.Length());
225 if (!smsc) {
226 return NotifyError(nsIMobileMessageCallback::INTERNAL_ERROR);
227 }
229 JS::Rooted<JS::Value> val(cx, STRING_TO_JSVAL(smsc));
230 return NotifySuccess(val);
231 }
233 NS_IMETHODIMP
234 MobileMessageCallback::NotifyGetSmscAddressFailed(int32_t aError)
235 {
236 return NotifyError(aError);
237 }
239 } // namesapce mobilemessage
240 } // namespace dom
241 } // namespace mozilla