Bug 969218 - Part 4: Use promise for dial and dialEmergency - dom. r=khuey

This commit is contained in:
Szu-Yu Chen [:aknow] 2014-02-27 14:12:30 +08:00
Родитель 7bf294c150
Коммит 5984abb426
2 изменённых файлов: 80 добавлений и 61 удалений

Просмотреть файл

@ -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);