1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/mobilemessage/src/MobileMessageManager.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,579 @@ 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 file, 1.7 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "SmsFilter.h" 1.10 +#include "MobileMessageManager.h" 1.11 +#include "nsIDOMClassInfo.h" 1.12 +#include "nsISmsService.h" 1.13 +#include "nsIMmsService.h" 1.14 +#include "nsIObserverService.h" 1.15 +#include "mozilla/Preferences.h" 1.16 +#include "mozilla/Services.h" 1.17 +#include "mozilla/dom/mobilemessage/Constants.h" // For MessageType 1.18 +#include "mozilla/dom/MobileMessageManagerBinding.h" 1.19 +#include "mozilla/dom/MozMmsMessageBinding.h" 1.20 +#include "nsIDOMMozSmsEvent.h" 1.21 +#include "nsIDOMMozMmsEvent.h" 1.22 +#include "nsIDOMMozSmsMessage.h" 1.23 +#include "nsIDOMMozMmsMessage.h" 1.24 +#include "nsJSUtils.h" 1.25 +#include "nsContentUtils.h" 1.26 +#include "nsCxPusher.h" 1.27 +#include "nsIMobileMessageDatabaseService.h" 1.28 +#include "nsIXPConnect.h" 1.29 +#include "nsIPermissionManager.h" 1.30 +#include "GeneratedEvents.h" 1.31 +#include "DOMRequest.h" 1.32 +#include "nsIMobileMessageCallback.h" 1.33 +#include "MobileMessageCallback.h" 1.34 +#include "MobileMessageCursorCallback.h" 1.35 +#include "DOMCursor.h" 1.36 + 1.37 +#define RECEIVED_EVENT_NAME NS_LITERAL_STRING("received") 1.38 +#define RETRIEVING_EVENT_NAME NS_LITERAL_STRING("retrieving") 1.39 +#define SENDING_EVENT_NAME NS_LITERAL_STRING("sending") 1.40 +#define SENT_EVENT_NAME NS_LITERAL_STRING("sent") 1.41 +#define FAILED_EVENT_NAME NS_LITERAL_STRING("failed") 1.42 +#define DELIVERY_SUCCESS_EVENT_NAME NS_LITERAL_STRING("deliverysuccess") 1.43 +#define DELIVERY_ERROR_EVENT_NAME NS_LITERAL_STRING("deliveryerror") 1.44 +#define READ_SUCCESS_EVENT_NAME NS_LITERAL_STRING("readsuccess") 1.45 +#define READ_ERROR_EVENT_NAME NS_LITERAL_STRING("readerror") 1.46 + 1.47 +using namespace mozilla::dom::mobilemessage; 1.48 + 1.49 +DOMCI_DATA(MozMobileMessageManager, mozilla::dom::MobileMessageManager) 1.50 + 1.51 +namespace mozilla { 1.52 +namespace dom { 1.53 + 1.54 +NS_INTERFACE_MAP_BEGIN(MobileMessageManager) 1.55 + NS_INTERFACE_MAP_ENTRY(nsIDOMMozMobileMessageManager) 1.56 + NS_INTERFACE_MAP_ENTRY(nsIObserver) 1.57 + NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozMobileMessageManager) 1.58 +NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) 1.59 + 1.60 +NS_IMPL_ADDREF_INHERITED(MobileMessageManager, DOMEventTargetHelper) 1.61 +NS_IMPL_RELEASE_INHERITED(MobileMessageManager, DOMEventTargetHelper) 1.62 + 1.63 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, received) 1.64 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, retrieving) 1.65 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, sending) 1.66 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, sent) 1.67 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, failed) 1.68 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, deliverysuccess) 1.69 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, deliveryerror) 1.70 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, readsuccess) 1.71 +NS_IMPL_EVENT_HANDLER(MobileMessageManager, readerror) 1.72 + 1.73 +void 1.74 +MobileMessageManager::Init(nsPIDOMWindow *aWindow) 1.75 +{ 1.76 + BindToOwner(aWindow); 1.77 + 1.78 + nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); 1.79 + // GetObserverService() can return null is some situations like shutdown. 1.80 + if (!obs) { 1.81 + return; 1.82 + } 1.83 + 1.84 + obs->AddObserver(this, kSmsReceivedObserverTopic, false); 1.85 + obs->AddObserver(this, kSmsRetrievingObserverTopic, false); 1.86 + obs->AddObserver(this, kSmsSendingObserverTopic, false); 1.87 + obs->AddObserver(this, kSmsSentObserverTopic, false); 1.88 + obs->AddObserver(this, kSmsFailedObserverTopic, false); 1.89 + obs->AddObserver(this, kSmsDeliverySuccessObserverTopic, false); 1.90 + obs->AddObserver(this, kSmsDeliveryErrorObserverTopic, false); 1.91 + obs->AddObserver(this, kSmsReadSuccessObserverTopic, false); 1.92 + obs->AddObserver(this, kSmsReadErrorObserverTopic, false); 1.93 +} 1.94 + 1.95 +void 1.96 +MobileMessageManager::Shutdown() 1.97 +{ 1.98 + nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); 1.99 + // GetObserverService() can return null is some situations like shutdown. 1.100 + if (!obs) { 1.101 + return; 1.102 + } 1.103 + 1.104 + obs->RemoveObserver(this, kSmsReceivedObserverTopic); 1.105 + obs->RemoveObserver(this, kSmsRetrievingObserverTopic); 1.106 + obs->RemoveObserver(this, kSmsSendingObserverTopic); 1.107 + obs->RemoveObserver(this, kSmsSentObserverTopic); 1.108 + obs->RemoveObserver(this, kSmsFailedObserverTopic); 1.109 + obs->RemoveObserver(this, kSmsDeliverySuccessObserverTopic); 1.110 + obs->RemoveObserver(this, kSmsDeliveryErrorObserverTopic); 1.111 + obs->RemoveObserver(this, kSmsReadSuccessObserverTopic); 1.112 + obs->RemoveObserver(this, kSmsReadErrorObserverTopic); 1.113 +} 1.114 + 1.115 +NS_IMETHODIMP 1.116 +MobileMessageManager::GetSegmentInfoForText(const nsAString& aText, 1.117 + nsIDOMDOMRequest** aRequest) 1.118 +{ 1.119 + nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID); 1.120 + NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); 1.121 + 1.122 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.123 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = 1.124 + new MobileMessageCallback(request); 1.125 + nsresult rv = smsService->GetSegmentInfoForText(aText, msgCallback); 1.126 + NS_ENSURE_SUCCESS(rv, rv); 1.127 + 1.128 + request.forget(aRequest); 1.129 + return NS_OK; 1.130 +} 1.131 + 1.132 +nsresult 1.133 +MobileMessageManager::Send(JSContext* aCx, JS::Handle<JSObject*> aGlobal, 1.134 + uint32_t aServiceId, 1.135 + JS::Handle<JSString*> aNumber, 1.136 + const nsAString& aMessage, 1.137 + JS::Value* aRequest) 1.138 +{ 1.139 + nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID); 1.140 + NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); 1.141 + 1.142 + nsDependentJSString number; 1.143 + number.init(aCx, aNumber); 1.144 + 1.145 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.146 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = 1.147 + new MobileMessageCallback(request); 1.148 + 1.149 + // By default, we don't send silent messages via MobileMessageManager. 1.150 + nsresult rv = smsService->Send(aServiceId, number, aMessage, 1.151 + false, msgCallback); 1.152 + NS_ENSURE_SUCCESS(rv, rv); 1.153 + 1.154 + js::AssertSameCompartment(aCx, aGlobal); 1.155 + JS::Rooted<JS::Value> rval(aCx); 1.156 + rv = nsContentUtils::WrapNative(aCx, 1.157 + static_cast<nsIDOMDOMRequest*>(request.get()), 1.158 + &rval); 1.159 + if (NS_FAILED(rv)) { 1.160 + NS_ERROR("Failed to create the js value!"); 1.161 + return rv; 1.162 + } 1.163 + 1.164 + *aRequest = rval; 1.165 + return NS_OK; 1.166 +} 1.167 + 1.168 +NS_IMETHODIMP 1.169 +MobileMessageManager::Send(JS::Handle<JS::Value> aNumber, 1.170 + const nsAString& aMessage, 1.171 + JS::Handle<JS::Value> aSendParams, 1.172 + JSContext* aCx, 1.173 + uint8_t aArgc, 1.174 + JS::MutableHandle<JS::Value> aReturn) 1.175 +{ 1.176 + if (!aNumber.isString() && !JS_IsArrayObject(aCx, aNumber)) { 1.177 + return NS_ERROR_INVALID_ARG; 1.178 + } 1.179 + 1.180 + nsresult rv; 1.181 + nsIScriptContext* sc = GetContextForEventHandlers(&rv); 1.182 + NS_ENSURE_SUCCESS(rv, rv); 1.183 + NS_ENSURE_STATE(sc); 1.184 + 1.185 + JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx)); 1.186 + 1.187 + mozilla::Maybe<JSAutoCompartment> ac; 1.188 + if (!global) { 1.189 + global = sc->GetWindowProxy(); 1.190 + ac.construct(aCx, global); 1.191 + } 1.192 + 1.193 + nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID); 1.194 + NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); 1.195 + 1.196 + // Use the default one unless |aSendParams.serviceId| is available. 1.197 + uint32_t serviceId; 1.198 + rv = smsService->GetSmsDefaultServiceId(&serviceId); 1.199 + NS_ENSURE_SUCCESS(rv, rv); 1.200 + 1.201 + if (aArgc == 1) { 1.202 + JS::Rooted<JS::Value> param(aCx, aSendParams); 1.203 + RootedDictionary<SmsSendParameters> sendParams(aCx); 1.204 + if (!sendParams.Init(aCx, param)) { 1.205 + return NS_ERROR_TYPE_ERR; 1.206 + } 1.207 + if (sendParams.mServiceId.WasPassed()) { 1.208 + serviceId = sendParams.mServiceId.Value(); 1.209 + } 1.210 + } 1.211 + 1.212 + if (aNumber.isString()) { 1.213 + JS::Rooted<JSString*> str(aCx, aNumber.toString()); 1.214 + return Send(aCx, global, serviceId, str, aMessage, aReturn.address()); 1.215 + } 1.216 + 1.217 + // Must be an array then. 1.218 + JS::Rooted<JSObject*> numbers(aCx, &aNumber.toObject()); 1.219 + 1.220 + uint32_t size; 1.221 + if (!JS_GetArrayLength(aCx, numbers, &size)) { 1.222 + return NS_ERROR_FAILURE; 1.223 + } 1.224 + 1.225 + JS::AutoValueVector requests(aCx); 1.226 + if (!requests.resize(size)) { 1.227 + return NS_ERROR_FAILURE; 1.228 + } 1.229 + 1.230 + JS::Rooted<JS::Value> number(aCx); 1.231 + JS::Rooted<JSString*> str(aCx); 1.232 + for (uint32_t i = 0; i < size; ++i) { 1.233 + if (!JS_GetElement(aCx, numbers, i, &number)) { 1.234 + return NS_ERROR_INVALID_ARG; 1.235 + } 1.236 + 1.237 + str = JS::ToString(aCx, number); 1.238 + if (!str) { 1.239 + return NS_ERROR_FAILURE; 1.240 + } 1.241 + 1.242 + nsresult rv = Send(aCx, global, serviceId, str, aMessage, &requests[i]); 1.243 + NS_ENSURE_SUCCESS(rv, rv); 1.244 + } 1.245 + 1.246 + JS::Rooted<JSObject*> obj(aCx); 1.247 + obj = JS_NewArrayObject(aCx, requests); 1.248 + if (!obj) { 1.249 + return NS_ERROR_FAILURE; 1.250 + } 1.251 + 1.252 + aReturn.setObject(*obj); 1.253 + return NS_OK; 1.254 +} 1.255 + 1.256 +NS_IMETHODIMP 1.257 +MobileMessageManager::SendMMS(JS::Handle<JS::Value> aParams, 1.258 + JS::Handle<JS::Value> aSendParams, 1.259 + JSContext* aCx, 1.260 + uint8_t aArgc, 1.261 + nsIDOMDOMRequest** aRequest) 1.262 +{ 1.263 + nsCOMPtr<nsIMmsService> mmsService = do_GetService(MMS_SERVICE_CONTRACTID); 1.264 + NS_ENSURE_TRUE(mmsService, NS_ERROR_FAILURE); 1.265 + 1.266 + // Use the default one unless |aSendParams.serviceId| is available. 1.267 + uint32_t serviceId; 1.268 + nsresult rv = mmsService->GetMmsDefaultServiceId(&serviceId); 1.269 + NS_ENSURE_SUCCESS(rv, rv); 1.270 + 1.271 + if (aArgc == 1) { 1.272 + JS::Rooted<JS::Value> param(aCx, aSendParams); 1.273 + RootedDictionary<MmsSendParameters> sendParams(aCx); 1.274 + if (!sendParams.Init(aCx, param)) { 1.275 + return NS_ERROR_TYPE_ERR; 1.276 + } 1.277 + if (sendParams.mServiceId.WasPassed()) { 1.278 + serviceId = sendParams.mServiceId.Value(); 1.279 + } 1.280 + } 1.281 + 1.282 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.283 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request); 1.284 + rv = mmsService->Send(serviceId, aParams, msgCallback); 1.285 + NS_ENSURE_SUCCESS(rv, rv); 1.286 + 1.287 + request.forget(aRequest); 1.288 + return NS_OK; 1.289 +} 1.290 + 1.291 +NS_IMETHODIMP 1.292 +MobileMessageManager::GetMessageMoz(int32_t aId, nsIDOMDOMRequest** aRequest) 1.293 +{ 1.294 + nsCOMPtr<nsIMobileMessageDatabaseService> mobileMessageDBService = 1.295 + do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); 1.296 + NS_ENSURE_TRUE(mobileMessageDBService, NS_ERROR_FAILURE); 1.297 + 1.298 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.299 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request); 1.300 + nsresult rv = mobileMessageDBService->GetMessageMoz(aId, msgCallback); 1.301 + NS_ENSURE_SUCCESS(rv, rv); 1.302 + 1.303 + request.forget(aRequest); 1.304 + return NS_OK; 1.305 +} 1.306 + 1.307 +nsresult 1.308 +MobileMessageManager::GetMessageId(JSContext* aCx, 1.309 + const JS::Value& aMessage, int32_t* aId) 1.310 +{ 1.311 + nsCOMPtr<nsIDOMMozSmsMessage> smsMessage = 1.312 + do_QueryInterface(nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, &aMessage.toObject())); 1.313 + if (smsMessage) { 1.314 + return smsMessage->GetId(aId); 1.315 + } 1.316 + 1.317 + nsCOMPtr<nsIDOMMozMmsMessage> mmsMessage = 1.318 + do_QueryInterface(nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, &aMessage.toObject())); 1.319 + if (mmsMessage) { 1.320 + return mmsMessage->GetId(aId); 1.321 + } 1.322 + 1.323 + return NS_ERROR_INVALID_ARG; 1.324 +} 1.325 + 1.326 +NS_IMETHODIMP 1.327 +MobileMessageManager::Delete(JS::Handle<JS::Value> aParam, JSContext* aCx, 1.328 + nsIDOMDOMRequest** aRequest) 1.329 +{ 1.330 + // We expect Int32, SmsMessage, MmsMessage, Int32[], SmsMessage[], MmsMessage[] 1.331 + if (!aParam.isObject() && !aParam.isInt32()) { 1.332 + return NS_ERROR_INVALID_ARG; 1.333 + } 1.334 + 1.335 + nsresult rv = NS_OK; 1.336 + int32_t id, *idArray; 1.337 + uint32_t size; 1.338 + 1.339 + if (aParam.isInt32()) { 1.340 + // Single Integer Message ID 1.341 + id = aParam.toInt32(); 1.342 + 1.343 + size = 1; 1.344 + idArray = &id; 1.345 + } else if (!JS_IsArrayObject(aCx, aParam)) { 1.346 + // Single SmsMessage/MmsMessage object 1.347 + rv = GetMessageId(aCx, aParam, &id); 1.348 + NS_ENSURE_SUCCESS(rv, rv); 1.349 + 1.350 + size = 1; 1.351 + idArray = &id; 1.352 + } else { 1.353 + // Int32[], SmsMessage[], or MmsMessage[] 1.354 + JS::Rooted<JSObject*> ids(aCx, &aParam.toObject()); 1.355 + 1.356 + MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, ids, &size)); 1.357 + nsAutoArrayPtr<int32_t> idAutoArray(new int32_t[size]); 1.358 + 1.359 + JS::Rooted<JS::Value> idJsValue(aCx); 1.360 + for (uint32_t i = 0; i < size; i++) { 1.361 + if (!JS_GetElement(aCx, ids, i, &idJsValue)) { 1.362 + return NS_ERROR_INVALID_ARG; 1.363 + } 1.364 + 1.365 + if (idJsValue.isInt32()) { 1.366 + idAutoArray[i] = idJsValue.toInt32(); 1.367 + } else if (idJsValue.isObject()) { 1.368 + rv = GetMessageId(aCx, idJsValue, &id); 1.369 + NS_ENSURE_SUCCESS(rv, rv); 1.370 + 1.371 + idAutoArray[i] = id; 1.372 + } 1.373 + } 1.374 + 1.375 + idArray = idAutoArray.forget(); 1.376 + } 1.377 + 1.378 + nsCOMPtr<nsIMobileMessageDatabaseService> dbService = 1.379 + do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); 1.380 + NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE); 1.381 + 1.382 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.383 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = 1.384 + new MobileMessageCallback(request); 1.385 + 1.386 + rv = dbService->DeleteMessage(idArray, size, msgCallback); 1.387 + NS_ENSURE_SUCCESS(rv, rv); 1.388 + 1.389 + request.forget(aRequest); 1.390 + return NS_OK; 1.391 +} 1.392 + 1.393 +NS_IMETHODIMP 1.394 +MobileMessageManager::GetMessages(nsIDOMMozSmsFilter* aFilter, 1.395 + bool aReverse, 1.396 + nsIDOMDOMCursor** aCursor) 1.397 +{ 1.398 + nsCOMPtr<nsIMobileMessageDatabaseService> dbService = 1.399 + do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); 1.400 + NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE); 1.401 + 1.402 + nsCOMPtr<nsIDOMMozSmsFilter> filter = aFilter; 1.403 + if (!filter) { 1.404 + filter = new SmsFilter(); 1.405 + } 1.406 + 1.407 + nsRefPtr<MobileMessageCursorCallback> cursorCallback = 1.408 + new MobileMessageCursorCallback(); 1.409 + 1.410 + nsCOMPtr<nsICursorContinueCallback> continueCallback; 1.411 + nsresult rv = dbService->CreateMessageCursor(filter, aReverse, cursorCallback, 1.412 + getter_AddRefs(continueCallback)); 1.413 + NS_ENSURE_SUCCESS(rv, rv); 1.414 + 1.415 + cursorCallback->mDOMCursor = new DOMCursor(GetOwner(), continueCallback); 1.416 + NS_ADDREF(*aCursor = cursorCallback->mDOMCursor); 1.417 + 1.418 + return NS_OK; 1.419 +} 1.420 + 1.421 +NS_IMETHODIMP 1.422 +MobileMessageManager::MarkMessageRead(int32_t aId, bool aValue, 1.423 + bool aSendReadReport, 1.424 + nsIDOMDOMRequest** aRequest) 1.425 +{ 1.426 + nsCOMPtr<nsIMobileMessageDatabaseService> mobileMessageDBService = 1.427 + do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); 1.428 + NS_ENSURE_TRUE(mobileMessageDBService, NS_ERROR_FAILURE); 1.429 + 1.430 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.431 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request); 1.432 + nsresult rv = mobileMessageDBService->MarkMessageRead(aId, aValue, 1.433 + aSendReadReport, 1.434 + msgCallback); 1.435 + NS_ENSURE_SUCCESS(rv, rv); 1.436 + 1.437 + request.forget(aRequest); 1.438 + return NS_OK; 1.439 +} 1.440 + 1.441 +NS_IMETHODIMP 1.442 +MobileMessageManager::GetThreads(nsIDOMDOMCursor** aCursor) 1.443 +{ 1.444 + nsCOMPtr<nsIMobileMessageDatabaseService> dbService = 1.445 + do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); 1.446 + NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE); 1.447 + 1.448 + nsRefPtr<MobileMessageCursorCallback> cursorCallback = 1.449 + new MobileMessageCursorCallback(); 1.450 + 1.451 + nsCOMPtr<nsICursorContinueCallback> continueCallback; 1.452 + nsresult rv = dbService->CreateThreadCursor(cursorCallback, 1.453 + getter_AddRefs(continueCallback)); 1.454 + NS_ENSURE_SUCCESS(rv, rv); 1.455 + 1.456 + cursorCallback->mDOMCursor = new DOMCursor(GetOwner(), continueCallback); 1.457 + NS_ADDREF(*aCursor = cursorCallback->mDOMCursor); 1.458 + 1.459 + return NS_OK; 1.460 +} 1.461 + 1.462 +NS_IMETHODIMP 1.463 +MobileMessageManager::RetrieveMMS(int32_t id, 1.464 + nsIDOMDOMRequest** aRequest) 1.465 +{ 1.466 + nsCOMPtr<nsIMmsService> mmsService = do_GetService(MMS_SERVICE_CONTRACTID); 1.467 + NS_ENSURE_TRUE(mmsService, NS_ERROR_FAILURE); 1.468 + 1.469 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.470 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request); 1.471 + 1.472 + nsresult rv = mmsService->Retrieve(id, msgCallback); 1.473 + NS_ENSURE_SUCCESS(rv, rv); 1.474 + 1.475 + request.forget(aRequest); 1.476 + return NS_OK; 1.477 +} 1.478 + 1.479 +nsresult 1.480 +MobileMessageManager::DispatchTrustedSmsEventToSelf(const char* aTopic, 1.481 + const nsAString& aEventName, 1.482 + nsISupports* aMsg) 1.483 +{ 1.484 + nsCOMPtr<nsIDOMEvent> event; 1.485 + 1.486 + nsCOMPtr<nsIDOMMozSmsMessage> sms = do_QueryInterface(aMsg); 1.487 + if (sms) { 1.488 + NS_NewDOMMozSmsEvent(getter_AddRefs(event), this, nullptr, nullptr); 1.489 + NS_ASSERTION(event, "This should never fail!"); 1.490 + 1.491 + nsCOMPtr<nsIDOMMozSmsEvent> se = do_QueryInterface(event); 1.492 + nsresult rv = se->InitMozSmsEvent(aEventName, false, false, sms); 1.493 + NS_ENSURE_SUCCESS(rv, rv); 1.494 + return DispatchTrustedEvent(event); 1.495 + } 1.496 + 1.497 + nsCOMPtr<nsIDOMMozMmsMessage> mms = do_QueryInterface(aMsg); 1.498 + if (mms) { 1.499 + NS_NewDOMMozMmsEvent(getter_AddRefs(event), this, nullptr, nullptr); 1.500 + NS_ASSERTION(event, "This should never fail!"); 1.501 + 1.502 + nsCOMPtr<nsIDOMMozMmsEvent> se = do_QueryInterface(event); 1.503 + nsresult rv = se->InitMozMmsEvent(aEventName, false, false, mms); 1.504 + NS_ENSURE_SUCCESS(rv, rv); 1.505 + return DispatchTrustedEvent(event); 1.506 + } 1.507 + 1.508 + nsAutoCString errorMsg; 1.509 + errorMsg.AssignLiteral("Got a '"); 1.510 + errorMsg.Append(aTopic); 1.511 + errorMsg.AppendLiteral("' topic without a valid message!"); 1.512 + NS_ERROR(errorMsg.get()); 1.513 + return NS_OK; 1.514 +} 1.515 + 1.516 +NS_IMETHODIMP 1.517 +MobileMessageManager::Observe(nsISupports* aSubject, const char* aTopic, 1.518 + const char16_t* aData) 1.519 +{ 1.520 + if (!strcmp(aTopic, kSmsReceivedObserverTopic)) { 1.521 + return DispatchTrustedSmsEventToSelf(aTopic, RECEIVED_EVENT_NAME, aSubject); 1.522 + } 1.523 + 1.524 + if (!strcmp(aTopic, kSmsRetrievingObserverTopic)) { 1.525 + return DispatchTrustedSmsEventToSelf(aTopic, RETRIEVING_EVENT_NAME, aSubject); 1.526 + } 1.527 + 1.528 + if (!strcmp(aTopic, kSmsSendingObserverTopic)) { 1.529 + return DispatchTrustedSmsEventToSelf(aTopic, SENDING_EVENT_NAME, aSubject); 1.530 + } 1.531 + 1.532 + if (!strcmp(aTopic, kSmsSentObserverTopic)) { 1.533 + return DispatchTrustedSmsEventToSelf(aTopic, SENT_EVENT_NAME, aSubject); 1.534 + } 1.535 + 1.536 + if (!strcmp(aTopic, kSmsFailedObserverTopic)) { 1.537 + return DispatchTrustedSmsEventToSelf(aTopic, FAILED_EVENT_NAME, aSubject); 1.538 + } 1.539 + 1.540 + if (!strcmp(aTopic, kSmsDeliverySuccessObserverTopic)) { 1.541 + return DispatchTrustedSmsEventToSelf(aTopic, DELIVERY_SUCCESS_EVENT_NAME, aSubject); 1.542 + } 1.543 + 1.544 + if (!strcmp(aTopic, kSmsDeliveryErrorObserverTopic)) { 1.545 + return DispatchTrustedSmsEventToSelf(aTopic, DELIVERY_ERROR_EVENT_NAME, aSubject); 1.546 + } 1.547 + 1.548 + if (!strcmp(aTopic, kSmsReadSuccessObserverTopic)) { 1.549 + return DispatchTrustedSmsEventToSelf(aTopic, READ_SUCCESS_EVENT_NAME, aSubject); 1.550 + } 1.551 + 1.552 + if (!strcmp(aTopic, kSmsReadErrorObserverTopic)) { 1.553 + return DispatchTrustedSmsEventToSelf(aTopic, READ_ERROR_EVENT_NAME, aSubject); 1.554 + } 1.555 + 1.556 + return NS_OK; 1.557 +} 1.558 + 1.559 +NS_IMETHODIMP 1.560 +MobileMessageManager::GetSmscAddress(uint32_t aServiceId, uint8_t aArgc, 1.561 + nsIDOMDOMRequest** aRequest) 1.562 +{ 1.563 + nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID); 1.564 + NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); 1.565 + 1.566 + nsresult rv; 1.567 + if (aArgc != 1) { 1.568 + rv = smsService->GetSmsDefaultServiceId(&aServiceId); 1.569 + NS_ENSURE_SUCCESS(rv, rv); 1.570 + } 1.571 + 1.572 + nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner()); 1.573 + nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request); 1.574 + rv = smsService->GetSmscAddress(aServiceId, msgCallback); 1.575 + NS_ENSURE_SUCCESS(rv, rv); 1.576 + 1.577 + request.forget(aRequest); 1.578 + return NS_OK; 1.579 +} 1.580 + 1.581 +} // namespace dom 1.582 +} // namespace mozilla