dom/mobilemessage/src/MobileMessageManager.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
michael@0 2 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 3 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
michael@0 4 * You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 5
michael@0 6 #include "SmsFilter.h"
michael@0 7 #include "MobileMessageManager.h"
michael@0 8 #include "nsIDOMClassInfo.h"
michael@0 9 #include "nsISmsService.h"
michael@0 10 #include "nsIMmsService.h"
michael@0 11 #include "nsIObserverService.h"
michael@0 12 #include "mozilla/Preferences.h"
michael@0 13 #include "mozilla/Services.h"
michael@0 14 #include "mozilla/dom/mobilemessage/Constants.h" // For MessageType
michael@0 15 #include "mozilla/dom/MobileMessageManagerBinding.h"
michael@0 16 #include "mozilla/dom/MozMmsMessageBinding.h"
michael@0 17 #include "nsIDOMMozSmsEvent.h"
michael@0 18 #include "nsIDOMMozMmsEvent.h"
michael@0 19 #include "nsIDOMMozSmsMessage.h"
michael@0 20 #include "nsIDOMMozMmsMessage.h"
michael@0 21 #include "nsJSUtils.h"
michael@0 22 #include "nsContentUtils.h"
michael@0 23 #include "nsCxPusher.h"
michael@0 24 #include "nsIMobileMessageDatabaseService.h"
michael@0 25 #include "nsIXPConnect.h"
michael@0 26 #include "nsIPermissionManager.h"
michael@0 27 #include "GeneratedEvents.h"
michael@0 28 #include "DOMRequest.h"
michael@0 29 #include "nsIMobileMessageCallback.h"
michael@0 30 #include "MobileMessageCallback.h"
michael@0 31 #include "MobileMessageCursorCallback.h"
michael@0 32 #include "DOMCursor.h"
michael@0 33
michael@0 34 #define RECEIVED_EVENT_NAME NS_LITERAL_STRING("received")
michael@0 35 #define RETRIEVING_EVENT_NAME NS_LITERAL_STRING("retrieving")
michael@0 36 #define SENDING_EVENT_NAME NS_LITERAL_STRING("sending")
michael@0 37 #define SENT_EVENT_NAME NS_LITERAL_STRING("sent")
michael@0 38 #define FAILED_EVENT_NAME NS_LITERAL_STRING("failed")
michael@0 39 #define DELIVERY_SUCCESS_EVENT_NAME NS_LITERAL_STRING("deliverysuccess")
michael@0 40 #define DELIVERY_ERROR_EVENT_NAME NS_LITERAL_STRING("deliveryerror")
michael@0 41 #define READ_SUCCESS_EVENT_NAME NS_LITERAL_STRING("readsuccess")
michael@0 42 #define READ_ERROR_EVENT_NAME NS_LITERAL_STRING("readerror")
michael@0 43
michael@0 44 using namespace mozilla::dom::mobilemessage;
michael@0 45
michael@0 46 DOMCI_DATA(MozMobileMessageManager, mozilla::dom::MobileMessageManager)
michael@0 47
michael@0 48 namespace mozilla {
michael@0 49 namespace dom {
michael@0 50
michael@0 51 NS_INTERFACE_MAP_BEGIN(MobileMessageManager)
michael@0 52 NS_INTERFACE_MAP_ENTRY(nsIDOMMozMobileMessageManager)
michael@0 53 NS_INTERFACE_MAP_ENTRY(nsIObserver)
michael@0 54 NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozMobileMessageManager)
michael@0 55 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
michael@0 56
michael@0 57 NS_IMPL_ADDREF_INHERITED(MobileMessageManager, DOMEventTargetHelper)
michael@0 58 NS_IMPL_RELEASE_INHERITED(MobileMessageManager, DOMEventTargetHelper)
michael@0 59
michael@0 60 NS_IMPL_EVENT_HANDLER(MobileMessageManager, received)
michael@0 61 NS_IMPL_EVENT_HANDLER(MobileMessageManager, retrieving)
michael@0 62 NS_IMPL_EVENT_HANDLER(MobileMessageManager, sending)
michael@0 63 NS_IMPL_EVENT_HANDLER(MobileMessageManager, sent)
michael@0 64 NS_IMPL_EVENT_HANDLER(MobileMessageManager, failed)
michael@0 65 NS_IMPL_EVENT_HANDLER(MobileMessageManager, deliverysuccess)
michael@0 66 NS_IMPL_EVENT_HANDLER(MobileMessageManager, deliveryerror)
michael@0 67 NS_IMPL_EVENT_HANDLER(MobileMessageManager, readsuccess)
michael@0 68 NS_IMPL_EVENT_HANDLER(MobileMessageManager, readerror)
michael@0 69
michael@0 70 void
michael@0 71 MobileMessageManager::Init(nsPIDOMWindow *aWindow)
michael@0 72 {
michael@0 73 BindToOwner(aWindow);
michael@0 74
michael@0 75 nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
michael@0 76 // GetObserverService() can return null is some situations like shutdown.
michael@0 77 if (!obs) {
michael@0 78 return;
michael@0 79 }
michael@0 80
michael@0 81 obs->AddObserver(this, kSmsReceivedObserverTopic, false);
michael@0 82 obs->AddObserver(this, kSmsRetrievingObserverTopic, false);
michael@0 83 obs->AddObserver(this, kSmsSendingObserverTopic, false);
michael@0 84 obs->AddObserver(this, kSmsSentObserverTopic, false);
michael@0 85 obs->AddObserver(this, kSmsFailedObserverTopic, false);
michael@0 86 obs->AddObserver(this, kSmsDeliverySuccessObserverTopic, false);
michael@0 87 obs->AddObserver(this, kSmsDeliveryErrorObserverTopic, false);
michael@0 88 obs->AddObserver(this, kSmsReadSuccessObserverTopic, false);
michael@0 89 obs->AddObserver(this, kSmsReadErrorObserverTopic, false);
michael@0 90 }
michael@0 91
michael@0 92 void
michael@0 93 MobileMessageManager::Shutdown()
michael@0 94 {
michael@0 95 nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
michael@0 96 // GetObserverService() can return null is some situations like shutdown.
michael@0 97 if (!obs) {
michael@0 98 return;
michael@0 99 }
michael@0 100
michael@0 101 obs->RemoveObserver(this, kSmsReceivedObserverTopic);
michael@0 102 obs->RemoveObserver(this, kSmsRetrievingObserverTopic);
michael@0 103 obs->RemoveObserver(this, kSmsSendingObserverTopic);
michael@0 104 obs->RemoveObserver(this, kSmsSentObserverTopic);
michael@0 105 obs->RemoveObserver(this, kSmsFailedObserverTopic);
michael@0 106 obs->RemoveObserver(this, kSmsDeliverySuccessObserverTopic);
michael@0 107 obs->RemoveObserver(this, kSmsDeliveryErrorObserverTopic);
michael@0 108 obs->RemoveObserver(this, kSmsReadSuccessObserverTopic);
michael@0 109 obs->RemoveObserver(this, kSmsReadErrorObserverTopic);
michael@0 110 }
michael@0 111
michael@0 112 NS_IMETHODIMP
michael@0 113 MobileMessageManager::GetSegmentInfoForText(const nsAString& aText,
michael@0 114 nsIDOMDOMRequest** aRequest)
michael@0 115 {
michael@0 116 nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
michael@0 117 NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE);
michael@0 118
michael@0 119 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 120 nsCOMPtr<nsIMobileMessageCallback> msgCallback =
michael@0 121 new MobileMessageCallback(request);
michael@0 122 nsresult rv = smsService->GetSegmentInfoForText(aText, msgCallback);
michael@0 123 NS_ENSURE_SUCCESS(rv, rv);
michael@0 124
michael@0 125 request.forget(aRequest);
michael@0 126 return NS_OK;
michael@0 127 }
michael@0 128
michael@0 129 nsresult
michael@0 130 MobileMessageManager::Send(JSContext* aCx, JS::Handle<JSObject*> aGlobal,
michael@0 131 uint32_t aServiceId,
michael@0 132 JS::Handle<JSString*> aNumber,
michael@0 133 const nsAString& aMessage,
michael@0 134 JS::Value* aRequest)
michael@0 135 {
michael@0 136 nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
michael@0 137 NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE);
michael@0 138
michael@0 139 nsDependentJSString number;
michael@0 140 number.init(aCx, aNumber);
michael@0 141
michael@0 142 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 143 nsCOMPtr<nsIMobileMessageCallback> msgCallback =
michael@0 144 new MobileMessageCallback(request);
michael@0 145
michael@0 146 // By default, we don't send silent messages via MobileMessageManager.
michael@0 147 nsresult rv = smsService->Send(aServiceId, number, aMessage,
michael@0 148 false, msgCallback);
michael@0 149 NS_ENSURE_SUCCESS(rv, rv);
michael@0 150
michael@0 151 js::AssertSameCompartment(aCx, aGlobal);
michael@0 152 JS::Rooted<JS::Value> rval(aCx);
michael@0 153 rv = nsContentUtils::WrapNative(aCx,
michael@0 154 static_cast<nsIDOMDOMRequest*>(request.get()),
michael@0 155 &rval);
michael@0 156 if (NS_FAILED(rv)) {
michael@0 157 NS_ERROR("Failed to create the js value!");
michael@0 158 return rv;
michael@0 159 }
michael@0 160
michael@0 161 *aRequest = rval;
michael@0 162 return NS_OK;
michael@0 163 }
michael@0 164
michael@0 165 NS_IMETHODIMP
michael@0 166 MobileMessageManager::Send(JS::Handle<JS::Value> aNumber,
michael@0 167 const nsAString& aMessage,
michael@0 168 JS::Handle<JS::Value> aSendParams,
michael@0 169 JSContext* aCx,
michael@0 170 uint8_t aArgc,
michael@0 171 JS::MutableHandle<JS::Value> aReturn)
michael@0 172 {
michael@0 173 if (!aNumber.isString() && !JS_IsArrayObject(aCx, aNumber)) {
michael@0 174 return NS_ERROR_INVALID_ARG;
michael@0 175 }
michael@0 176
michael@0 177 nsresult rv;
michael@0 178 nsIScriptContext* sc = GetContextForEventHandlers(&rv);
michael@0 179 NS_ENSURE_SUCCESS(rv, rv);
michael@0 180 NS_ENSURE_STATE(sc);
michael@0 181
michael@0 182 JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx));
michael@0 183
michael@0 184 mozilla::Maybe<JSAutoCompartment> ac;
michael@0 185 if (!global) {
michael@0 186 global = sc->GetWindowProxy();
michael@0 187 ac.construct(aCx, global);
michael@0 188 }
michael@0 189
michael@0 190 nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
michael@0 191 NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE);
michael@0 192
michael@0 193 // Use the default one unless |aSendParams.serviceId| is available.
michael@0 194 uint32_t serviceId;
michael@0 195 rv = smsService->GetSmsDefaultServiceId(&serviceId);
michael@0 196 NS_ENSURE_SUCCESS(rv, rv);
michael@0 197
michael@0 198 if (aArgc == 1) {
michael@0 199 JS::Rooted<JS::Value> param(aCx, aSendParams);
michael@0 200 RootedDictionary<SmsSendParameters> sendParams(aCx);
michael@0 201 if (!sendParams.Init(aCx, param)) {
michael@0 202 return NS_ERROR_TYPE_ERR;
michael@0 203 }
michael@0 204 if (sendParams.mServiceId.WasPassed()) {
michael@0 205 serviceId = sendParams.mServiceId.Value();
michael@0 206 }
michael@0 207 }
michael@0 208
michael@0 209 if (aNumber.isString()) {
michael@0 210 JS::Rooted<JSString*> str(aCx, aNumber.toString());
michael@0 211 return Send(aCx, global, serviceId, str, aMessage, aReturn.address());
michael@0 212 }
michael@0 213
michael@0 214 // Must be an array then.
michael@0 215 JS::Rooted<JSObject*> numbers(aCx, &aNumber.toObject());
michael@0 216
michael@0 217 uint32_t size;
michael@0 218 if (!JS_GetArrayLength(aCx, numbers, &size)) {
michael@0 219 return NS_ERROR_FAILURE;
michael@0 220 }
michael@0 221
michael@0 222 JS::AutoValueVector requests(aCx);
michael@0 223 if (!requests.resize(size)) {
michael@0 224 return NS_ERROR_FAILURE;
michael@0 225 }
michael@0 226
michael@0 227 JS::Rooted<JS::Value> number(aCx);
michael@0 228 JS::Rooted<JSString*> str(aCx);
michael@0 229 for (uint32_t i = 0; i < size; ++i) {
michael@0 230 if (!JS_GetElement(aCx, numbers, i, &number)) {
michael@0 231 return NS_ERROR_INVALID_ARG;
michael@0 232 }
michael@0 233
michael@0 234 str = JS::ToString(aCx, number);
michael@0 235 if (!str) {
michael@0 236 return NS_ERROR_FAILURE;
michael@0 237 }
michael@0 238
michael@0 239 nsresult rv = Send(aCx, global, serviceId, str, aMessage, &requests[i]);
michael@0 240 NS_ENSURE_SUCCESS(rv, rv);
michael@0 241 }
michael@0 242
michael@0 243 JS::Rooted<JSObject*> obj(aCx);
michael@0 244 obj = JS_NewArrayObject(aCx, requests);
michael@0 245 if (!obj) {
michael@0 246 return NS_ERROR_FAILURE;
michael@0 247 }
michael@0 248
michael@0 249 aReturn.setObject(*obj);
michael@0 250 return NS_OK;
michael@0 251 }
michael@0 252
michael@0 253 NS_IMETHODIMP
michael@0 254 MobileMessageManager::SendMMS(JS::Handle<JS::Value> aParams,
michael@0 255 JS::Handle<JS::Value> aSendParams,
michael@0 256 JSContext* aCx,
michael@0 257 uint8_t aArgc,
michael@0 258 nsIDOMDOMRequest** aRequest)
michael@0 259 {
michael@0 260 nsCOMPtr<nsIMmsService> mmsService = do_GetService(MMS_SERVICE_CONTRACTID);
michael@0 261 NS_ENSURE_TRUE(mmsService, NS_ERROR_FAILURE);
michael@0 262
michael@0 263 // Use the default one unless |aSendParams.serviceId| is available.
michael@0 264 uint32_t serviceId;
michael@0 265 nsresult rv = mmsService->GetMmsDefaultServiceId(&serviceId);
michael@0 266 NS_ENSURE_SUCCESS(rv, rv);
michael@0 267
michael@0 268 if (aArgc == 1) {
michael@0 269 JS::Rooted<JS::Value> param(aCx, aSendParams);
michael@0 270 RootedDictionary<MmsSendParameters> sendParams(aCx);
michael@0 271 if (!sendParams.Init(aCx, param)) {
michael@0 272 return NS_ERROR_TYPE_ERR;
michael@0 273 }
michael@0 274 if (sendParams.mServiceId.WasPassed()) {
michael@0 275 serviceId = sendParams.mServiceId.Value();
michael@0 276 }
michael@0 277 }
michael@0 278
michael@0 279 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 280 nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request);
michael@0 281 rv = mmsService->Send(serviceId, aParams, msgCallback);
michael@0 282 NS_ENSURE_SUCCESS(rv, rv);
michael@0 283
michael@0 284 request.forget(aRequest);
michael@0 285 return NS_OK;
michael@0 286 }
michael@0 287
michael@0 288 NS_IMETHODIMP
michael@0 289 MobileMessageManager::GetMessageMoz(int32_t aId, nsIDOMDOMRequest** aRequest)
michael@0 290 {
michael@0 291 nsCOMPtr<nsIMobileMessageDatabaseService> mobileMessageDBService =
michael@0 292 do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID);
michael@0 293 NS_ENSURE_TRUE(mobileMessageDBService, NS_ERROR_FAILURE);
michael@0 294
michael@0 295 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 296 nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request);
michael@0 297 nsresult rv = mobileMessageDBService->GetMessageMoz(aId, msgCallback);
michael@0 298 NS_ENSURE_SUCCESS(rv, rv);
michael@0 299
michael@0 300 request.forget(aRequest);
michael@0 301 return NS_OK;
michael@0 302 }
michael@0 303
michael@0 304 nsresult
michael@0 305 MobileMessageManager::GetMessageId(JSContext* aCx,
michael@0 306 const JS::Value& aMessage, int32_t* aId)
michael@0 307 {
michael@0 308 nsCOMPtr<nsIDOMMozSmsMessage> smsMessage =
michael@0 309 do_QueryInterface(nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, &aMessage.toObject()));
michael@0 310 if (smsMessage) {
michael@0 311 return smsMessage->GetId(aId);
michael@0 312 }
michael@0 313
michael@0 314 nsCOMPtr<nsIDOMMozMmsMessage> mmsMessage =
michael@0 315 do_QueryInterface(nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, &aMessage.toObject()));
michael@0 316 if (mmsMessage) {
michael@0 317 return mmsMessage->GetId(aId);
michael@0 318 }
michael@0 319
michael@0 320 return NS_ERROR_INVALID_ARG;
michael@0 321 }
michael@0 322
michael@0 323 NS_IMETHODIMP
michael@0 324 MobileMessageManager::Delete(JS::Handle<JS::Value> aParam, JSContext* aCx,
michael@0 325 nsIDOMDOMRequest** aRequest)
michael@0 326 {
michael@0 327 // We expect Int32, SmsMessage, MmsMessage, Int32[], SmsMessage[], MmsMessage[]
michael@0 328 if (!aParam.isObject() && !aParam.isInt32()) {
michael@0 329 return NS_ERROR_INVALID_ARG;
michael@0 330 }
michael@0 331
michael@0 332 nsresult rv = NS_OK;
michael@0 333 int32_t id, *idArray;
michael@0 334 uint32_t size;
michael@0 335
michael@0 336 if (aParam.isInt32()) {
michael@0 337 // Single Integer Message ID
michael@0 338 id = aParam.toInt32();
michael@0 339
michael@0 340 size = 1;
michael@0 341 idArray = &id;
michael@0 342 } else if (!JS_IsArrayObject(aCx, aParam)) {
michael@0 343 // Single SmsMessage/MmsMessage object
michael@0 344 rv = GetMessageId(aCx, aParam, &id);
michael@0 345 NS_ENSURE_SUCCESS(rv, rv);
michael@0 346
michael@0 347 size = 1;
michael@0 348 idArray = &id;
michael@0 349 } else {
michael@0 350 // Int32[], SmsMessage[], or MmsMessage[]
michael@0 351 JS::Rooted<JSObject*> ids(aCx, &aParam.toObject());
michael@0 352
michael@0 353 MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, ids, &size));
michael@0 354 nsAutoArrayPtr<int32_t> idAutoArray(new int32_t[size]);
michael@0 355
michael@0 356 JS::Rooted<JS::Value> idJsValue(aCx);
michael@0 357 for (uint32_t i = 0; i < size; i++) {
michael@0 358 if (!JS_GetElement(aCx, ids, i, &idJsValue)) {
michael@0 359 return NS_ERROR_INVALID_ARG;
michael@0 360 }
michael@0 361
michael@0 362 if (idJsValue.isInt32()) {
michael@0 363 idAutoArray[i] = idJsValue.toInt32();
michael@0 364 } else if (idJsValue.isObject()) {
michael@0 365 rv = GetMessageId(aCx, idJsValue, &id);
michael@0 366 NS_ENSURE_SUCCESS(rv, rv);
michael@0 367
michael@0 368 idAutoArray[i] = id;
michael@0 369 }
michael@0 370 }
michael@0 371
michael@0 372 idArray = idAutoArray.forget();
michael@0 373 }
michael@0 374
michael@0 375 nsCOMPtr<nsIMobileMessageDatabaseService> dbService =
michael@0 376 do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID);
michael@0 377 NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE);
michael@0 378
michael@0 379 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 380 nsCOMPtr<nsIMobileMessageCallback> msgCallback =
michael@0 381 new MobileMessageCallback(request);
michael@0 382
michael@0 383 rv = dbService->DeleteMessage(idArray, size, msgCallback);
michael@0 384 NS_ENSURE_SUCCESS(rv, rv);
michael@0 385
michael@0 386 request.forget(aRequest);
michael@0 387 return NS_OK;
michael@0 388 }
michael@0 389
michael@0 390 NS_IMETHODIMP
michael@0 391 MobileMessageManager::GetMessages(nsIDOMMozSmsFilter* aFilter,
michael@0 392 bool aReverse,
michael@0 393 nsIDOMDOMCursor** aCursor)
michael@0 394 {
michael@0 395 nsCOMPtr<nsIMobileMessageDatabaseService> dbService =
michael@0 396 do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID);
michael@0 397 NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE);
michael@0 398
michael@0 399 nsCOMPtr<nsIDOMMozSmsFilter> filter = aFilter;
michael@0 400 if (!filter) {
michael@0 401 filter = new SmsFilter();
michael@0 402 }
michael@0 403
michael@0 404 nsRefPtr<MobileMessageCursorCallback> cursorCallback =
michael@0 405 new MobileMessageCursorCallback();
michael@0 406
michael@0 407 nsCOMPtr<nsICursorContinueCallback> continueCallback;
michael@0 408 nsresult rv = dbService->CreateMessageCursor(filter, aReverse, cursorCallback,
michael@0 409 getter_AddRefs(continueCallback));
michael@0 410 NS_ENSURE_SUCCESS(rv, rv);
michael@0 411
michael@0 412 cursorCallback->mDOMCursor = new DOMCursor(GetOwner(), continueCallback);
michael@0 413 NS_ADDREF(*aCursor = cursorCallback->mDOMCursor);
michael@0 414
michael@0 415 return NS_OK;
michael@0 416 }
michael@0 417
michael@0 418 NS_IMETHODIMP
michael@0 419 MobileMessageManager::MarkMessageRead(int32_t aId, bool aValue,
michael@0 420 bool aSendReadReport,
michael@0 421 nsIDOMDOMRequest** aRequest)
michael@0 422 {
michael@0 423 nsCOMPtr<nsIMobileMessageDatabaseService> mobileMessageDBService =
michael@0 424 do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID);
michael@0 425 NS_ENSURE_TRUE(mobileMessageDBService, NS_ERROR_FAILURE);
michael@0 426
michael@0 427 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 428 nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request);
michael@0 429 nsresult rv = mobileMessageDBService->MarkMessageRead(aId, aValue,
michael@0 430 aSendReadReport,
michael@0 431 msgCallback);
michael@0 432 NS_ENSURE_SUCCESS(rv, rv);
michael@0 433
michael@0 434 request.forget(aRequest);
michael@0 435 return NS_OK;
michael@0 436 }
michael@0 437
michael@0 438 NS_IMETHODIMP
michael@0 439 MobileMessageManager::GetThreads(nsIDOMDOMCursor** aCursor)
michael@0 440 {
michael@0 441 nsCOMPtr<nsIMobileMessageDatabaseService> dbService =
michael@0 442 do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID);
michael@0 443 NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE);
michael@0 444
michael@0 445 nsRefPtr<MobileMessageCursorCallback> cursorCallback =
michael@0 446 new MobileMessageCursorCallback();
michael@0 447
michael@0 448 nsCOMPtr<nsICursorContinueCallback> continueCallback;
michael@0 449 nsresult rv = dbService->CreateThreadCursor(cursorCallback,
michael@0 450 getter_AddRefs(continueCallback));
michael@0 451 NS_ENSURE_SUCCESS(rv, rv);
michael@0 452
michael@0 453 cursorCallback->mDOMCursor = new DOMCursor(GetOwner(), continueCallback);
michael@0 454 NS_ADDREF(*aCursor = cursorCallback->mDOMCursor);
michael@0 455
michael@0 456 return NS_OK;
michael@0 457 }
michael@0 458
michael@0 459 NS_IMETHODIMP
michael@0 460 MobileMessageManager::RetrieveMMS(int32_t id,
michael@0 461 nsIDOMDOMRequest** aRequest)
michael@0 462 {
michael@0 463 nsCOMPtr<nsIMmsService> mmsService = do_GetService(MMS_SERVICE_CONTRACTID);
michael@0 464 NS_ENSURE_TRUE(mmsService, NS_ERROR_FAILURE);
michael@0 465
michael@0 466 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 467 nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request);
michael@0 468
michael@0 469 nsresult rv = mmsService->Retrieve(id, msgCallback);
michael@0 470 NS_ENSURE_SUCCESS(rv, rv);
michael@0 471
michael@0 472 request.forget(aRequest);
michael@0 473 return NS_OK;
michael@0 474 }
michael@0 475
michael@0 476 nsresult
michael@0 477 MobileMessageManager::DispatchTrustedSmsEventToSelf(const char* aTopic,
michael@0 478 const nsAString& aEventName,
michael@0 479 nsISupports* aMsg)
michael@0 480 {
michael@0 481 nsCOMPtr<nsIDOMEvent> event;
michael@0 482
michael@0 483 nsCOMPtr<nsIDOMMozSmsMessage> sms = do_QueryInterface(aMsg);
michael@0 484 if (sms) {
michael@0 485 NS_NewDOMMozSmsEvent(getter_AddRefs(event), this, nullptr, nullptr);
michael@0 486 NS_ASSERTION(event, "This should never fail!");
michael@0 487
michael@0 488 nsCOMPtr<nsIDOMMozSmsEvent> se = do_QueryInterface(event);
michael@0 489 nsresult rv = se->InitMozSmsEvent(aEventName, false, false, sms);
michael@0 490 NS_ENSURE_SUCCESS(rv, rv);
michael@0 491 return DispatchTrustedEvent(event);
michael@0 492 }
michael@0 493
michael@0 494 nsCOMPtr<nsIDOMMozMmsMessage> mms = do_QueryInterface(aMsg);
michael@0 495 if (mms) {
michael@0 496 NS_NewDOMMozMmsEvent(getter_AddRefs(event), this, nullptr, nullptr);
michael@0 497 NS_ASSERTION(event, "This should never fail!");
michael@0 498
michael@0 499 nsCOMPtr<nsIDOMMozMmsEvent> se = do_QueryInterface(event);
michael@0 500 nsresult rv = se->InitMozMmsEvent(aEventName, false, false, mms);
michael@0 501 NS_ENSURE_SUCCESS(rv, rv);
michael@0 502 return DispatchTrustedEvent(event);
michael@0 503 }
michael@0 504
michael@0 505 nsAutoCString errorMsg;
michael@0 506 errorMsg.AssignLiteral("Got a '");
michael@0 507 errorMsg.Append(aTopic);
michael@0 508 errorMsg.AppendLiteral("' topic without a valid message!");
michael@0 509 NS_ERROR(errorMsg.get());
michael@0 510 return NS_OK;
michael@0 511 }
michael@0 512
michael@0 513 NS_IMETHODIMP
michael@0 514 MobileMessageManager::Observe(nsISupports* aSubject, const char* aTopic,
michael@0 515 const char16_t* aData)
michael@0 516 {
michael@0 517 if (!strcmp(aTopic, kSmsReceivedObserverTopic)) {
michael@0 518 return DispatchTrustedSmsEventToSelf(aTopic, RECEIVED_EVENT_NAME, aSubject);
michael@0 519 }
michael@0 520
michael@0 521 if (!strcmp(aTopic, kSmsRetrievingObserverTopic)) {
michael@0 522 return DispatchTrustedSmsEventToSelf(aTopic, RETRIEVING_EVENT_NAME, aSubject);
michael@0 523 }
michael@0 524
michael@0 525 if (!strcmp(aTopic, kSmsSendingObserverTopic)) {
michael@0 526 return DispatchTrustedSmsEventToSelf(aTopic, SENDING_EVENT_NAME, aSubject);
michael@0 527 }
michael@0 528
michael@0 529 if (!strcmp(aTopic, kSmsSentObserverTopic)) {
michael@0 530 return DispatchTrustedSmsEventToSelf(aTopic, SENT_EVENT_NAME, aSubject);
michael@0 531 }
michael@0 532
michael@0 533 if (!strcmp(aTopic, kSmsFailedObserverTopic)) {
michael@0 534 return DispatchTrustedSmsEventToSelf(aTopic, FAILED_EVENT_NAME, aSubject);
michael@0 535 }
michael@0 536
michael@0 537 if (!strcmp(aTopic, kSmsDeliverySuccessObserverTopic)) {
michael@0 538 return DispatchTrustedSmsEventToSelf(aTopic, DELIVERY_SUCCESS_EVENT_NAME, aSubject);
michael@0 539 }
michael@0 540
michael@0 541 if (!strcmp(aTopic, kSmsDeliveryErrorObserverTopic)) {
michael@0 542 return DispatchTrustedSmsEventToSelf(aTopic, DELIVERY_ERROR_EVENT_NAME, aSubject);
michael@0 543 }
michael@0 544
michael@0 545 if (!strcmp(aTopic, kSmsReadSuccessObserverTopic)) {
michael@0 546 return DispatchTrustedSmsEventToSelf(aTopic, READ_SUCCESS_EVENT_NAME, aSubject);
michael@0 547 }
michael@0 548
michael@0 549 if (!strcmp(aTopic, kSmsReadErrorObserverTopic)) {
michael@0 550 return DispatchTrustedSmsEventToSelf(aTopic, READ_ERROR_EVENT_NAME, aSubject);
michael@0 551 }
michael@0 552
michael@0 553 return NS_OK;
michael@0 554 }
michael@0 555
michael@0 556 NS_IMETHODIMP
michael@0 557 MobileMessageManager::GetSmscAddress(uint32_t aServiceId, uint8_t aArgc,
michael@0 558 nsIDOMDOMRequest** aRequest)
michael@0 559 {
michael@0 560 nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
michael@0 561 NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE);
michael@0 562
michael@0 563 nsresult rv;
michael@0 564 if (aArgc != 1) {
michael@0 565 rv = smsService->GetSmsDefaultServiceId(&aServiceId);
michael@0 566 NS_ENSURE_SUCCESS(rv, rv);
michael@0 567 }
michael@0 568
michael@0 569 nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
michael@0 570 nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request);
michael@0 571 rv = smsService->GetSmscAddress(aServiceId, msgCallback);
michael@0 572 NS_ENSURE_SUCCESS(rv, rv);
michael@0 573
michael@0 574 request.forget(aRequest);
michael@0 575 return NS_OK;
michael@0 576 }
michael@0 577
michael@0 578 } // namespace dom
michael@0 579 } // namespace mozilla

mercurial