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/. */
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
;
30 NS_FORWARD_SAFE_NSIVOICEMAILLISTENER(mVoicemail
)
32 Listener(Voicemail
* aVoicemail
)
33 : mVoicemail(aVoicemail
)
35 MOZ_ASSERT(mVoicemail
);
40 MOZ_ASSERT(mVoicemail
);
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
)
75 Voicemail::WrapObject(JSContext
* aCx
)
77 return MozVoicemailBinding::Wrap(aCx
, this);
81 Voicemail::IsValidServiceId(uint32_t aServiceId
) const
83 uint32_t numClients
= mozilla::Preferences::GetUint(kPrefRilNumRadioInterfaces
, 1);
85 return aServiceId
< numClients
;
89 Voicemail::PassedOrDefaultServiceId(const Optional
<uint32_t>& aServiceId
,
90 uint32_t& aResult
) const
92 if (aServiceId
.WasPassed()) {
93 if (!IsValidServiceId(aServiceId
.Value())) {
96 aResult
= aServiceId
.Value();
98 mProvider
->GetVoicemailDefaultServiceId(&aResult
);
104 // MozVoicemail WebIDL
106 already_AddRefed
<MozVoicemailStatus
>
107 Voicemail::GetStatus(const Optional
<uint32_t>& aServiceId
,
108 ErrorResult
& aRv
) const
111 aRv
.Throw(NS_ERROR_UNEXPECTED
);
116 if (!PassedOrDefaultServiceId(aServiceId
, id
)) {
117 aRv
.Throw(NS_ERROR_INVALID_ARG
);
120 JSContext
*cx
= nsContentUtils::GetCurrentJSContext();
121 JS::Rooted
<JS::Value
> status(cx
);
122 nsresult rv
= mProvider
->GetVoicemailStatus(id
, &status
);
127 if (!status
.isObject()) {
128 aRv
.Throw(NS_ERROR_UNEXPECTED
);
131 JS::Rooted
<JSObject
*> statusObj(cx
, &status
.toObject());
132 nsRefPtr
<MozVoicemailStatus
> res
= new MozVoicemailStatus(statusObj
, GetParentObject());
137 Voicemail::GetNumber(const Optional
<uint32_t>& aServiceId
, nsString
& aNumber
,
138 ErrorResult
& aRv
) const
140 aNumber
.SetIsVoid(true);
143 aRv
.Throw(NS_ERROR_UNEXPECTED
);
148 if (!PassedOrDefaultServiceId(aServiceId
, id
)) {
149 aRv
.Throw(NS_ERROR_INVALID_ARG
);
153 aRv
= mProvider
->GetVoicemailNumber(id
, aNumber
);
157 Voicemail::GetDisplayName(const Optional
<uint32_t>& aServiceId
, nsString
& aDisplayName
,
158 ErrorResult
& aRv
) const
160 aDisplayName
.SetIsVoid(true);
163 aRv
.Throw(NS_ERROR_UNEXPECTED
);
168 if (!PassedOrDefaultServiceId(aServiceId
, id
)) {
169 aRv
.Throw(NS_ERROR_INVALID_ARG
);
173 aRv
= mProvider
->GetVoicemailDisplayName(id
, aDisplayName
);
176 // nsIVoicemailListener
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
);
196 NS_NewVoicemail(nsPIDOMWindow
* aWindow
, Voicemail
** aVoicemail
)
198 nsPIDOMWindow
* innerWindow
= aWindow
->IsInnerWindow() ?
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
);