michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "SmsFilter.h" michael@0: #include "MobileMessageManager.h" michael@0: #include "nsIDOMClassInfo.h" michael@0: #include "nsISmsService.h" michael@0: #include "nsIMmsService.h" michael@0: #include "nsIObserverService.h" michael@0: #include "mozilla/Preferences.h" michael@0: #include "mozilla/Services.h" michael@0: #include "mozilla/dom/mobilemessage/Constants.h" // For MessageType michael@0: #include "mozilla/dom/MobileMessageManagerBinding.h" michael@0: #include "mozilla/dom/MozMmsMessageBinding.h" michael@0: #include "nsIDOMMozSmsEvent.h" michael@0: #include "nsIDOMMozMmsEvent.h" michael@0: #include "nsIDOMMozSmsMessage.h" michael@0: #include "nsIDOMMozMmsMessage.h" michael@0: #include "nsJSUtils.h" michael@0: #include "nsContentUtils.h" michael@0: #include "nsCxPusher.h" michael@0: #include "nsIMobileMessageDatabaseService.h" michael@0: #include "nsIXPConnect.h" michael@0: #include "nsIPermissionManager.h" michael@0: #include "GeneratedEvents.h" michael@0: #include "DOMRequest.h" michael@0: #include "nsIMobileMessageCallback.h" michael@0: #include "MobileMessageCallback.h" michael@0: #include "MobileMessageCursorCallback.h" michael@0: #include "DOMCursor.h" michael@0: michael@0: #define RECEIVED_EVENT_NAME NS_LITERAL_STRING("received") michael@0: #define RETRIEVING_EVENT_NAME NS_LITERAL_STRING("retrieving") michael@0: #define SENDING_EVENT_NAME NS_LITERAL_STRING("sending") michael@0: #define SENT_EVENT_NAME NS_LITERAL_STRING("sent") michael@0: #define FAILED_EVENT_NAME NS_LITERAL_STRING("failed") michael@0: #define DELIVERY_SUCCESS_EVENT_NAME NS_LITERAL_STRING("deliverysuccess") michael@0: #define DELIVERY_ERROR_EVENT_NAME NS_LITERAL_STRING("deliveryerror") michael@0: #define READ_SUCCESS_EVENT_NAME NS_LITERAL_STRING("readsuccess") michael@0: #define READ_ERROR_EVENT_NAME NS_LITERAL_STRING("readerror") michael@0: michael@0: using namespace mozilla::dom::mobilemessage; michael@0: michael@0: DOMCI_DATA(MozMobileMessageManager, mozilla::dom::MobileMessageManager) michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: NS_INTERFACE_MAP_BEGIN(MobileMessageManager) michael@0: NS_INTERFACE_MAP_ENTRY(nsIDOMMozMobileMessageManager) michael@0: NS_INTERFACE_MAP_ENTRY(nsIObserver) michael@0: NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozMobileMessageManager) michael@0: NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) michael@0: michael@0: NS_IMPL_ADDREF_INHERITED(MobileMessageManager, DOMEventTargetHelper) michael@0: NS_IMPL_RELEASE_INHERITED(MobileMessageManager, DOMEventTargetHelper) michael@0: michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, received) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, retrieving) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, sending) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, sent) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, failed) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, deliverysuccess) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, deliveryerror) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, readsuccess) michael@0: NS_IMPL_EVENT_HANDLER(MobileMessageManager, readerror) michael@0: michael@0: void michael@0: MobileMessageManager::Init(nsPIDOMWindow *aWindow) michael@0: { michael@0: BindToOwner(aWindow); michael@0: michael@0: nsCOMPtr obs = services::GetObserverService(); michael@0: // GetObserverService() can return null is some situations like shutdown. michael@0: if (!obs) { michael@0: return; michael@0: } michael@0: michael@0: obs->AddObserver(this, kSmsReceivedObserverTopic, false); michael@0: obs->AddObserver(this, kSmsRetrievingObserverTopic, false); michael@0: obs->AddObserver(this, kSmsSendingObserverTopic, false); michael@0: obs->AddObserver(this, kSmsSentObserverTopic, false); michael@0: obs->AddObserver(this, kSmsFailedObserverTopic, false); michael@0: obs->AddObserver(this, kSmsDeliverySuccessObserverTopic, false); michael@0: obs->AddObserver(this, kSmsDeliveryErrorObserverTopic, false); michael@0: obs->AddObserver(this, kSmsReadSuccessObserverTopic, false); michael@0: obs->AddObserver(this, kSmsReadErrorObserverTopic, false); michael@0: } michael@0: michael@0: void michael@0: MobileMessageManager::Shutdown() michael@0: { michael@0: nsCOMPtr obs = services::GetObserverService(); michael@0: // GetObserverService() can return null is some situations like shutdown. michael@0: if (!obs) { michael@0: return; michael@0: } michael@0: michael@0: obs->RemoveObserver(this, kSmsReceivedObserverTopic); michael@0: obs->RemoveObserver(this, kSmsRetrievingObserverTopic); michael@0: obs->RemoveObserver(this, kSmsSendingObserverTopic); michael@0: obs->RemoveObserver(this, kSmsSentObserverTopic); michael@0: obs->RemoveObserver(this, kSmsFailedObserverTopic); michael@0: obs->RemoveObserver(this, kSmsDeliverySuccessObserverTopic); michael@0: obs->RemoveObserver(this, kSmsDeliveryErrorObserverTopic); michael@0: obs->RemoveObserver(this, kSmsReadSuccessObserverTopic); michael@0: obs->RemoveObserver(this, kSmsReadErrorObserverTopic); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::GetSegmentInfoForText(const nsAString& aText, michael@0: nsIDOMDOMRequest** aRequest) michael@0: { michael@0: nsCOMPtr smsService = do_GetService(SMS_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = michael@0: new MobileMessageCallback(request); michael@0: nsresult rv = smsService->GetSegmentInfoForText(aText, msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: request.forget(aRequest); michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: MobileMessageManager::Send(JSContext* aCx, JS::Handle aGlobal, michael@0: uint32_t aServiceId, michael@0: JS::Handle aNumber, michael@0: const nsAString& aMessage, michael@0: JS::Value* aRequest) michael@0: { michael@0: nsCOMPtr smsService = do_GetService(SMS_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); michael@0: michael@0: nsDependentJSString number; michael@0: number.init(aCx, aNumber); michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = michael@0: new MobileMessageCallback(request); michael@0: michael@0: // By default, we don't send silent messages via MobileMessageManager. michael@0: nsresult rv = smsService->Send(aServiceId, number, aMessage, michael@0: false, msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: js::AssertSameCompartment(aCx, aGlobal); michael@0: JS::Rooted rval(aCx); michael@0: rv = nsContentUtils::WrapNative(aCx, michael@0: static_cast(request.get()), michael@0: &rval); michael@0: if (NS_FAILED(rv)) { michael@0: NS_ERROR("Failed to create the js value!"); michael@0: return rv; michael@0: } michael@0: michael@0: *aRequest = rval; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::Send(JS::Handle aNumber, michael@0: const nsAString& aMessage, michael@0: JS::Handle aSendParams, michael@0: JSContext* aCx, michael@0: uint8_t aArgc, michael@0: JS::MutableHandle aReturn) michael@0: { michael@0: if (!aNumber.isString() && !JS_IsArrayObject(aCx, aNumber)) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: nsresult rv; michael@0: nsIScriptContext* sc = GetContextForEventHandlers(&rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: NS_ENSURE_STATE(sc); michael@0: michael@0: JS::Rooted global(aCx, JS::CurrentGlobalOrNull(aCx)); michael@0: michael@0: mozilla::Maybe ac; michael@0: if (!global) { michael@0: global = sc->GetWindowProxy(); michael@0: ac.construct(aCx, global); michael@0: } michael@0: michael@0: nsCOMPtr smsService = do_GetService(SMS_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); michael@0: michael@0: // Use the default one unless |aSendParams.serviceId| is available. michael@0: uint32_t serviceId; michael@0: rv = smsService->GetSmsDefaultServiceId(&serviceId); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: if (aArgc == 1) { michael@0: JS::Rooted param(aCx, aSendParams); michael@0: RootedDictionary sendParams(aCx); michael@0: if (!sendParams.Init(aCx, param)) { michael@0: return NS_ERROR_TYPE_ERR; michael@0: } michael@0: if (sendParams.mServiceId.WasPassed()) { michael@0: serviceId = sendParams.mServiceId.Value(); michael@0: } michael@0: } michael@0: michael@0: if (aNumber.isString()) { michael@0: JS::Rooted str(aCx, aNumber.toString()); michael@0: return Send(aCx, global, serviceId, str, aMessage, aReturn.address()); michael@0: } michael@0: michael@0: // Must be an array then. michael@0: JS::Rooted numbers(aCx, &aNumber.toObject()); michael@0: michael@0: uint32_t size; michael@0: if (!JS_GetArrayLength(aCx, numbers, &size)) { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: JS::AutoValueVector requests(aCx); michael@0: if (!requests.resize(size)) { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: JS::Rooted number(aCx); michael@0: JS::Rooted str(aCx); michael@0: for (uint32_t i = 0; i < size; ++i) { michael@0: if (!JS_GetElement(aCx, numbers, i, &number)) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: str = JS::ToString(aCx, number); michael@0: if (!str) { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: nsresult rv = Send(aCx, global, serviceId, str, aMessage, &requests[i]); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: } michael@0: michael@0: JS::Rooted obj(aCx); michael@0: obj = JS_NewArrayObject(aCx, requests); michael@0: if (!obj) { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: aReturn.setObject(*obj); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::SendMMS(JS::Handle aParams, michael@0: JS::Handle aSendParams, michael@0: JSContext* aCx, michael@0: uint8_t aArgc, michael@0: nsIDOMDOMRequest** aRequest) michael@0: { michael@0: nsCOMPtr mmsService = do_GetService(MMS_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(mmsService, NS_ERROR_FAILURE); michael@0: michael@0: // Use the default one unless |aSendParams.serviceId| is available. michael@0: uint32_t serviceId; michael@0: nsresult rv = mmsService->GetMmsDefaultServiceId(&serviceId); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: if (aArgc == 1) { michael@0: JS::Rooted param(aCx, aSendParams); michael@0: RootedDictionary sendParams(aCx); michael@0: if (!sendParams.Init(aCx, param)) { michael@0: return NS_ERROR_TYPE_ERR; michael@0: } michael@0: if (sendParams.mServiceId.WasPassed()) { michael@0: serviceId = sendParams.mServiceId.Value(); michael@0: } michael@0: } michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = new MobileMessageCallback(request); michael@0: rv = mmsService->Send(serviceId, aParams, msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: request.forget(aRequest); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::GetMessageMoz(int32_t aId, nsIDOMDOMRequest** aRequest) michael@0: { michael@0: nsCOMPtr mobileMessageDBService = michael@0: do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(mobileMessageDBService, NS_ERROR_FAILURE); michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = new MobileMessageCallback(request); michael@0: nsresult rv = mobileMessageDBService->GetMessageMoz(aId, msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: request.forget(aRequest); michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: MobileMessageManager::GetMessageId(JSContext* aCx, michael@0: const JS::Value& aMessage, int32_t* aId) michael@0: { michael@0: nsCOMPtr smsMessage = michael@0: do_QueryInterface(nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, &aMessage.toObject())); michael@0: if (smsMessage) { michael@0: return smsMessage->GetId(aId); michael@0: } michael@0: michael@0: nsCOMPtr mmsMessage = michael@0: do_QueryInterface(nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, &aMessage.toObject())); michael@0: if (mmsMessage) { michael@0: return mmsMessage->GetId(aId); michael@0: } michael@0: michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::Delete(JS::Handle aParam, JSContext* aCx, michael@0: nsIDOMDOMRequest** aRequest) michael@0: { michael@0: // We expect Int32, SmsMessage, MmsMessage, Int32[], SmsMessage[], MmsMessage[] michael@0: if (!aParam.isObject() && !aParam.isInt32()) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: nsresult rv = NS_OK; michael@0: int32_t id, *idArray; michael@0: uint32_t size; michael@0: michael@0: if (aParam.isInt32()) { michael@0: // Single Integer Message ID michael@0: id = aParam.toInt32(); michael@0: michael@0: size = 1; michael@0: idArray = &id; michael@0: } else if (!JS_IsArrayObject(aCx, aParam)) { michael@0: // Single SmsMessage/MmsMessage object michael@0: rv = GetMessageId(aCx, aParam, &id); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: size = 1; michael@0: idArray = &id; michael@0: } else { michael@0: // Int32[], SmsMessage[], or MmsMessage[] michael@0: JS::Rooted ids(aCx, &aParam.toObject()); michael@0: michael@0: MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, ids, &size)); michael@0: nsAutoArrayPtr idAutoArray(new int32_t[size]); michael@0: michael@0: JS::Rooted idJsValue(aCx); michael@0: for (uint32_t i = 0; i < size; i++) { michael@0: if (!JS_GetElement(aCx, ids, i, &idJsValue)) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: if (idJsValue.isInt32()) { michael@0: idAutoArray[i] = idJsValue.toInt32(); michael@0: } else if (idJsValue.isObject()) { michael@0: rv = GetMessageId(aCx, idJsValue, &id); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: idAutoArray[i] = id; michael@0: } michael@0: } michael@0: michael@0: idArray = idAutoArray.forget(); michael@0: } michael@0: michael@0: nsCOMPtr dbService = michael@0: do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE); michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = michael@0: new MobileMessageCallback(request); michael@0: michael@0: rv = dbService->DeleteMessage(idArray, size, msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: request.forget(aRequest); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::GetMessages(nsIDOMMozSmsFilter* aFilter, michael@0: bool aReverse, michael@0: nsIDOMDOMCursor** aCursor) michael@0: { michael@0: nsCOMPtr dbService = michael@0: do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE); michael@0: michael@0: nsCOMPtr filter = aFilter; michael@0: if (!filter) { michael@0: filter = new SmsFilter(); michael@0: } michael@0: michael@0: nsRefPtr cursorCallback = michael@0: new MobileMessageCursorCallback(); michael@0: michael@0: nsCOMPtr continueCallback; michael@0: nsresult rv = dbService->CreateMessageCursor(filter, aReverse, cursorCallback, michael@0: getter_AddRefs(continueCallback)); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: cursorCallback->mDOMCursor = new DOMCursor(GetOwner(), continueCallback); michael@0: NS_ADDREF(*aCursor = cursorCallback->mDOMCursor); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::MarkMessageRead(int32_t aId, bool aValue, michael@0: bool aSendReadReport, michael@0: nsIDOMDOMRequest** aRequest) michael@0: { michael@0: nsCOMPtr mobileMessageDBService = michael@0: do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(mobileMessageDBService, NS_ERROR_FAILURE); michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = new MobileMessageCallback(request); michael@0: nsresult rv = mobileMessageDBService->MarkMessageRead(aId, aValue, michael@0: aSendReadReport, michael@0: msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: request.forget(aRequest); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::GetThreads(nsIDOMDOMCursor** aCursor) michael@0: { michael@0: nsCOMPtr dbService = michael@0: do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(dbService, NS_ERROR_FAILURE); michael@0: michael@0: nsRefPtr cursorCallback = michael@0: new MobileMessageCursorCallback(); michael@0: michael@0: nsCOMPtr continueCallback; michael@0: nsresult rv = dbService->CreateThreadCursor(cursorCallback, michael@0: getter_AddRefs(continueCallback)); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: cursorCallback->mDOMCursor = new DOMCursor(GetOwner(), continueCallback); michael@0: NS_ADDREF(*aCursor = cursorCallback->mDOMCursor); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::RetrieveMMS(int32_t id, michael@0: nsIDOMDOMRequest** aRequest) michael@0: { michael@0: nsCOMPtr mmsService = do_GetService(MMS_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(mmsService, NS_ERROR_FAILURE); michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = new MobileMessageCallback(request); michael@0: michael@0: nsresult rv = mmsService->Retrieve(id, msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: request.forget(aRequest); michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: MobileMessageManager::DispatchTrustedSmsEventToSelf(const char* aTopic, michael@0: const nsAString& aEventName, michael@0: nsISupports* aMsg) michael@0: { michael@0: nsCOMPtr event; michael@0: michael@0: nsCOMPtr sms = do_QueryInterface(aMsg); michael@0: if (sms) { michael@0: NS_NewDOMMozSmsEvent(getter_AddRefs(event), this, nullptr, nullptr); michael@0: NS_ASSERTION(event, "This should never fail!"); michael@0: michael@0: nsCOMPtr se = do_QueryInterface(event); michael@0: nsresult rv = se->InitMozSmsEvent(aEventName, false, false, sms); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: return DispatchTrustedEvent(event); michael@0: } michael@0: michael@0: nsCOMPtr mms = do_QueryInterface(aMsg); michael@0: if (mms) { michael@0: NS_NewDOMMozMmsEvent(getter_AddRefs(event), this, nullptr, nullptr); michael@0: NS_ASSERTION(event, "This should never fail!"); michael@0: michael@0: nsCOMPtr se = do_QueryInterface(event); michael@0: nsresult rv = se->InitMozMmsEvent(aEventName, false, false, mms); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: return DispatchTrustedEvent(event); michael@0: } michael@0: michael@0: nsAutoCString errorMsg; michael@0: errorMsg.AssignLiteral("Got a '"); michael@0: errorMsg.Append(aTopic); michael@0: errorMsg.AppendLiteral("' topic without a valid message!"); michael@0: NS_ERROR(errorMsg.get()); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::Observe(nsISupports* aSubject, const char* aTopic, michael@0: const char16_t* aData) michael@0: { michael@0: if (!strcmp(aTopic, kSmsReceivedObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, RECEIVED_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsRetrievingObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, RETRIEVING_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsSendingObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, SENDING_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsSentObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, SENT_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsFailedObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, FAILED_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsDeliverySuccessObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, DELIVERY_SUCCESS_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsDeliveryErrorObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, DELIVERY_ERROR_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsReadSuccessObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, READ_SUCCESS_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: if (!strcmp(aTopic, kSmsReadErrorObserverTopic)) { michael@0: return DispatchTrustedSmsEventToSelf(aTopic, READ_ERROR_EVENT_NAME, aSubject); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageManager::GetSmscAddress(uint32_t aServiceId, uint8_t aArgc, michael@0: nsIDOMDOMRequest** aRequest) michael@0: { michael@0: nsCOMPtr smsService = do_GetService(SMS_SERVICE_CONTRACTID); michael@0: NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); michael@0: michael@0: nsresult rv; michael@0: if (aArgc != 1) { michael@0: rv = smsService->GetSmsDefaultServiceId(&aServiceId); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: } michael@0: michael@0: nsRefPtr request = new DOMRequest(GetOwner()); michael@0: nsCOMPtr msgCallback = new MobileMessageCallback(request); michael@0: rv = smsService->GetSmscAddress(aServiceId, msgCallback); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: request.forget(aRequest); michael@0: return NS_OK; michael@0: } michael@0: michael@0: } // namespace dom michael@0: } // namespace mozilla