Backout a74bd5095902, Bug 959405 - Please update the Buri Moz-central, 1.3, 1.2 with...
[gecko.git] / dom / voicemail / Voicemail.cpp
blob2b5c3bfec878b6ffbd9c90527894f330c8b43fe0
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "Voicemail.h"
9 #include "mozilla/dom/MozVoicemailBinding.h"
10 #include "nsIDOMMozVoicemailStatus.h"
11 #include "nsIDOMMozVoicemailEvent.h"
13 #include "mozilla/Preferences.h"
14 #include "mozilla/Services.h"
15 #include "nsDOMClassInfo.h"
16 #include "nsServiceManagerUtils.h"
17 #include "GeneratedEvents.h"
19 #define NS_RILCONTENTHELPER_CONTRACTID "@mozilla.org/ril/content-helper;1"
20 const char* kPrefRilNumRadioInterfaces = "ril.numRadioInterfaces";
22 using namespace mozilla::dom;
24 class Voicemail::Listener : public nsIVoicemailListener
26 Voicemail* mVoicemail;
28 public:
29 NS_DECL_ISUPPORTS
30 NS_FORWARD_SAFE_NSIVOICEMAILLISTENER(mVoicemail)
32 Listener(Voicemail* aVoicemail)
33 : mVoicemail(aVoicemail)
35 MOZ_ASSERT(mVoicemail);
38 void Disconnect()
40 MOZ_ASSERT(mVoicemail);
41 mVoicemail = nullptr;
45 NS_IMPL_ISUPPORTS1(Voicemail::Listener, nsIVoicemailListener)
47 Voicemail::Voicemail(nsPIDOMWindow* aWindow,
48 nsIVoicemailProvider* aProvider)
49 : nsDOMEventTargetHelper(aWindow)
50 , mProvider(aProvider)
52 mListener = new Listener(this);
53 DebugOnly<nsresult> rv = mProvider->RegisterVoicemailMsg(mListener);
54 NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
55 "Failed registering voicemail messages with provider");
58 Voicemail::~Voicemail()
60 MOZ_ASSERT(mProvider && mListener);
62 mListener->Disconnect();
63 mProvider->UnregisterVoicemailMsg(mListener);
66 JSObject*
67 Voicemail::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
69 return MozVoicemailBinding::Wrap(aCx, aScope, this);
72 bool
73 Voicemail::IsValidServiceId(uint32_t aServiceId) const
75 uint32_t numClients = mozilla::Preferences::GetUint(kPrefRilNumRadioInterfaces, 1);
77 return aServiceId < numClients;
80 bool
81 Voicemail::PassedOrDefaultServiceId(const Optional<uint32_t>& aServiceId,
82 uint32_t& aResult) const
84 if (aServiceId.WasPassed()) {
85 if (!IsValidServiceId(aServiceId.Value())) {
86 return false;
88 aResult = aServiceId.Value();
89 } else {
90 mProvider->GetVoicemailDefaultServiceId(&aResult);
93 return true;
96 // MozVoicemail WebIDL
98 already_AddRefed<nsIDOMMozVoicemailStatus>
99 Voicemail::GetStatus(const Optional<uint32_t>& aServiceId,
100 ErrorResult& aRv) const
102 if (!mProvider) {
103 aRv.Throw(NS_ERROR_UNEXPECTED);
104 return nullptr;
107 uint32_t id = 0;
108 if (!PassedOrDefaultServiceId(aServiceId, id)) {
109 aRv.Throw(NS_ERROR_INVALID_ARG);
110 return nullptr;
112 nsCOMPtr<nsIDOMMozVoicemailStatus> status;
113 nsresult rv = mProvider->GetVoicemailStatus(id, getter_AddRefs(status));
114 if (NS_FAILED(rv)) {
115 aRv.Throw(rv);
116 return nullptr;
119 return status.forget();
122 void
123 Voicemail::GetNumber(const Optional<uint32_t>& aServiceId, nsString& aNumber,
124 ErrorResult& aRv) const
126 aNumber.SetIsVoid(true);
128 if (!mProvider) {
129 aRv.Throw(NS_ERROR_UNEXPECTED);
130 return;
133 uint32_t id = 0;
134 if (!PassedOrDefaultServiceId(aServiceId, id)) {
135 aRv.Throw(NS_ERROR_INVALID_ARG);
136 return;
139 aRv = mProvider->GetVoicemailNumber(id, aNumber);
142 void
143 Voicemail::GetDisplayName(const Optional<uint32_t>& aServiceId, nsString& aDisplayName,
144 ErrorResult& aRv) const
146 aDisplayName.SetIsVoid(true);
148 if (!mProvider) {
149 aRv.Throw(NS_ERROR_UNEXPECTED);
150 return;
153 uint32_t id = 0;
154 if (!PassedOrDefaultServiceId(aServiceId, id)) {
155 aRv.Throw(NS_ERROR_INVALID_ARG);
156 return;
159 aRv = mProvider->GetVoicemailDisplayName(id, aDisplayName);
162 // nsIVoicemailListener
164 NS_IMETHODIMP
165 Voicemail::NotifyStatusChanged(nsIDOMMozVoicemailStatus* aStatus)
167 nsCOMPtr<nsIDOMEvent> event;
168 NS_NewDOMMozVoicemailEvent(getter_AddRefs(event), this, nullptr, nullptr);
170 nsCOMPtr<nsIDOMMozVoicemailEvent> ce = do_QueryInterface(event);
171 nsresult rv = ce->InitMozVoicemailEvent(NS_LITERAL_STRING("statuschanged"),
172 false, false, aStatus);
173 NS_ENSURE_SUCCESS(rv, rv);
175 return DispatchTrustedEvent(ce);
178 nsresult
179 NS_NewVoicemail(nsPIDOMWindow* aWindow, Voicemail** aVoicemail)
181 nsPIDOMWindow* innerWindow = aWindow->IsInnerWindow() ?
182 aWindow :
183 aWindow->GetCurrentInnerWindow();
185 nsCOMPtr<nsIVoicemailProvider> provider =
186 do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
187 NS_ENSURE_STATE(provider);
189 nsRefPtr<Voicemail> voicemail = new Voicemail(innerWindow, provider);
190 voicemail.forget(aVoicemail);
191 return NS_OK;