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 "SmsMessage.h" michael@0: #include "SmsService.h" michael@0: #include "SmsSegmentInfo.h" michael@0: #include "mozilla/Preferences.h" michael@0: #include "nsServiceManagerUtils.h" michael@0: michael@0: namespace { michael@0: michael@0: const char* kPrefRilNumRadioInterfaces = "ril.numRadioInterfaces"; michael@0: #define kPrefDefaultServiceId "dom.sms.defaultServiceId" michael@0: const char* kObservedPrefs[] = { michael@0: kPrefDefaultServiceId, michael@0: nullptr michael@0: }; michael@0: michael@0: uint32_t michael@0: getDefaultServiceId() michael@0: { michael@0: int32_t id = mozilla::Preferences::GetInt(kPrefDefaultServiceId, 0); michael@0: int32_t numRil = mozilla::Preferences::GetInt(kPrefRilNumRadioInterfaces, 1); michael@0: michael@0: if (id >= numRil || id < 0) { michael@0: id = 0; michael@0: } michael@0: michael@0: return id; michael@0: } michael@0: michael@0: } // Anonymous namespace michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: namespace mobilemessage { michael@0: michael@0: NS_IMPL_ISUPPORTS(SmsService, michael@0: nsISmsService, michael@0: nsIObserver) michael@0: michael@0: SmsService::SmsService() michael@0: { michael@0: mRil = do_GetService("@mozilla.org/ril;1"); michael@0: NS_WARN_IF_FALSE(mRil, "This shouldn't fail!"); michael@0: michael@0: // Initialize observer. michael@0: Preferences::AddStrongObservers(this, kObservedPrefs); michael@0: mDefaultServiceId = getDefaultServiceId(); michael@0: } michael@0: michael@0: /* michael@0: * Implementation of nsIObserver. michael@0: */ michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::Observe(nsISupports* aSubject, michael@0: const char* aTopic, michael@0: const char16_t* aData) michael@0: { michael@0: if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) { michael@0: nsDependentString data(aData); michael@0: if (data.EqualsLiteral(kPrefDefaultServiceId)) { michael@0: mDefaultServiceId = getDefaultServiceId(); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: MOZ_ASSERT(false, "SmsService got unexpected topic!"); michael@0: return NS_ERROR_UNEXPECTED; michael@0: } michael@0: michael@0: /* michael@0: * Implementation of nsISmsService. michael@0: */ michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::GetSmsDefaultServiceId(uint32_t* aServiceId) michael@0: { michael@0: *aServiceId = mDefaultServiceId; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::GetSegmentInfoForText(const nsAString& aText, michael@0: nsIMobileMessageCallback* aRequest) michael@0: { michael@0: nsCOMPtr radioInterface; michael@0: if (mRil) { michael@0: mRil->GetRadioInterface(0, getter_AddRefs(radioInterface)); michael@0: } michael@0: NS_ENSURE_TRUE(radioInterface, NS_ERROR_FAILURE); michael@0: michael@0: return radioInterface->GetSegmentInfoForText(aText, aRequest); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::Send(uint32_t aServiceId, michael@0: const nsAString& aNumber, michael@0: const nsAString& aMessage, michael@0: bool aSilent, michael@0: nsIMobileMessageCallback* aRequest) michael@0: { michael@0: nsCOMPtr radioInterface; michael@0: if (mRil) { michael@0: mRil->GetRadioInterface(aServiceId, getter_AddRefs(radioInterface)); michael@0: } michael@0: NS_ENSURE_TRUE(radioInterface, NS_ERROR_FAILURE); michael@0: michael@0: return radioInterface->SendSMS(aNumber, aMessage, aSilent, aRequest); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::IsSilentNumber(const nsAString& aNumber, michael@0: bool* aIsSilent) michael@0: { michael@0: *aIsSilent = mSilentNumbers.Contains(aNumber); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::AddSilentNumber(const nsAString& aNumber) michael@0: { michael@0: if (mSilentNumbers.Contains(aNumber)) { michael@0: return NS_ERROR_UNEXPECTED; michael@0: } michael@0: michael@0: NS_ENSURE_TRUE(mSilentNumbers.AppendElement(aNumber), NS_ERROR_FAILURE); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::RemoveSilentNumber(const nsAString& aNumber) michael@0: { michael@0: if (!mSilentNumbers.Contains(aNumber)) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: NS_ENSURE_TRUE(mSilentNumbers.RemoveElement(aNumber), NS_ERROR_FAILURE); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsService::GetSmscAddress(uint32_t aServiceId, michael@0: nsIMobileMessageCallback *aRequest) michael@0: { michael@0: nsCOMPtr radioInterface; michael@0: if (mRil) { michael@0: mRil->GetRadioInterface(aServiceId, getter_AddRefs(radioInterface)); michael@0: } michael@0: NS_ENSURE_TRUE(radioInterface, NS_ERROR_FAILURE); michael@0: michael@0: return radioInterface->GetSmscAddress(aRequest); michael@0: } michael@0: michael@0: } // namespace mobilemessage michael@0: } // namespace dom michael@0: } // namespace mozilla