diff --git a/dom/telephony/TelephonyCall.cpp b/dom/telephony/TelephonyCall.cpp index 7c5524bd9b1..af695cdd738 100644 --- a/dom/telephony/TelephonyCall.cpp +++ b/dom/telephony/TelephonyCall.cpp @@ -43,6 +43,7 @@ #include "CallEvent.h" #include "Telephony.h" +#include "DOMError.h" USING_TELEPHONY_NAMESPACE @@ -62,6 +63,7 @@ TelephonyCall::Create(Telephony* aTelephony, const nsAString& aNumber, call->mTelephony = aTelephony; call->mNumber = aNumber; call->mCallIndex = aCallIndex; + call->mError = nsnull; call->ChangeStateInternal(aCallState, false); @@ -153,8 +155,22 @@ TelephonyCall::ChangeStateInternal(PRUint16 aCallState, bool aFireEvents) void TelephonyCall::NotifyError(const nsAString& aError) { + // Set the error string + NS_ASSERTION(!mError, "Already have an error?"); + + mError = DOMError::CreateWithName(aError); + // Do the state transitions ChangeStateInternal(nsIRadioInterfaceLayer::CALL_STATE_DISCONNECTED, true); + + // Notify the error event + nsRefPtr event = CallEvent::Create(this); + NS_ASSERTION(event, "This should never fail!"); + + if (NS_FAILED(event->Dispatch(ToIDOMEventTarget(), + NS_LITERAL_STRING("error")))) { + NS_WARNING("Failed to dispatch error event!"); + } } NS_IMPL_CYCLE_COLLECTION_CLASS(TelephonyCall) @@ -174,6 +190,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(TelephonyCall, NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(holding) NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(held) NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(resuming) + NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(error) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(TelephonyCall, @@ -190,6 +207,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(TelephonyCall, NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(holding) NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(held) NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(resuming) + NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(error) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TelephonyCall) @@ -216,6 +234,13 @@ TelephonyCall::GetState(nsAString& aState) return NS_OK; } +NS_IMETHODIMP +TelephonyCall::GetError(nsIDOMDOMError** aError) +{ + NS_IF_ADDREF(*aError = mError); + return NS_OK; +} + NS_IMETHODIMP TelephonyCall::Answer() { @@ -296,3 +321,4 @@ NS_IMPL_EVENT_HANDLER(TelephonyCall, disconnected) NS_IMPL_EVENT_HANDLER(TelephonyCall, holding) NS_IMPL_EVENT_HANDLER(TelephonyCall, held) NS_IMPL_EVENT_HANDLER(TelephonyCall, resuming) +NS_IMPL_EVENT_HANDLER(TelephonyCall, error) diff --git a/dom/telephony/TelephonyCall.h b/dom/telephony/TelephonyCall.h index 838839c04ef..7e9f288ee61 100644 --- a/dom/telephony/TelephonyCall.h +++ b/dom/telephony/TelephonyCall.h @@ -63,11 +63,13 @@ class TelephonyCall : public nsDOMEventTargetHelper, NS_DECL_EVENT_HANDLER(holding) NS_DECL_EVENT_HANDLER(held) NS_DECL_EVENT_HANDLER(resuming) + NS_DECL_EVENT_HANDLER(error) nsRefPtr mTelephony; nsString mNumber; nsString mState; + nsCOMPtr mError; PRUint32 mCallIndex; PRUint16 mCallState; diff --git a/dom/telephony/nsIDOMTelephonyCall.idl b/dom/telephony/nsIDOMTelephonyCall.idl index 3be437aed6f..8e9b9d62460 100644 --- a/dom/telephony/nsIDOMTelephonyCall.idl +++ b/dom/telephony/nsIDOMTelephonyCall.idl @@ -38,16 +38,19 @@ * ***** END LICENSE BLOCK ***** */ #include "nsIDOMEventTarget.idl" +#include "nsIDOMDOMError.idl" interface nsIDOMEventListener; -[scriptable, builtinclass, uuid(2fb9502b-2054-4eda-8db7-3726c39144f7)] +[scriptable, builtinclass, uuid(d902afb1-2e1d-412e-bfa3-cb6a9453a4db)] interface nsIDOMTelephonyCall : nsIDOMEventTarget { readonly attribute DOMString number; readonly attribute DOMString state; + readonly attribute nsIDOMDOMError error; + void answer(); void hangUp(); void hold(); @@ -65,4 +68,6 @@ interface nsIDOMTelephonyCall : nsIDOMEventTarget attribute nsIDOMEventListener onholding; attribute nsIDOMEventListener onheld; attribute nsIDOMEventListener onresuming; + + attribute nsIDOMEventListener onerror; };