Bumping manifests a=b2g-bump
[gecko.git] / dom / voicemail / Voicemail.cpp
blob3ec7d3b00eafa59eb7aa2c9541f2dd727a0c404a
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 "mozilla/dom/MozVoicemailEvent.h"
11 #include "mozilla/dom/MozVoicemailStatusBinding.h"
13 #include "mozilla/Preferences.h"
14 #include "mozilla/Services.h"
15 #include "nsContentUtils.h"
16 #include "nsDOMClassInfo.h"
17 #include "nsServiceManagerUtils.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 MOZ_FINAL : 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;
44 private:
45 ~Listener()
47 MOZ_ASSERT(!mVoicemail);
51 NS_IMPL_ISUPPORTS(Voicemail::Listener, nsIVoicemailListener)
53 Voicemail::Voicemail(nsPIDOMWindow* aWindow,
54 nsIVoicemailProvider* aProvider)
55 : DOMEventTargetHelper(aWindow)
56 , mProvider(aProvider)
58 mListener = new Listener(this);
59 DebugOnly<nsresult> rv = mProvider->RegisterVoicemailMsg(mListener);
60 NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
61 "Failed registering voicemail messages with provider");
64 Voicemail::~Voicemail()
66 MOZ_ASSERT(mProvider && mListener);
68 mListener->Disconnect();
69 mProvider->UnregisterVoicemailMsg(mListener);
72 NS_IMPL_ISUPPORTS_INHERITED0(Voicemail, DOMEventTargetHelper)
74 JSObject*
75 Voicemail::WrapObject(JSContext* aCx)
77 return MozVoicemailBinding::Wrap(aCx, this);
80 bool
81 Voicemail::IsValidServiceId(uint32_t aServiceId) const
83 uint32_t numClients = mozilla::Preferences::GetUint(kPrefRilNumRadioInterfaces, 1);
85 return aServiceId < numClients;
88 bool
89 Voicemail::PassedOrDefaultServiceId(const Optional<uint32_t>& aServiceId,
90 uint32_t& aResult) const
92 if (aServiceId.WasPassed()) {
93 if (!IsValidServiceId(aServiceId.Value())) {
94 return false;
96 aResult = aServiceId.Value();
97 } else {
98 mProvider->GetVoicemailDefaultServiceId(&aResult);
101 return true;
104 // MozVoicemail WebIDL
106 already_AddRefed<MozVoicemailStatus>
107 Voicemail::GetStatus(const Optional<uint32_t>& aServiceId,
108 ErrorResult& aRv) const
110 if (!mProvider) {
111 aRv.Throw(NS_ERROR_UNEXPECTED);
112 return nullptr;
115 uint32_t id = 0;
116 if (!PassedOrDefaultServiceId(aServiceId, id)) {
117 aRv.Throw(NS_ERROR_INVALID_ARG);
118 return nullptr;
120 JSContext *cx = nsContentUtils::GetCurrentJSContext();
121 JS::Rooted<JS::Value> status(cx);
122 nsresult rv = mProvider->GetVoicemailStatus(id, &status);
123 if (NS_FAILED(rv)) {
124 aRv.Throw(rv);
125 return nullptr;
127 if (!status.isObject()) {
128 aRv.Throw(NS_ERROR_UNEXPECTED);
129 return nullptr;
131 JS::Rooted<JSObject*> statusObj(cx, &status.toObject());
132 nsRefPtr<MozVoicemailStatus> res = new MozVoicemailStatus(statusObj, GetParentObject());
133 return res.forget();
136 void
137 Voicemail::GetNumber(const Optional<uint32_t>& aServiceId, nsString& aNumber,
138 ErrorResult& aRv) const
140 aNumber.SetIsVoid(true);
142 if (!mProvider) {
143 aRv.Throw(NS_ERROR_UNEXPECTED);
144 return;
147 uint32_t id = 0;
148 if (!PassedOrDefaultServiceId(aServiceId, id)) {
149 aRv.Throw(NS_ERROR_INVALID_ARG);
150 return;
153 aRv = mProvider->GetVoicemailNumber(id, aNumber);
156 void
157 Voicemail::GetDisplayName(const Optional<uint32_t>& aServiceId, nsString& aDisplayName,
158 ErrorResult& aRv) const
160 aDisplayName.SetIsVoid(true);
162 if (!mProvider) {
163 aRv.Throw(NS_ERROR_UNEXPECTED);
164 return;
167 uint32_t id = 0;
168 if (!PassedOrDefaultServiceId(aServiceId, id)) {
169 aRv.Throw(NS_ERROR_INVALID_ARG);
170 return;
173 aRv = mProvider->GetVoicemailDisplayName(id, aDisplayName);
176 // nsIVoicemailListener
178 NS_IMETHODIMP
179 Voicemail::NotifyStatusChanged(JS::HandleValue aStatus)
181 MozVoicemailEventInit init;
182 init.mBubbles = false;
183 init.mCancelable = false;
184 if (aStatus.isObject()) {
185 JSContext *cx = nsContentUtils::GetCurrentJSContext();
186 JS::Rooted<JSObject*> statusObj(cx, &aStatus.toObject());
187 init.mStatus = new MozVoicemailStatus(statusObj, GetParentObject());
190 nsRefPtr<MozVoicemailEvent> event =
191 MozVoicemailEvent::Constructor(this, NS_LITERAL_STRING("statuschanged"), init);
192 return DispatchTrustedEvent(event);
195 nsresult
196 NS_NewVoicemail(nsPIDOMWindow* aWindow, Voicemail** aVoicemail)
198 nsPIDOMWindow* innerWindow = aWindow->IsInnerWindow() ?
199 aWindow :
200 aWindow->GetCurrentInnerWindow();
202 nsCOMPtr<nsIVoicemailProvider> provider =
203 do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
204 NS_ENSURE_STATE(provider);
206 nsRefPtr<Voicemail> voicemail = new Voicemail(innerWindow, provider);
207 voicemail.forget(aVoicemail);
208 return NS_OK;