1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/mobilemessage/src/MobileMessageCallback.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,241 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "MobileMessageCallback.h" 1.10 +#include "nsContentUtils.h" 1.11 +#include "nsCxPusher.h" 1.12 +#include "nsIDOMMozSmsMessage.h" 1.13 +#include "nsIDOMMozMmsMessage.h" 1.14 +#include "nsIDOMSmsSegmentInfo.h" 1.15 +#include "nsIScriptGlobalObject.h" 1.16 +#include "nsPIDOMWindow.h" 1.17 +#include "MmsMessage.h" 1.18 +#include "jsapi.h" 1.19 +#include "xpcpublic.h" 1.20 +#include "nsServiceManagerUtils.h" 1.21 +#include "nsTArrayHelpers.h" 1.22 + 1.23 +namespace mozilla { 1.24 +namespace dom { 1.25 +namespace mobilemessage { 1.26 + 1.27 +NS_IMPL_ADDREF(MobileMessageCallback) 1.28 +NS_IMPL_RELEASE(MobileMessageCallback) 1.29 + 1.30 +NS_INTERFACE_MAP_BEGIN(MobileMessageCallback) 1.31 + NS_INTERFACE_MAP_ENTRY(nsIMobileMessageCallback) 1.32 + NS_INTERFACE_MAP_ENTRY(nsISupports) 1.33 +NS_INTERFACE_MAP_END 1.34 + 1.35 +MobileMessageCallback::MobileMessageCallback(DOMRequest* aDOMRequest) 1.36 + : mDOMRequest(aDOMRequest) 1.37 +{ 1.38 +} 1.39 + 1.40 +MobileMessageCallback::~MobileMessageCallback() 1.41 +{ 1.42 +} 1.43 + 1.44 + 1.45 +nsresult 1.46 +MobileMessageCallback::NotifySuccess(JS::Handle<JS::Value> aResult, bool aAsync) 1.47 +{ 1.48 + if (aAsync) { 1.49 + nsCOMPtr<nsIDOMRequestService> rs = 1.50 + do_GetService(DOMREQUEST_SERVICE_CONTRACTID); 1.51 + NS_ENSURE_TRUE(rs, NS_ERROR_FAILURE); 1.52 + 1.53 + return rs->FireSuccessAsync(mDOMRequest, aResult); 1.54 + } 1.55 + 1.56 + mDOMRequest->FireSuccess(aResult); 1.57 + return NS_OK; 1.58 +} 1.59 + 1.60 +nsresult 1.61 +MobileMessageCallback::NotifySuccess(nsISupports *aMessage, bool aAsync) 1.62 +{ 1.63 + nsresult rv; 1.64 + nsIScriptContext* scriptContext = mDOMRequest->GetContextForEventHandlers(&rv); 1.65 + NS_ENSURE_SUCCESS(rv, rv); 1.66 + NS_ENSURE_TRUE(scriptContext, NS_ERROR_FAILURE); 1.67 + 1.68 + AutoPushJSContext cx(scriptContext->GetNativeContext()); 1.69 + NS_ENSURE_TRUE(cx, NS_ERROR_FAILURE); 1.70 + 1.71 + JS::Rooted<JSObject*> global(cx, scriptContext->GetWindowProxy()); 1.72 + NS_ENSURE_TRUE(global, NS_ERROR_FAILURE); 1.73 + 1.74 + JSAutoCompartment ac(cx, global); 1.75 + 1.76 + JS::Rooted<JS::Value> wrappedMessage(cx); 1.77 + rv = nsContentUtils::WrapNative(cx, aMessage, &wrappedMessage); 1.78 + NS_ENSURE_SUCCESS(rv, rv); 1.79 + 1.80 + return NotifySuccess(wrappedMessage, aAsync); 1.81 +} 1.82 + 1.83 +nsresult 1.84 +MobileMessageCallback::NotifyError(int32_t aError, bool aAsync) 1.85 +{ 1.86 + nsAutoString errorStr; 1.87 + switch (aError) { 1.88 + case nsIMobileMessageCallback::NO_SIGNAL_ERROR: 1.89 + errorStr = NS_LITERAL_STRING("NoSignalError"); 1.90 + break; 1.91 + case nsIMobileMessageCallback::NOT_FOUND_ERROR: 1.92 + errorStr = NS_LITERAL_STRING("NotFoundError"); 1.93 + break; 1.94 + case nsIMobileMessageCallback::UNKNOWN_ERROR: 1.95 + errorStr = NS_LITERAL_STRING("UnknownError"); 1.96 + break; 1.97 + case nsIMobileMessageCallback::INTERNAL_ERROR: 1.98 + errorStr = NS_LITERAL_STRING("InternalError"); 1.99 + break; 1.100 + case nsIMobileMessageCallback::NO_SIM_CARD_ERROR: 1.101 + errorStr = NS_LITERAL_STRING("NoSimCardError"); 1.102 + break; 1.103 + case nsIMobileMessageCallback::RADIO_DISABLED_ERROR: 1.104 + errorStr = NS_LITERAL_STRING("RadioDisabledError"); 1.105 + break; 1.106 + case nsIMobileMessageCallback::INVALID_ADDRESS_ERROR: 1.107 + errorStr = NS_LITERAL_STRING("InvalidAddressError"); 1.108 + break; 1.109 + case nsIMobileMessageCallback::FDN_CHECK_ERROR: 1.110 + errorStr = NS_LITERAL_STRING("FdnCheckError"); 1.111 + break; 1.112 + case nsIMobileMessageCallback::NON_ACTIVE_SIM_CARD_ERROR: 1.113 + errorStr = NS_LITERAL_STRING("NonActiveSimCardError"); 1.114 + break; 1.115 + case nsIMobileMessageCallback::STORAGE_FULL_ERROR: 1.116 + errorStr = NS_LITERAL_STRING("StorageFullError"); 1.117 + break; 1.118 + case nsIMobileMessageCallback::SIM_NOT_MATCHED_ERROR: 1.119 + errorStr = NS_LITERAL_STRING("SimNotMatchedError"); 1.120 + break; 1.121 + default: // SUCCESS_NO_ERROR is handled above. 1.122 + MOZ_CRASH("Should never get here!"); 1.123 + } 1.124 + 1.125 + if (aAsync) { 1.126 + nsCOMPtr<nsIDOMRequestService> rs = 1.127 + do_GetService(DOMREQUEST_SERVICE_CONTRACTID); 1.128 + NS_ENSURE_TRUE(rs, NS_ERROR_FAILURE); 1.129 + 1.130 + return rs->FireErrorAsync(mDOMRequest, errorStr); 1.131 + } 1.132 + 1.133 + mDOMRequest->FireError(errorStr); 1.134 + return NS_OK; 1.135 +} 1.136 + 1.137 +NS_IMETHODIMP 1.138 +MobileMessageCallback::NotifyMessageSent(nsISupports *aMessage) 1.139 +{ 1.140 + return NotifySuccess(aMessage); 1.141 +} 1.142 + 1.143 +NS_IMETHODIMP 1.144 +MobileMessageCallback::NotifySendMessageFailed(int32_t aError) 1.145 +{ 1.146 + return NotifyError(aError); 1.147 +} 1.148 + 1.149 +NS_IMETHODIMP 1.150 +MobileMessageCallback::NotifyMessageGot(nsISupports *aMessage) 1.151 +{ 1.152 + return NotifySuccess(aMessage); 1.153 +} 1.154 + 1.155 +NS_IMETHODIMP 1.156 +MobileMessageCallback::NotifyGetMessageFailed(int32_t aError) 1.157 +{ 1.158 + return NotifyError(aError); 1.159 +} 1.160 + 1.161 +NS_IMETHODIMP 1.162 +MobileMessageCallback::NotifyMessageDeleted(bool *aDeleted, uint32_t aSize) 1.163 +{ 1.164 + if (aSize == 1) { 1.165 + AutoJSContext cx; 1.166 + JS::Rooted<JS::Value> val(cx, aDeleted[0] ? JSVAL_TRUE : JSVAL_FALSE); 1.167 + return NotifySuccess(val); 1.168 + } 1.169 + 1.170 + nsresult rv; 1.171 + nsIScriptContext* sc = mDOMRequest->GetContextForEventHandlers(&rv); 1.172 + NS_ENSURE_SUCCESS(rv, rv); 1.173 + NS_ENSURE_TRUE(sc, NS_ERROR_FAILURE); 1.174 + 1.175 + AutoPushJSContext cx(sc->GetNativeContext()); 1.176 + NS_ENSURE_TRUE(cx, NS_ERROR_FAILURE); 1.177 + 1.178 + JS::Rooted<JSObject*> deleteArrayObj(cx, 1.179 + JS_NewArrayObject(cx, aSize)); 1.180 + for (uint32_t i = 0; i < aSize; i++) { 1.181 + JS_SetElement(cx, deleteArrayObj, i, aDeleted[i]); 1.182 + } 1.183 + 1.184 + JS::Rooted<JS::Value> deleteArrayVal(cx, JS::ObjectValue(*deleteArrayObj)); 1.185 + return NotifySuccess(deleteArrayVal); 1.186 +} 1.187 + 1.188 +NS_IMETHODIMP 1.189 +MobileMessageCallback::NotifyDeleteMessageFailed(int32_t aError) 1.190 +{ 1.191 + return NotifyError(aError); 1.192 +} 1.193 + 1.194 +NS_IMETHODIMP 1.195 +MobileMessageCallback::NotifyMessageMarkedRead(bool aRead) 1.196 +{ 1.197 + AutoJSContext cx; 1.198 + JS::Rooted<JS::Value> val(cx, aRead ? JSVAL_TRUE : JSVAL_FALSE); 1.199 + return NotifySuccess(val); 1.200 +} 1.201 + 1.202 +NS_IMETHODIMP 1.203 +MobileMessageCallback::NotifyMarkMessageReadFailed(int32_t aError) 1.204 +{ 1.205 + return NotifyError(aError); 1.206 +} 1.207 + 1.208 +NS_IMETHODIMP 1.209 +MobileMessageCallback::NotifySegmentInfoForTextGot(nsIDOMMozSmsSegmentInfo *aInfo) 1.210 +{ 1.211 + return NotifySuccess(aInfo, true); 1.212 +} 1.213 + 1.214 +NS_IMETHODIMP 1.215 +MobileMessageCallback::NotifyGetSegmentInfoForTextFailed(int32_t aError) 1.216 +{ 1.217 + return NotifyError(aError, true); 1.218 +} 1.219 + 1.220 +NS_IMETHODIMP 1.221 +MobileMessageCallback::NotifyGetSmscAddress(const nsAString& aSmscAddress) 1.222 +{ 1.223 + AutoJSContext cx; 1.224 + JSString* smsc = JS_NewUCStringCopyN(cx, 1.225 + static_cast<const jschar *>(aSmscAddress.BeginReading()), 1.226 + aSmscAddress.Length()); 1.227 + 1.228 + if (!smsc) { 1.229 + return NotifyError(nsIMobileMessageCallback::INTERNAL_ERROR); 1.230 + } 1.231 + 1.232 + JS::Rooted<JS::Value> val(cx, STRING_TO_JSVAL(smsc)); 1.233 + return NotifySuccess(val); 1.234 +} 1.235 + 1.236 +NS_IMETHODIMP 1.237 +MobileMessageCallback::NotifyGetSmscAddressFailed(int32_t aError) 1.238 +{ 1.239 + return NotifyError(aError); 1.240 +} 1.241 + 1.242 +} // namesapce mobilemessage 1.243 +} // namespace dom 1.244 +} // namespace mozilla