1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/voicemail/Voicemail.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,192 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "Voicemail.h" 1.11 + 1.12 +#include "mozilla/dom/MozVoicemailBinding.h" 1.13 +#include "nsIDOMMozVoicemailStatus.h" 1.14 +#include "nsIDOMMozVoicemailEvent.h" 1.15 + 1.16 +#include "mozilla/Preferences.h" 1.17 +#include "mozilla/Services.h" 1.18 +#include "nsDOMClassInfo.h" 1.19 +#include "nsServiceManagerUtils.h" 1.20 +#include "GeneratedEvents.h" 1.21 + 1.22 +#define NS_RILCONTENTHELPER_CONTRACTID "@mozilla.org/ril/content-helper;1" 1.23 +const char* kPrefRilNumRadioInterfaces = "ril.numRadioInterfaces"; 1.24 + 1.25 +using namespace mozilla::dom; 1.26 + 1.27 +class Voicemail::Listener : public nsIVoicemailListener 1.28 +{ 1.29 + Voicemail* mVoicemail; 1.30 + 1.31 +public: 1.32 + NS_DECL_ISUPPORTS 1.33 + NS_FORWARD_SAFE_NSIVOICEMAILLISTENER(mVoicemail) 1.34 + 1.35 + Listener(Voicemail* aVoicemail) 1.36 + : mVoicemail(aVoicemail) 1.37 + { 1.38 + MOZ_ASSERT(mVoicemail); 1.39 + } 1.40 + 1.41 + void Disconnect() 1.42 + { 1.43 + MOZ_ASSERT(mVoicemail); 1.44 + mVoicemail = nullptr; 1.45 + } 1.46 +}; 1.47 + 1.48 +NS_IMPL_ISUPPORTS(Voicemail::Listener, nsIVoicemailListener) 1.49 + 1.50 +Voicemail::Voicemail(nsPIDOMWindow* aWindow, 1.51 + nsIVoicemailProvider* aProvider) 1.52 + : DOMEventTargetHelper(aWindow) 1.53 + , mProvider(aProvider) 1.54 +{ 1.55 + mListener = new Listener(this); 1.56 + DebugOnly<nsresult> rv = mProvider->RegisterVoicemailMsg(mListener); 1.57 + NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), 1.58 + "Failed registering voicemail messages with provider"); 1.59 +} 1.60 + 1.61 +Voicemail::~Voicemail() 1.62 +{ 1.63 + MOZ_ASSERT(mProvider && mListener); 1.64 + 1.65 + mListener->Disconnect(); 1.66 + mProvider->UnregisterVoicemailMsg(mListener); 1.67 +} 1.68 + 1.69 +JSObject* 1.70 +Voicemail::WrapObject(JSContext* aCx) 1.71 +{ 1.72 + return MozVoicemailBinding::Wrap(aCx, this); 1.73 +} 1.74 + 1.75 +bool 1.76 +Voicemail::IsValidServiceId(uint32_t aServiceId) const 1.77 +{ 1.78 + uint32_t numClients = mozilla::Preferences::GetUint(kPrefRilNumRadioInterfaces, 1); 1.79 + 1.80 + return aServiceId < numClients; 1.81 +} 1.82 + 1.83 +bool 1.84 +Voicemail::PassedOrDefaultServiceId(const Optional<uint32_t>& aServiceId, 1.85 + uint32_t& aResult) const 1.86 +{ 1.87 + if (aServiceId.WasPassed()) { 1.88 + if (!IsValidServiceId(aServiceId.Value())) { 1.89 + return false; 1.90 + } 1.91 + aResult = aServiceId.Value(); 1.92 + } else { 1.93 + mProvider->GetVoicemailDefaultServiceId(&aResult); 1.94 + } 1.95 + 1.96 + return true; 1.97 +} 1.98 + 1.99 +// MozVoicemail WebIDL 1.100 + 1.101 +already_AddRefed<nsIDOMMozVoicemailStatus> 1.102 +Voicemail::GetStatus(const Optional<uint32_t>& aServiceId, 1.103 + ErrorResult& aRv) const 1.104 +{ 1.105 + if (!mProvider) { 1.106 + aRv.Throw(NS_ERROR_UNEXPECTED); 1.107 + return nullptr; 1.108 + } 1.109 + 1.110 + uint32_t id = 0; 1.111 + if (!PassedOrDefaultServiceId(aServiceId, id)) { 1.112 + aRv.Throw(NS_ERROR_INVALID_ARG); 1.113 + return nullptr; 1.114 + } 1.115 + nsCOMPtr<nsIDOMMozVoicemailStatus> status; 1.116 + nsresult rv = mProvider->GetVoicemailStatus(id, getter_AddRefs(status)); 1.117 + if (NS_FAILED(rv)) { 1.118 + aRv.Throw(rv); 1.119 + return nullptr; 1.120 + } 1.121 + 1.122 + return status.forget(); 1.123 +} 1.124 + 1.125 +void 1.126 +Voicemail::GetNumber(const Optional<uint32_t>& aServiceId, nsString& aNumber, 1.127 + ErrorResult& aRv) const 1.128 +{ 1.129 + aNumber.SetIsVoid(true); 1.130 + 1.131 + if (!mProvider) { 1.132 + aRv.Throw(NS_ERROR_UNEXPECTED); 1.133 + return; 1.134 + } 1.135 + 1.136 + uint32_t id = 0; 1.137 + if (!PassedOrDefaultServiceId(aServiceId, id)) { 1.138 + aRv.Throw(NS_ERROR_INVALID_ARG); 1.139 + return; 1.140 + } 1.141 + 1.142 + aRv = mProvider->GetVoicemailNumber(id, aNumber); 1.143 +} 1.144 + 1.145 +void 1.146 +Voicemail::GetDisplayName(const Optional<uint32_t>& aServiceId, nsString& aDisplayName, 1.147 + ErrorResult& aRv) const 1.148 +{ 1.149 + aDisplayName.SetIsVoid(true); 1.150 + 1.151 + if (!mProvider) { 1.152 + aRv.Throw(NS_ERROR_UNEXPECTED); 1.153 + return; 1.154 + } 1.155 + 1.156 + uint32_t id = 0; 1.157 + if (!PassedOrDefaultServiceId(aServiceId, id)) { 1.158 + aRv.Throw(NS_ERROR_INVALID_ARG); 1.159 + return; 1.160 + } 1.161 + 1.162 + aRv = mProvider->GetVoicemailDisplayName(id, aDisplayName); 1.163 +} 1.164 + 1.165 +// nsIVoicemailListener 1.166 + 1.167 +NS_IMETHODIMP 1.168 +Voicemail::NotifyStatusChanged(nsIDOMMozVoicemailStatus* aStatus) 1.169 +{ 1.170 + nsCOMPtr<nsIDOMEvent> event; 1.171 + NS_NewDOMMozVoicemailEvent(getter_AddRefs(event), this, nullptr, nullptr); 1.172 + 1.173 + nsCOMPtr<nsIDOMMozVoicemailEvent> ce = do_QueryInterface(event); 1.174 + nsresult rv = ce->InitMozVoicemailEvent(NS_LITERAL_STRING("statuschanged"), 1.175 + false, false, aStatus); 1.176 + NS_ENSURE_SUCCESS(rv, rv); 1.177 + 1.178 + return DispatchTrustedEvent(ce); 1.179 +} 1.180 + 1.181 +nsresult 1.182 +NS_NewVoicemail(nsPIDOMWindow* aWindow, Voicemail** aVoicemail) 1.183 +{ 1.184 + nsPIDOMWindow* innerWindow = aWindow->IsInnerWindow() ? 1.185 + aWindow : 1.186 + aWindow->GetCurrentInnerWindow(); 1.187 + 1.188 + nsCOMPtr<nsIVoicemailProvider> provider = 1.189 + do_GetService(NS_RILCONTENTHELPER_CONTRACTID); 1.190 + NS_ENSURE_STATE(provider); 1.191 + 1.192 + nsRefPtr<Voicemail> voicemail = new Voicemail(innerWindow, provider); 1.193 + voicemail.forget(aVoicemail); 1.194 + return NS_OK; 1.195 +}