зеркало из https://github.com/mozilla/gecko-dev.git
Bug 969218 - Part 4: Use promise for dial and dialEmergency - dom. r=khuey
This commit is contained in:
Родитель
7bf294c150
Коммит
5984abb426
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include "Telephony.h"
|
||||
#include "mozilla/dom/TelephonyBinding.h"
|
||||
#include "mozilla/dom/Promise.h"
|
||||
|
||||
#include "nsIURI.h"
|
||||
#include "nsPIDOMWindow.h"
|
||||
|
@ -61,6 +62,44 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class Telephony::Callback : public nsITelephonyCallback
|
||||
{
|
||||
nsRefPtr<Telephony> mTelephony;
|
||||
nsRefPtr<Promise> mPromise;
|
||||
uint32_t mServiceId;
|
||||
nsString mNumber;
|
||||
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
Callback(Telephony* aTelephony, Promise* aPromise, uint32_t aServiceId,
|
||||
const nsAString& aNumber)
|
||||
: mTelephony(aTelephony), mPromise(aPromise), mServiceId(aServiceId),
|
||||
mNumber(aNumber)
|
||||
{
|
||||
MOZ_ASSERT(mTelephony);
|
||||
}
|
||||
|
||||
virtual ~Callback() {}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NotifyDialError(const nsAString& aError)
|
||||
{
|
||||
mPromise->MaybeReject(aError);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NotifyDialSuccess()
|
||||
{
|
||||
nsRefPtr<TelephonyCall> call =
|
||||
mTelephony->CreateNewDialingCall(mServiceId, mNumber);
|
||||
|
||||
mPromise->MaybeResolve(call);
|
||||
return NS_OK;
|
||||
}
|
||||
};
|
||||
|
||||
class Telephony::EnumerationAck : public nsRunnable
|
||||
{
|
||||
nsRefPtr<Telephony> mTelephony;
|
||||
|
@ -80,8 +119,7 @@ public:
|
|||
};
|
||||
|
||||
Telephony::Telephony(nsPIDOMWindow* aOwner)
|
||||
: nsDOMEventTargetHelper(aOwner),
|
||||
mActiveCall(nullptr), mEnumerated(false)
|
||||
: nsDOMEventTargetHelper(aOwner), mActiveCall(nullptr), mEnumerated(false)
|
||||
{
|
||||
if (!gTelephonyList) {
|
||||
gTelephonyList = new TelephonyList();
|
||||
|
@ -235,40 +273,37 @@ Telephony::MatchActiveCall(TelephonyCall* aCall)
|
|||
mActiveCall->ServiceId() == aCall->ServiceId());
|
||||
}
|
||||
|
||||
already_AddRefed<TelephonyCall>
|
||||
already_AddRefed<Promise>
|
||||
Telephony::DialInternal(uint32_t aServiceId, const nsAString& aNumber,
|
||||
bool aIsEmergency, ErrorResult& aRv)
|
||||
bool aIsEmergency)
|
||||
{
|
||||
if (!IsValidNumber(aNumber) || !IsValidServiceId(aServiceId)) {
|
||||
aRv.Throw(NS_ERROR_INVALID_ARG);
|
||||
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner());
|
||||
if (!global) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsRefPtr<Promise> promise = new Promise(global);
|
||||
|
||||
if (!IsValidNumber(aNumber) || !IsValidServiceId(aServiceId)) {
|
||||
promise->MaybeReject(NS_LITERAL_STRING("InvalidAccessError"));
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
// We only support one outgoing call at a time.
|
||||
if (HasDialingCall()) {
|
||||
NS_WARNING("Only permitted to dial one call at a time!");
|
||||
aRv.Throw(NS_ERROR_NOT_AVAILABLE);
|
||||
return nullptr;
|
||||
promise->MaybeReject(NS_LITERAL_STRING("InvalidStateError"));
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
nsresult rv = mProvider->Dial(aServiceId, aNumber, aIsEmergency);
|
||||
nsCOMPtr<nsITelephonyCallback> callback =
|
||||
new Callback(this, promise, aServiceId, aNumber);
|
||||
nsresult rv = mProvider->Dial(aServiceId, aNumber, aIsEmergency, callback);
|
||||
if (NS_FAILED(rv)) {
|
||||
aRv.Throw(rv);
|
||||
return nullptr;
|
||||
promise->MaybeReject(NS_LITERAL_STRING("InvalidStateError"));
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
nsRefPtr<TelephonyCall> call = CreateNewDialingCall(aServiceId, aNumber);
|
||||
|
||||
// Notify other telephony objects that we just dialed.
|
||||
for (uint32_t i = 0; i < gTelephonyList->Length(); i++) {
|
||||
Telephony*& telephony = gTelephonyList->ElementAt(i);
|
||||
if (telephony != this) {
|
||||
nsRefPtr<Telephony> kungFuDeathGrip = telephony;
|
||||
telephony->NoteDialedCallFromOtherInstance(aServiceId, aNumber);
|
||||
}
|
||||
}
|
||||
|
||||
return call.forget();
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<TelephonyCall>
|
||||
|
@ -284,14 +319,6 @@ Telephony::CreateNewDialingCall(uint32_t aServiceId, const nsAString& aNumber)
|
|||
return call.forget();
|
||||
}
|
||||
|
||||
void
|
||||
Telephony::NoteDialedCallFromOtherInstance(uint32_t aServiceId,
|
||||
const nsAString& aNumber)
|
||||
{
|
||||
// We don't need to hang on to this call object, it is held alive by mCalls.
|
||||
nsRefPtr<TelephonyCall> call = CreateNewDialingCall(aServiceId, aNumber);
|
||||
}
|
||||
|
||||
nsresult
|
||||
Telephony::NotifyCallsChanged(TelephonyCall* aCall)
|
||||
{
|
||||
|
@ -382,26 +409,25 @@ NS_IMPL_ADDREF_INHERITED(Telephony, nsDOMEventTargetHelper)
|
|||
NS_IMPL_RELEASE_INHERITED(Telephony, nsDOMEventTargetHelper)
|
||||
|
||||
NS_IMPL_ISUPPORTS1(Telephony::Listener, nsITelephonyListener)
|
||||
NS_IMPL_ISUPPORTS1(Telephony::Callback, nsITelephonyCallback)
|
||||
|
||||
// Telephony WebIDL
|
||||
|
||||
already_AddRefed<TelephonyCall>
|
||||
Telephony::Dial(const nsAString& aNumber, const Optional<uint32_t>& aServiceId,
|
||||
ErrorResult& aRv)
|
||||
already_AddRefed<Promise>
|
||||
Telephony::Dial(const nsAString& aNumber, const Optional<uint32_t>& aServiceId)
|
||||
{
|
||||
uint32_t serviceId = ProvidedOrDefaultServiceId(aServiceId);
|
||||
nsRefPtr<TelephonyCall> call = DialInternal(serviceId, aNumber, false, aRv);
|
||||
return call.forget();
|
||||
nsRefPtr<Promise> promise = DialInternal(serviceId, aNumber, false);
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<TelephonyCall>
|
||||
already_AddRefed<Promise>
|
||||
Telephony::DialEmergency(const nsAString& aNumber,
|
||||
const Optional<uint32_t>& aServiceId,
|
||||
ErrorResult& aRv)
|
||||
const Optional<uint32_t>& aServiceId)
|
||||
{
|
||||
uint32_t serviceId = ProvidedOrDefaultServiceId(aServiceId);
|
||||
nsRefPtr<TelephonyCall> call = DialInternal(serviceId, aNumber, true, aRv);
|
||||
return call.forget();
|
||||
nsRefPtr<Promise> promise = DialInternal(serviceId, aNumber, true);
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -644,7 +670,7 @@ Telephony::SupplementaryServiceNotification(uint32_t aServiceId,
|
|||
uint16_t aNotification)
|
||||
{
|
||||
nsRefPtr<TelephonyCall> associatedCall;
|
||||
if (!mCalls.IsEmpty() && aCallIndex != -1) {
|
||||
if (!mCalls.IsEmpty()) {
|
||||
associatedCall = GetCall(aServiceId, aCallIndex);
|
||||
}
|
||||
|
||||
|
@ -675,11 +701,7 @@ Telephony::NotifyError(uint32_t aServiceId,
|
|||
return NS_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
nsRefPtr<TelephonyCall> callToNotify;
|
||||
|
||||
callToNotify = (aCallIndex == -1) ? GetOutgoingCall()
|
||||
: GetCall(aServiceId, aCallIndex);
|
||||
|
||||
nsRefPtr<TelephonyCall> callToNotify = GetCall(aServiceId, aCallIndex);
|
||||
if (!callToNotify) {
|
||||
NS_ERROR("Don't call me with a bad call index!");
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define mozilla_dom_telephony_telephony_h__
|
||||
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/Promise.h"
|
||||
#include "mozilla/dom/telephony/TelephonyCommon.h"
|
||||
|
||||
#include "nsITelephonyProvider.h"
|
||||
|
@ -34,6 +35,9 @@ class Telephony MOZ_FINAL : public nsDOMEventTargetHelper
|
|||
*/
|
||||
class Listener;
|
||||
|
||||
class Callback;
|
||||
friend class Callback;
|
||||
|
||||
class EnumerationAck;
|
||||
friend class EnumerationAck;
|
||||
|
||||
|
@ -66,13 +70,11 @@ public:
|
|||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
|
||||
|
||||
// WebIDL
|
||||
already_AddRefed<TelephonyCall>
|
||||
Dial(const nsAString& aNumber, const Optional<uint32_t>& aServiceId,
|
||||
ErrorResult& aRv);
|
||||
already_AddRefed<Promise>
|
||||
Dial(const nsAString& aNumber, const Optional<uint32_t>& aServiceId);
|
||||
|
||||
already_AddRefed<TelephonyCall>
|
||||
DialEmergency(const nsAString& aNumber, const Optional<uint32_t>& aServiceId,
|
||||
ErrorResult& aRv);
|
||||
already_AddRefed<Promise>
|
||||
DialEmergency(const nsAString& aNumber, const Optional<uint32_t>& aServiceId);
|
||||
|
||||
void
|
||||
StartTone(const nsAString& aDTMFChar, const Optional<uint32_t>& aServiceId,
|
||||
|
@ -170,17 +172,12 @@ private:
|
|||
bool
|
||||
MatchActiveCall(TelephonyCall* aCall);
|
||||
|
||||
already_AddRefed<TelephonyCall>
|
||||
DialInternal(uint32_t aServiceId, const nsAString& aNumber,
|
||||
bool isEmergency, ErrorResult& aRv);
|
||||
already_AddRefed<Promise>
|
||||
DialInternal(uint32_t aServiceId, const nsAString& aNumber, bool isEmergency);
|
||||
|
||||
already_AddRefed<TelephonyCall>
|
||||
CreateNewDialingCall(uint32_t aServiceId, const nsAString& aNumber);
|
||||
|
||||
void
|
||||
NoteDialedCallFromOtherInstance(uint32_t aServiceId,
|
||||
const nsAString& aNumber);
|
||||
|
||||
nsresult
|
||||
NotifyCallsChanged(TelephonyCall* aCall);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче