Merge b2g-inbound to m-c a=merge CLOSED TREE

This commit is contained in:
Wes Kocher 2014-10-10 18:41:41 -07:00
Родитель 38e0dea1d6 0fdb9857c4
Коммит a026920874
32 изменённых файлов: 1014 добавлений и 826 удалений

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="3a2947df41a480de1457a6dcdbf46ad0af70d8e0">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

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

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>

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

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="3a2947df41a480de1457a6dcdbf46ad0af70d8e0">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

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

@ -19,7 +19,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>

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

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="3a2947df41a480de1457a6dcdbf46ad0af70d8e0">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

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

@ -17,7 +17,7 @@
</project>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>

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

@ -4,6 +4,6 @@
"remote": "",
"branch": ""
},
"revision": "eeeae73691f91cd5042660b0f19c84747ebc7be2",
"revision": "a10638edfc562e970fa6062c06edffd581c6f057",
"repo_path": "/integration/gaia-central"
}

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

@ -17,7 +17,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

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

@ -15,7 +15,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

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

@ -17,7 +17,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>

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

@ -17,7 +17,7 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="cc5da7b055e2b06fdeb46fa94970550392ee571d"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="95f580a1522ffd0f09302372b78200dab9b6f322"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="cc1f362ce43dce92ac786187ff4abf39060094bd"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

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

@ -0,0 +1,72 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/mobileconnection/MobileCallForwardingOptions.h"
namespace mozilla {
namespace dom {
namespace mobileconnection {
NS_IMPL_ISUPPORTS(MobileCallForwardingOptions, nsIMobileCallForwardingOptions)
MobileCallForwardingOptions::MobileCallForwardingOptions(bool aActive,
int16_t aAction,
int16_t aReason,
const nsAString& aNumber,
int16_t aTimeSeconds,
int16_t aServiceClass)
: mActive(aActive)
, mAction(aAction)
, mReason(aReason)
, mNumber(aNumber)
, mTimeSeconds(aTimeSeconds)
, mServiceClass(aServiceClass)
{
}
NS_IMETHODIMP
MobileCallForwardingOptions::GetActive(bool* aActive)
{
*aActive = mActive;
return NS_OK;
}
NS_IMETHODIMP
MobileCallForwardingOptions::GetAction(int16_t* aAction)
{
*aAction = mAction;
return NS_OK;
}
NS_IMETHODIMP
MobileCallForwardingOptions::GetReason(int16_t* aReason)
{
*aReason = mReason;
return NS_OK;
}
NS_IMETHODIMP
MobileCallForwardingOptions::GetNumber(nsAString& aNumber)
{
aNumber = mNumber;
return NS_OK;
}
NS_IMETHODIMP
MobileCallForwardingOptions::GetTimeSeconds(int16_t* aTimeSeconds)
{
*aTimeSeconds = mTimeSeconds;
return NS_OK;
}
NS_IMETHODIMP
MobileCallForwardingOptions::GetServiceClass(int16_t *aServiceClass)
{
*aServiceClass = mServiceClass;
return NS_OK;
}
} // namespace mobileconnection
} // namespace dom
} // namespace mozilla

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

@ -0,0 +1,44 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_MobileCallForwardingOptions_h
#define mozilla_dom_MobileCallForwardingOptions_h
#include "nsIMobileCallForwardingOptions.h"
#include "nsString.h"
#include "mozilla/Attributes.h"
namespace mozilla {
namespace dom {
namespace mobileconnection {
class MobileCallForwardingOptions MOZ_FINAL : public nsIMobileCallForwardingOptions
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIMOBILECALLFORWARDINGOPTIONS
MobileCallForwardingOptions(bool aActive, int16_t aAction,
int16_t aReason, const nsAString& aNumber,
int16_t aTimeSeconds, int16_t aServiceClass);
private:
// Don't try to use the default constructor.
MobileCallForwardingOptions() {}
~MobileCallForwardingOptions() {}
bool mActive;
int16_t mAction;
int16_t mReason;
nsString mNumber;
int16_t mTimeSeconds;
int16_t mServiceClass;
};
} // namespace mobileconnection
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_MobileCallForwardingOptions_h

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

@ -21,6 +21,9 @@
#include "nsJSUtils.h"
#include "nsServiceManagerUtils.h"
#define MOBILECONN_ERROR_INVALID_PARAMETER NS_LITERAL_STRING("InvalidParameter")
#define MOBILECONN_ERROR_INVALID_PASSWORD NS_LITERAL_STRING("InvalidPassword")
#ifdef CONVERT_STRING_TO_NULLABLE_ENUM
#undef CONVERT_STRING_TO_NULLABLE_ENUM
#endif
@ -206,6 +209,84 @@ MobileConnection::UpdateData()
mData->Update(info);
}
nsresult
MobileConnection::NotifyError(nsIDOMDOMRequest* aRequest, const nsAString& aMessage)
{
nsCOMPtr<nsIDOMRequestService> rs = do_GetService(DOMREQUEST_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(rs, NS_ERROR_FAILURE);
return rs->FireErrorAsync(aRequest, aMessage);
}
bool
MobileConnection::IsValidPassword(const nsAString& aPassword)
{
// Check valid PIN for supplementary services. See TS.22.004 clause 5.2.
if (aPassword.IsEmpty() || aPassword.Length() != 4) {
return false;
}
nsresult rv;
int32_t password = nsString(aPassword).ToInteger(&rv);
return NS_SUCCEEDED(rv) && password >= 0 && password <= 9999;
}
bool
MobileConnection::IsValidCallForwardingReason(int32_t aReason)
{
return aReason >= nsIMobileConnection::CALL_FORWARD_REASON_UNCONDITIONAL &&
aReason <= nsIMobileConnection::CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING;
}
bool
MobileConnection::IsValidCallForwardingAction(int32_t aAction)
{
return aAction >= nsIMobileConnection::CALL_FORWARD_ACTION_DISABLE &&
aAction <= nsIMobileConnection::CALL_FORWARD_ACTION_ERASURE &&
// Set operation doesn't allow "query" action.
aAction != nsIMobileConnection::CALL_FORWARD_ACTION_QUERY_STATUS;
}
bool
MobileConnection::IsValidCallBarringProgram(int32_t aProgram)
{
return aProgram >= nsIMobileConnection::CALL_BARRING_PROGRAM_ALL_OUTGOING &&
aProgram <= nsIMobileConnection::CALL_BARRING_PROGRAM_INCOMING_ROAMING;
}
bool
MobileConnection::IsValidCallBarringOptions(const MozCallBarringOptions& aOptions,
bool isSetting)
{
if (!aOptions.mServiceClass.WasPassed() || aOptions.mServiceClass.Value().IsNull() ||
!aOptions.mProgram.WasPassed() || aOptions.mProgram.Value().IsNull() ||
!IsValidCallBarringProgram(aOptions.mProgram.Value().Value())) {
return false;
}
// For setting callbarring options, |enabled| and |password| are required.
if (isSetting &&
(!aOptions.mEnabled.WasPassed() || aOptions.mEnabled.Value().IsNull() ||
!aOptions.mPassword.WasPassed() || aOptions.mPassword.Value().IsVoid())) {
return false;
}
return true;
}
bool
MobileConnection::IsValidCallForwardingOptions(const MozCallForwardingOptions& aOptions)
{
if (!aOptions.mReason.WasPassed() || aOptions.mReason.Value().IsNull() ||
!aOptions.mAction.WasPassed() || aOptions.mAction.Value().IsNull() ||
!IsValidCallForwardingReason(aOptions.mReason.Value().Value()) ||
!IsValidCallForwardingAction(aOptions.mAction.Value().Value())) {
return false;
}
return true;
}
// WebIDL interface
void
@ -568,6 +649,16 @@ MobileConnection::GetCallForwardingOption(uint16_t aReason, ErrorResult& aRv)
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
if (!IsValidCallForwardingReason(aReason)) {
nsresult rv = NotifyError(request, MOBILECONN_ERROR_INVALID_PARAMETER);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
}
nsRefPtr<MobileConnectionCallback> requestCallback =
new MobileConnectionCallback(GetOwner(), request);
@ -589,24 +680,42 @@ MobileConnection::SetCallForwardingOption(const MozCallForwardingOptions& aOptio
return nullptr;
}
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(GetOwner()))) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
JSContext *cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aOptions, &options)) {
aRv.Throw(NS_ERROR_TYPE_ERR);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
if (!IsValidCallForwardingOptions(aOptions)) {
nsresult rv = NotifyError(request, MOBILECONN_ERROR_INVALID_PARAMETER);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
}
// Fill in optional attributes.
uint16_t timeSeconds = 0;
if (aOptions.mTimeSeconds.WasPassed() && !aOptions.mTimeSeconds.Value().IsNull()) {
timeSeconds = aOptions.mTimeSeconds.Value().Value();
}
uint16_t serviceClass = nsIMobileConnection::ICC_SERVICE_CLASS_NONE;
if (aOptions.mServiceClass.WasPassed() && !aOptions.mServiceClass.Value().IsNull()) {
serviceClass = aOptions.mServiceClass.Value().Value();
}
nsAutoString number;
if (aOptions.mNumber.WasPassed()) {
number = aOptions.mNumber.Value();
} else {
number.SetIsVoid(true);
}
nsRefPtr<MobileConnectionCallback> requestCallback =
new MobileConnectionCallback(GetOwner(), request);
nsresult rv = mMobileConnection->SetCallForwarding(options, requestCallback);
nsresult rv = mMobileConnection->SetCallForwarding(aOptions.mAction.Value().Value(),
aOptions.mReason.Value().Value(),
number,
timeSeconds,
serviceClass,
requestCallback);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
@ -624,24 +733,32 @@ MobileConnection::GetCallBarringOption(const MozCallBarringOptions& aOptions,
return nullptr;
}
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(GetOwner()))) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
JSContext *cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aOptions, &options)) {
aRv.Throw(NS_ERROR_TYPE_ERR);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
if (!IsValidCallBarringOptions(aOptions, false)) {
nsresult rv = NotifyError(request, MOBILECONN_ERROR_INVALID_PARAMETER);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
}
// Fill in optional attributes.
nsAutoString password;
if (aOptions.mPassword.WasPassed()) {
password = aOptions.mPassword.Value();
} else {
password.SetIsVoid(true);
}
nsRefPtr<MobileConnectionCallback> requestCallback =
new MobileConnectionCallback(GetOwner(), request);
nsresult rv = mMobileConnection->GetCallBarring(options, requestCallback);
nsresult rv = mMobileConnection->GetCallBarring(aOptions.mProgram.Value().Value(),
password,
aOptions.mServiceClass.Value().Value(),
requestCallback);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
@ -659,24 +776,25 @@ MobileConnection::SetCallBarringOption(const MozCallBarringOptions& aOptions,
return nullptr;
}
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(GetOwner()))) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
JSContext *cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aOptions, &options)) {
aRv.Throw(NS_ERROR_TYPE_ERR);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
if (!IsValidCallBarringOptions(aOptions, true)) {
nsresult rv = NotifyError(request, MOBILECONN_ERROR_INVALID_PARAMETER);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
}
nsRefPtr<MobileConnectionCallback> requestCallback =
new MobileConnectionCallback(GetOwner(), request);
nsresult rv = mMobileConnection->SetCallBarring(options, requestCallback);
nsresult rv = mMobileConnection->SetCallBarring(aOptions.mProgram.Value().Value(),
aOptions.mEnabled.Value().Value(),
aOptions.mPassword.Value(),
aOptions.mServiceClass.Value().Value(),
requestCallback);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
@ -694,25 +812,27 @@ MobileConnection::ChangeCallBarringPassword(const MozCallBarringOptions& aOption
return nullptr;
}
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(GetOwner()))) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
JSContext *cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aOptions, &options)) {
aRv.Throw(NS_ERROR_TYPE_ERR);
return nullptr;
}
nsRefPtr<DOMRequest> request = new DOMRequest(GetOwner());
if (!aOptions.mPin.WasPassed() || aOptions.mPin.Value().IsVoid() ||
!aOptions.mNewPin.WasPassed() || aOptions.mNewPin.Value().IsVoid() ||
!IsValidPassword(aOptions.mPin.Value()) ||
!IsValidPassword(aOptions.mNewPin.Value())) {
nsresult rv = NotifyError(request, MOBILECONN_ERROR_INVALID_PASSWORD);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;
}
return request.forget();
}
nsRefPtr<MobileConnectionCallback> requestCallback =
new MobileConnectionCallback(GetOwner(), request);
nsresult rv =
mMobileConnection->ChangeCallBarringPassword(options, requestCallback);
mMobileConnection->ChangeCallBarringPassword(aOptions.mPin.Value(),
aOptions.mNewPin.Value(),
requestCallback);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return nullptr;

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

@ -176,6 +176,27 @@ private:
void
UpdateData();
nsresult
NotifyError(nsIDOMDOMRequest* aRequest, const nsAString& aMessage);
bool
IsValidPassword(const nsAString& aPassword);
bool
IsValidCallBarringOptions(const MozCallBarringOptions& aOptions, bool isSetting);
bool
IsValidCallForwardingOptions(const MozCallForwardingOptions& aOptions);
bool
IsValidCallForwardingReason(int32_t aReason);
bool
IsValidCallForwardingAction(int32_t aAction);
bool
IsValidCallBarringProgram(int32_t aProgram);
};
} // namespace dom

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

@ -27,94 +27,6 @@ MobileConnectionCallback::MobileConnectionCallback(nsPIDOMWindow* aWindow,
/**
* Notify Success for Send/CancelMmi.
*/
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage)
{
MozMMIResult result;
result.mServiceCode.Assign(aServiceCode);
result.mStatusMessage.Assign(aStatusMessage);
return NotifySendCancelMmiSuccess(result);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
JS::Handle<JS::Value> aAdditionalInformation)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
RootedDictionary<MozMMIResult> result(cx);
result.mServiceCode.Assign(aServiceCode);
result.mStatusMessage.Assign(aStatusMessage);
result.mAdditionalInformation.Construct().SetAsObject() = &aAdditionalInformation.toObject();
return NotifySendCancelMmiSuccess(result);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint16_t aAdditionalInformation)
{
MozMMIResult result;
result.mServiceCode.Assign(aServiceCode);
result.mStatusMessage.Assign(aStatusMessage);
result.mAdditionalInformation.Construct().SetAsUnsignedShort() = aAdditionalInformation;
return NotifySendCancelMmiSuccess(result);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
const nsTArray<nsString>& aAdditionalInformation)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> additionalInformation(cx);
if (!ToJSValue(cx, aAdditionalInformation, &additionalInformation)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
return NotifySendCancelMmiSuccess(aServiceCode, aStatusMessage,
additionalInformation);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
const nsTArray<IPC::MozCallForwardingOptions>& aAdditionalInformation)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> additionalInformation(cx);
if (!ToJSValue(cx, aAdditionalInformation, &additionalInformation)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
return NotifySendCancelMmiSuccess(aServiceCode, aStatusMessage,
additionalInformation);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccess(const MozMMIResult& aResult)
{
@ -134,28 +46,6 @@ MobileConnectionCallback::NotifySendCancelMmiSuccess(const MozMMIResult& aResult
return NotifySuccess(jsResult);
}
/**
* Notify Success for GetCallForwarding.
*/
nsresult
MobileConnectionCallback::NotifyGetCallForwardingSuccess(const nsTArray<IPC::MozCallForwardingOptions>& aResults)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> jsResult(cx);
if (!ToJSValue(cx, aResults, &jsResult)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
return NotifySuccess(jsResult);
}
/**
* Notify Success.
*/
@ -230,18 +120,186 @@ MobileConnectionCallback::NotifyGetNetworksSuccess(uint32_t aCount,
return NotifySuccess(jsResult);
}
NS_IMETHODIMP
MobileConnectionCallback::NotifySendCancelMmiSuccess(JS::Handle<JS::Value> aResult,
JSContext* aCx)
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage)
{
return NotifySuccess(aResult);
MozMMIResult result;
result.mServiceCode.Assign(aServiceCode);
result.mStatusMessage.Assign(aStatusMessage);
return NotifySendCancelMmiSuccess(result);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccessWithInteger(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint16_t aAdditionalInformation)
{
MozMMIResult result;
result.mServiceCode.Assign(aServiceCode);
result.mStatusMessage.Assign(aStatusMessage);
result.mAdditionalInformation.Construct().SetAsUnsignedShort() = aAdditionalInformation;
return NotifySendCancelMmiSuccess(result);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccessWithStrings(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint32_t aCount,
const char16_t** aAdditionalInformation)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
RootedDictionary<MozMMIResult> result(cx);
result.mServiceCode.Assign(aServiceCode);
result.mStatusMessage.Assign(aStatusMessage);
nsTArray<nsString> additionalInformation;
for (uint32_t i = 0; i < aCount; i++) {
additionalInformation.AppendElement(nsDependentString(aAdditionalInformation[i]));
}
JS::Rooted<JS::Value> jsAdditionalInformation(cx);
if (!ToJSValue(cx, additionalInformation, &jsAdditionalInformation)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
result.mAdditionalInformation.Construct().SetAsObject() =
&jsAdditionalInformation.toObject();
return NotifySendCancelMmiSuccess(result);
}
nsresult
MobileConnectionCallback::NotifySendCancelMmiSuccessWithCallForwardingOptions(
const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint32_t aCount,
nsIMobileCallForwardingOptions** aResults)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
RootedDictionary<MozMMIResult> result(cx);
result.mServiceCode.Assign(aServiceCode);
result.mStatusMessage.Assign(aStatusMessage);
nsTArray<MozCallForwardingOptions> additionalInformation;
for (uint32_t i = 0; i < aCount; i++)
{
MozCallForwardingOptions options;
int16_t pShort;
nsString pString;
bool pBool;
aResults[i]->GetActive(&pBool);
options.mActive.Construct(pBool);
aResults[i]->GetAction(&pShort);
if (pShort != nsIMobileConnection::CALL_FORWARD_ACTION_UNKNOWN) {
options.mAction.Construct(pShort);
}
aResults[i]->GetReason(&pShort);
if (pShort != nsIMobileConnection::CALL_FORWARD_REASON_UNKNOWN) {
options.mReason.Construct(pShort);
}
aResults[i]->GetNumber(pString);
options.mNumber.Construct(pString.get());
aResults[i]->GetTimeSeconds(&pShort);
if (pShort >= 0) {
options.mTimeSeconds.Construct(pShort);
}
aResults[i]->GetServiceClass(&pShort);
if (pShort != nsIMobileConnection::ICC_SERVICE_CLASS_NONE) {
options.mServiceClass.Construct(pShort);
}
additionalInformation.AppendElement(options);
}
JS::Rooted<JS::Value> jsAdditionalInformation(cx);
if (!ToJSValue(cx, additionalInformation, &jsAdditionalInformation)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
result.mAdditionalInformation.Construct().SetAsObject() =
&jsAdditionalInformation.toObject();
return NotifySendCancelMmiSuccess(result);
}
NS_IMETHODIMP
MobileConnectionCallback::NotifyGetCallForwardingSuccess(JS::Handle<JS::Value> aResults,
JSContext* aCx)
MobileConnectionCallback::NotifyGetCallForwardingSuccess(uint32_t aCount,
nsIMobileCallForwardingOptions** aResults)
{
return NotifySuccess(aResults);
nsTArray<MozCallForwardingOptions> results;
for (uint32_t i = 0; i < aCount; i++)
{
MozCallForwardingOptions result;
int16_t pShort;
nsString pString;
bool pBool;
aResults[i]->GetActive(&pBool);
result.mActive.Construct(pBool);
aResults[i]->GetAction(&pShort);
if (pShort != nsIMobileConnection::CALL_FORWARD_ACTION_UNKNOWN) {
result.mAction.Construct(pShort);
}
aResults[i]->GetReason(&pShort);
if (pShort != nsIMobileConnection::CALL_FORWARD_REASON_UNKNOWN) {
result.mReason.Construct(pShort);
}
aResults[i]->GetNumber(pString);
result.mNumber.Construct(pString.get());
aResults[i]->GetTimeSeconds(&pShort);
if (pShort >= 0) {
result.mTimeSeconds.Construct(pShort);
}
aResults[i]->GetServiceClass(&pShort);
if (pShort != nsIMobileConnection::ICC_SERVICE_CLASS_NONE) {
result.mServiceClass.Construct(pShort);
}
results.AppendElement(result);
}
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(mWindow))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> jsResult(cx);
if (!ToJSValue(cx, results, &jsResult)) {
JS_ClearPendingException(cx);
return NS_ERROR_TYPE_ERR;
}
return NotifySuccess(jsResult);
}
NS_IMETHODIMP

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

@ -32,43 +32,15 @@ public:
MobileConnectionCallback(nsPIDOMWindow* aWindow, DOMRequest* aRequest);
/**
* Notify Success for Send/CancelMmi.
*/
nsresult
NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage);
nsresult
NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
JS::Handle<JS::Value> aAdditionalInformation);
nsresult
NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint16_t aAdditionalInformation);
nsresult
NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
const nsTArray<nsString>& aAdditionalInformation);
nsresult
NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
const nsTArray<IPC::MozCallForwardingOptions>& aAdditionalInformation);
nsresult
NotifySendCancelMmiSuccess(const MozMMIResult& aResult);
/**
* Notify Success for GetCallForwarding.
*/
nsresult
NotifyGetCallForwardingSuccess(const nsTArray<IPC::MozCallForwardingOptions>& aResults);
private:
~MobileConnectionCallback() {}
nsresult
NotifySuccess(JS::Handle<JS::Value> aResult);
nsresult
NotifySendCancelMmiSuccess(const MozMMIResult& aResult);
nsCOMPtr<nsPIDOMWindow> mWindow;
nsRefPtr<DOMRequest> mRequest;
};

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

@ -25,6 +25,8 @@ const MOBILENETWORKINFO_CID =
Components.ID("{a6c8416c-09b4-46d1-bf29-6520d677d085}");
const MOBILECELLINFO_CID =
Components.ID("{0635d9ab-997e-4cdf-84e7-c1883752dff3}");
const MOBILECALLFORWARDINGOPTIONS_CID =
Components.ID("{e0cf4463-ee63-4b05-ab2e-d94bf764836c}");
const TELEPHONYCALLBACK_CID =
Components.ID("{6e1af17e-37f3-11e4-aed3-60a44c237d2b}");
@ -112,33 +114,29 @@ MobileConnectionInfo.prototype = {
relSignalStrength: null
};
function CallForwardingOptions(aOptions) {
this.active = aOptions.active;
this.action = aOptions.action;
this.reason = aOptions.reason;
this.number = aOptions.number;
this.timeSeconds = aOptions.timeSeconds;
this.serviceClass = aOptions.serviceClass;
function MobileCallForwardingOptions(aOptions) {
for (let key in aOptions) {
this[key] = aOptions[key];
}
}
CallForwardingOptions.prototype = {
__exposedProps__ : {active: 'r',
action: 'r',
reason: 'r',
number: 'r',
timeSeconds: 'r',
serviceClass: 'r'},
};
MobileCallForwardingOptions.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIMobileCallForwardingOptions]),
classID: MOBILECALLFORWARDINGOPTIONS_CID,
classInfo: XPCOMUtils.generateCI({
classID: MOBILECALLFORWARDINGOPTIONS_CID,
classDescription: "MobileCallForwardingOptions",
interfaces: [Ci.nsIMobileCallForwardingOptions]
}),
function MMIResult(aOptions) {
this.serviceCode = aOptions.serviceCode;
this.statusMessage = aOptions.statusMessage;
this.additionalInformation = aOptions.additionalInformation;
// nsIMobileForwardingOptions
active: false,
action: Ci.nsIMobileConnection.CALL_FORWARD_ACTION_UNKNOWN,
reason: Ci.nsIMobileConnection.CALL_FORWARD_REASON_UNKNOWN,
number: null,
timeSeconds: -1,
serviceClass: Ci.nsIMobileConnection.ICC_SERVICE_CLASS_NONE
}
MMIResult.prototype = {
__exposedProps__ : {serviceCode: 'r',
statusMessage: 'r',
additionalInformation: 'r'},
};
/**
* Wrap a MobileConnectionCallback to a TelephonyCallback.
@ -150,12 +148,47 @@ TelephonyCallback.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsITelephonyCallback]),
classID: TELEPHONYCALLBACK_CID,
_notifySendCancelMmiSuccess: function(aResult) {
// No additional information.
if (aResult.additionalInformation === undefined) {
this.callback.notifySendCancelMmiSuccess(aResult.serviceCode,
aResult.statusMessage);
return;
}
// Additional information is an integer.
if (!isNaN(parseInt(aResult.additionalInformation, 10))) {
this.callback.notifySendCancelMmiSuccessWithInteger(
aResult.serviceCode, aResult.statusMessage, aResult.additionalInformation);
return;
}
// Additional information should be an array.
let array = aResult.additionalInformation;
if (Array.isArray(array) && array.length > 0) {
let item = array[0];
if (typeof item === "string" || item instanceof String) {
this.callback.notifySendCancelMmiSuccessWithStrings(
aResult.serviceCode, aResult.statusMessage,
aResult.additionalInformation.length, aResult.additionalInformation);
return;
}
this.callback.notifySendCancelMmiSuccessWithCallForwardingOptions(
aResult.serviceCode, aResult.statusMessage,
aResult.additionalInformation.length, aResult.additionalInformation);
return;
}
throw Cr.NS_ERROR_UNEXPECTED;
},
notifyDialMMI: function(mmiServiceCode) {
this.serviceCode = mmiServiceCode;
},
notifyDialMMISuccess: function(result) {
this.callback.notifySendCancelMmiSuccess(result);
this._notifySendCancelMmiSuccess(result);
},
notifyDialMMIError: function(error) {
@ -255,72 +288,6 @@ MobileConnectionProvider.prototype = {
return supportedNetworkTypes;
},
/**
* Helper for guarding us against invalid reason values for call forwarding.
*/
_isValidCallForwardingReason: function(aReason) {
switch (aReason) {
case Ci.nsIMobileConnection.CALL_FORWARD_REASON_UNCONDITIONAL:
case Ci.nsIMobileConnection.CALL_FORWARD_REASON_MOBILE_BUSY:
case Ci.nsIMobileConnection.CALL_FORWARD_REASON_NO_REPLY:
case Ci.nsIMobileConnection.CALL_FORWARD_REASON_NOT_REACHABLE:
case Ci.nsIMobileConnection.CALL_FORWARD_REASON_ALL_CALL_FORWARDING:
case Ci.nsIMobileConnection.CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING:
return true;
default:
return false;
}
},
/**
* Helper for guarding us against invalid action values for call forwarding.
*/
_isValidCallForwardingAction: function(aAction) {
switch (aAction) {
case Ci.nsIMobileConnection.CALL_FORWARD_ACTION_DISABLE:
case Ci.nsIMobileConnection.CALL_FORWARD_ACTION_ENABLE:
case Ci.nsIMobileConnection.CALL_FORWARD_ACTION_REGISTRATION:
case Ci.nsIMobileConnection.CALL_FORWARD_ACTION_ERASURE:
return true;
default:
return false;
}
},
/**
* Helper for guarding us against invalid program values for call barring.
*/
_isValidCallBarringProgram: function(aProgram) {
switch (aProgram) {
case Ci.nsIMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING:
case Ci.nsIMobileConnection.CALL_BARRING_PROGRAM_OUTGOING_INTERNATIONAL:
case Ci.nsIMobileConnection.CALL_BARRING_PROGRAM_OUTGOING_INTERNATIONAL_EXCEPT_HOME:
case Ci.nsIMobileConnection.CALL_BARRING_PROGRAM_ALL_INCOMING:
case Ci.nsIMobileConnection.CALL_BARRING_PROGRAM_INCOMING_ROAMING:
return true;
default:
return false;
}
},
/**
* Helper for guarding us against invalid options for call barring.
*/
_isValidCallBarringOptions: function(aOptions, aUsedForSetting) {
if (!aOptions || aOptions.serviceClass == null ||
!this._isValidCallBarringProgram(aOptions.program)) {
return false;
}
// For setting callbarring options, |enabled| and |password| are required.
if (aUsedForSetting &&
(aOptions.enabled == null || aOptions.password == null)) {
return false;
}
return true;
},
/**
* Helper for guarding us against invalid mode for clir.
*/
@ -423,7 +390,7 @@ MobileConnectionProvider.prototype = {
},
_rulesToCallForwardingOptions: function(aRules) {
return aRules.map(rule => new CallForwardingOptions(rule));
return aRules.map(rule => new MobileCallForwardingOptions(rule));
},
_dispatchNotifyError: function(aCallback, aErrorMsg) {
@ -742,20 +709,13 @@ MobileConnectionProvider.prototype = {
}).bind(this));
},
setCallForwarding: function(aOptions, aCallback) {
if (!aOptions ||
!this._isValidCallForwardingReason(aOptions.reason) ||
!this._isValidCallForwardingAction(aOptions.action)){
this._dispatchNotifyError(aCallback, RIL.GECKO_ERROR_INVALID_PARAMETER);
return;
}
setCallForwarding: function(aAction, aReason, aNumber, aTimeSeconds,
aServiceClass, aCallback) {
let options = {
active: aOptions.active,
action: aOptions.action,
reason: aOptions.reason,
number: aOptions.number,
timeSeconds: aOptions.timeSeconds,
action: aAction,
reason: aReason,
number: aNumber,
timeSeconds: aTimeSeconds,
serviceClass: RIL.ICC_SERVICE_CLASS_VOICE
};
@ -775,11 +735,6 @@ MobileConnectionProvider.prototype = {
},
getCallForwarding: function(aReason, aCallback) {
if (!this._isValidCallForwardingReason(aReason)){
this._dispatchNotifyError(aCallback, RIL.GECKO_ERROR_INVALID_PARAMETER);
return;
}
this._radioInterface.sendWorkerMessage("queryCallForwardStatus",
{reason: aReason},
(function(aResponse) {
@ -788,23 +743,19 @@ MobileConnectionProvider.prototype = {
return false;
}
aCallback.notifyGetCallForwardingSuccess(
this._rulesToCallForwardingOptions(aResponse.rules));
let infos = this._rulesToCallForwardingOptions(aResponse.rules);
aCallback.notifyGetCallForwardingSuccess(infos.length, infos);
return false;
}).bind(this));
},
setCallBarring: function(aOptions, aCallback) {
if (!this._isValidCallBarringOptions(aOptions, true)) {
this._dispatchNotifyError(aCallback, RIL.GECKO_ERROR_INVALID_PARAMETER);
return;
}
setCallBarring: function(aProgram, aEnabled, aPassword, aServiceClass,
aCallback) {
let options = {
program: aOptions.program,
enabled: aOptions.enabled,
password: aOptions.password,
serviceClass: aOptions.serviceClass
program: aProgram,
enabled: aEnabled,
password: aPassword,
serviceClass: aServiceClass
};
this._radioInterface.sendWorkerMessage("setCallBarring", options,
@ -819,16 +770,11 @@ MobileConnectionProvider.prototype = {
}).bind(this));
},
getCallBarring: function(aOptions, aCallback) {
if (!this._isValidCallBarringOptions(aOptions)) {
this._dispatchNotifyError(aCallback, RIL.GECKO_ERROR_INVALID_PARAMETER);
return;
}
getCallBarring: function(aProgram, aPassword, aServiceClass, aCallback) {
let options = {
program: aOptions.program,
password: aOptions.password,
serviceClass: aOptions.serviceClass
program: aProgram,
password: aPassword,
serviceClass: aServiceClass
};
this._radioInterface.sendWorkerMessage("queryCallBarringStatus", options,
@ -845,17 +791,10 @@ MobileConnectionProvider.prototype = {
}).bind(this));
},
changeCallBarringPassword: function(aOptions, aCallback) {
// Checking valid PIN for supplementary services. See TS.22.004 clause 5.2.
if (aOptions.pin == null || !aOptions.pin.match(/^\d{4}$/) ||
aOptions.newPin == null || !aOptions.newPin.match(/^\d{4}$/)) {
this._dispatchNotifyError(aCallback, "InvalidPassword");
return;
}
changeCallBarringPassword: function(aPin, aNewPin, aCallback) {
let options = {
pin: aOptions.pin,
newPin: aOptions.newPin
pin: aPin,
newPin: aNewPin
};
this._radioInterface.sendWorkerMessage("changeCallBarringPassword", options,

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

@ -0,0 +1,51 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsISupports.idl"
[scriptable, uuid(c616ecb6-65f5-441e-b97e-c642ddef6888)]
interface nsIMobileCallForwardingOptions : nsISupports
{
/**
* Call forwarding rule status.
*
* It will be either not active (false), or active (true).
*
* Note: Unused for setting call forwarding options. It reports
* the status of the rule when getting how the rule is
* configured.
*
* @see 3GPP TS 27.007 7.11 "status".
*/
readonly attribute bool active;
/**
* Indicates what to do with the rule. It shall be one of the
* nsIMobileConnection.CALL_FORWARD_ACTION_* values.
*/
readonly attribute short action;
/**
* Indicates the reason the call is being forwarded. It shall be one of the
* nsIMobileConnection.CALL_FORWARD_REASON_* values.
*/
readonly attribute short reason;
/**
* Phone number of forwarding address.
*/
readonly attribute DOMString number;
/**
* When "no reply" is enabled or queried, this gives the time in
* seconds to wait before call is forwarded.
*/
readonly attribute short timeSeconds;
/**
* Service for which the call forward is set up. It should be one of the
* nsIMobileConnection.ICC_SERVICE_CLASS_* values.
*/
readonly attribute short serviceClass;
};

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

@ -4,12 +4,13 @@
#include "nsISupports.idl"
interface nsIMobileCallForwardingOptions;
interface nsIMobileConnection;
interface nsIMobileConnectionInfo;
interface nsIMobileNetworkInfo;
interface nsIVariant;
[scriptable, uuid(bc0d4d76-fd3a-4593-818f-cb6ff87fbb55)]
[scriptable, uuid(823d935e-8262-47ed-8429-8203096b2ff4)]
interface nsIMobileConnectionListener : nsISupports
{
/**
@ -47,15 +48,15 @@ interface nsIMobileConnectionListener : nsISupports
* @param success
* Indicates whether the set call forwarding request is success.
* @param action
* One of the nsIMobileConnectionService.CALL_FORWARD_ACTION_* values.
* One of the nsIMobileConnection.CALL_FORWARD_ACTION_* values.
* @param reason
* One of the nsIMobileConnectionService.CALL_FORWARD_REASON_* values.
* One of the nsIMobileConnection.CALL_FORWARD_REASON_* values.
* @param number
* Phone number of forwarding address.
* @param timeSeconds
* The time in seconds should wait before call is forwarded.
* @param serviceClass
* One of the nsIMobileConnectionService.ICC_SERVICE_CLASS_* values.
* One of the nsIMobileConnection.ICC_SERVICE_CLASS_* values.
*/
void notifyCFStateChanged(in boolean success,
in unsigned short action,
@ -100,7 +101,7 @@ interface nsIMobileConnectionListener : nsISupports
* Notify when clir mode is changed.
*
* @param mode
* One of the nsIMobileConnectionService.CLIR_* values.
* One of the nsIMobileConnection.CLIR_* values.
*/
void notifyClirModeChanged(in unsigned long mode);
@ -124,7 +125,7 @@ interface nsIMobileConnectionListener : nsISupports
#define NO_ADDITIONAL_INFORMATION 0
%}
[scriptable, builtinclass, uuid(7f2dbbe0-42f2-11e4-916c-0800200c9a66)]
[scriptable, builtinclass, uuid(05568ae9-9873-46c6-9acd-0f6994cde756)]
interface nsIMobileConnectionCallback : nsISupports
{
/**
@ -139,11 +140,26 @@ interface nsIMobileConnectionCallback : nsISupports
void notifyGetNetworksSuccess(in uint32_t count,
[array, size_is(count)] in nsIMobileNetworkInfo networks);
[implicit_jscontext]
void notifySendCancelMmiSuccess(in jsval result /* MozMMIResult */);
void notifySendCancelMmiSuccess(in DOMString aServiceCode,
in DOMString aStatusMessage);
void notifySendCancelMmiSuccessWithInteger(in DOMString aServiceCode,
in DOMString aStatusMessage,
in unsigned short aAdditionalInformation);
void notifySendCancelMmiSuccessWithStrings(in DOMString aServiceCode,
in DOMString aStatusMessage,
in unsigned long aLength,
[array, size_is(aLength)] in wstring aAdditionalInformation);
void notifySendCancelMmiSuccessWithCallForwardingOptions(in DOMString aServiceCode,
in DOMString aStatusMessage,
in unsigned long aLength,
[array, size_is(aLength)] in nsIMobileCallForwardingOptions aAdditionalInformation);
void notifyGetCallForwardingSuccess(in uint32_t count,
[array, size_is(count)] in nsIMobileCallForwardingOptions results);
[implicit_jscontext]
void notifyGetCallForwardingSuccess(in jsval results /* Array of MozCallForwardingOptions */);
void notifyGetCallBarringSuccess(in unsigned short program,
in boolean enabled,
@ -218,9 +234,13 @@ already_AddRefed<nsIMobileConnectionService>
NS_CreateMobileConnectionService();
%}
[scriptable, uuid(04db7331-54fe-4cf7-9347-b9481350f4c2)]
[scriptable, uuid(1b76ccbf-dbc2-4b74-a62a-73ea91599afa)]
interface nsIMobileConnection : nsISupports
{
/*
* ICC service class.
*/
const long ICC_SERVICE_CLASS_NONE = 0; // not available
const long ICC_SERVICE_CLASS_VOICE = (1 << 0);
const long ICC_SERVICE_CLASS_DATA = (1 << 1);
const long ICC_SERVICE_CLASS_FAX = (1 << 2);
@ -236,6 +256,7 @@ interface nsIMobileConnection : nsISupports
*
* @see 3GPP TS 27.007 7.11 "mode".
*/
const long CALL_FORWARD_ACTION_UNKNOWN = -1; // not available
const long CALL_FORWARD_ACTION_DISABLE = 0;
const long CALL_FORWARD_ACTION_ENABLE = 1;
const long CALL_FORWARD_ACTION_QUERY_STATUS = 2;
@ -247,6 +268,7 @@ interface nsIMobileConnection : nsISupports
*
* @see 3GPP TS 27.007 7.11 "reason".
*/
const long CALL_FORWARD_REASON_UNKNOWN = -1; // not available
const long CALL_FORWARD_REASON_UNCONDITIONAL = 0;
const long CALL_FORWARD_REASON_MOBILE_BUSY = 1;
const long CALL_FORWARD_REASON_NO_REPLY = 2;
@ -257,6 +279,7 @@ interface nsIMobileConnection : nsISupports
/**
* Call barring program.
*/
const long CALL_BARRING_PROGRAM_UNKNOWN = -1; // not available
const long CALL_BARRING_PROGRAM_ALL_OUTGOING = 0;
const long CALL_BARRING_PROGRAM_OUTGOING_INTERNATIONAL = 1;
const long CALL_BARRING_PROGRAM_OUTGOING_INTERNATIONAL_EXCEPT_HOME = 2;
@ -492,7 +515,7 @@ interface nsIMobileConnection : nsISupports
* @param requestCallback
* Called when request is finished.
*
* If successful, the notifySendCancelMmiSuccess() will be called. And the
* If successful, the notifySendCancelMmiSuccess*() will be called. And the
* result will contain the information about the mmi operation.
*
* Otherwise, the notifyError() will be called.
@ -506,7 +529,7 @@ interface nsIMobileConnection : nsISupports
* @param requestCallback
* Called when request is finished.
*
* If successful, the notifySendCancelMmiSuccess() will be called. And the
* If successful, the notifySendCancelMmiSuccess*() will be called. And the
* result will contain the information about the mmi operation.
*
* Otherwise, the notifyError() will be called.
@ -523,8 +546,8 @@ interface nsIMobileConnection : nsISupports
* Called when request is finished.
*
* If successful, the notifyGetCallForwardingSuccess() will be called. And the
* result will be an array of MozCallForwardingOptions.
* @see MozCallForwardingOptions for the detail of result.
* result will be an array of nsIMobileCallForwardingOptions.
* @see nsIMobileCallForwardingOptions for the detail of result.
*
* Otherwise, the notifyError() will be called, and the error will be either
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter',
@ -536,9 +559,17 @@ interface nsIMobileConnection : nsISupports
/**
* Configures call forwarding options.
*
* @param options
* An object containing the call forward rule to set.
* @see MozCallForwardingOptions for the detail of options.
* @param action
* One of the nsIMobileConnection.CALL_FORWARD_ACTION_* values.
* @param reason
* One of the nsIMobileConnection.CALL_FORWARD_REASON_* values.
* @param number
* Phone number of forwarding address.
* @param timeSeconds
* When "no reply" is enabled or queried, this gives the time in
* seconds to wait before call is forwarded.
* @param serviceClass
* One of the nsIMobileConnection.ICC_SERVICE_CLASS_* values.
* @param requestCallback
* Called when request is finished.
*
@ -548,16 +579,22 @@ interface nsIMobileConnection : nsISupports
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter',
* 'IllegalSIMorME', or 'GenericFailure'.
*/
void setCallForwarding(in jsval options,
void setCallForwarding(in unsigned short action,
in unsigned short reason,
in DOMString number,
in unsigned short timeSeconds,
in unsigned short serviceClass,
in nsIMobileConnectionCallback requestCallback);
/**
* Queries current call barring status.
*
* @param options
* An object containing the call barring rule to query. No need to
* specify 'enabled' property.
* @see MozCallBarringOptions for the detail of options.
* @param program
* One of the nsIMobileConnection.CALL_BARRING_PROGRAM_* values.
* @param password
* Call barring password. Use "" if no password specified.
* @param serviceClass
* One of the nsIMobileConnection.ICC_SERVICE_CLASS_* values.
* @param requestCallback
* Called when request is finished.
*
@ -569,15 +606,22 @@ interface nsIMobileConnection : nsISupports
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter',
* 'IllegalSIMorME', or 'GenericFailure'.
*/
void getCallBarring(in jsval options,
void getCallBarring(in unsigned short program,
in DOMString password,
in unsigned short serviceClass,
in nsIMobileConnectionCallback requestCallback);
/**
* Configures call barring option.
*
* @param options
* An object containing the call barring rule to set.
* @see MozCallBarringOptions for the detail of options.
* @param program
* One of the nsIMobileConnection.CALL_BARRING_PROGRAM_* values.
* @param enabled
* Enable or disable the call barring program.
* @param password
* Call barring password. Use "" if no password specified.
* @param serviceClass
* One of the nsIMobileConnection.ICC_SERVICE_CLASS_* values.
* @param requestCallback
* Called when request is finished.
*
@ -587,17 +631,19 @@ interface nsIMobileConnection : nsISupports
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter',
* 'IllegalSIMorME', or 'GenericFailure'.
*/
void setCallBarring(in jsval options,
void setCallBarring(in unsigned short program,
in bool enabled,
in DOMString password,
in unsigned short serviceClass,
in nsIMobileConnectionCallback requestCallback);
/**
* Change call barring facility password.
*
* @param options
* An object containing information about pin and newPin, and,
* this object must have both "pin" and "newPin" attributes
* to change the call barring facility password.
* @see MozCallBarringOptions for the detail of options.
* @param pin
* Old call barring password.
* @param newPin
* New call barring password.
* @param requestCallback
* Called when request is finished.
*
@ -607,7 +653,8 @@ interface nsIMobileConnection : nsISupports
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter',
* 'IllegalSIMorME', or 'GenericFailure'.
*/
void changeCallBarringPassword(in jsval options,
void changeCallBarringPassword(in DOMString pin,
in DOMString newPin,
in nsIMobileConnectionCallback requestCallback);
/**
@ -647,7 +694,7 @@ interface nsIMobileConnection : nsISupports
* the called party when originating a call.
*
* @param clirMode
* One of the nsIMobileConnectionService.CLIR_* values.
* One of the nsIMobileConnection.CLIR_* values.
* @param requestCallback
* Called when request is finished.
*

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

@ -239,21 +239,15 @@ MobileConnectionChild::CancelMMI(nsIMobileConnectionCallback* aCallback)
}
NS_IMETHODIMP
MobileConnectionChild::SetCallForwarding(JS::Handle<JS::Value> aOptions,
MobileConnectionChild::SetCallForwarding(uint16_t aAction, uint16_t aReason,
const nsAString& aNumber,
uint16_t aTimeSeconds, uint16_t aServiceClass,
nsIMobileConnectionCallback* aCallback)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(&aOptions.toObject()))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
IPC::MozCallForwardingOptions options;
if(!options.Init(cx, aOptions)) {
return NS_ERROR_TYPE_ERR;
}
return SendRequest(SetCallForwardingRequest(options), aCallback)
return SendRequest(SetCallForwardingRequest(aAction, aReason,
nsString(aNumber),
aTimeSeconds, aServiceClass),
aCallback)
? NS_OK : NS_ERROR_FAILURE;
}
@ -266,59 +260,38 @@ MobileConnectionChild::GetCallForwarding(uint16_t aReason,
}
NS_IMETHODIMP
MobileConnectionChild::SetCallBarring(JS::Handle<JS::Value> aOptions,
MobileConnectionChild::SetCallBarring(uint16_t aProgram, bool aEnabled,
const nsAString& aPassword,
uint16_t aServiceClass,
nsIMobileConnectionCallback* aCallback)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(&aOptions.toObject()))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
IPC::MozCallBarringOptions options;
if(!options.Init(cx, aOptions)) {
return NS_ERROR_TYPE_ERR;
}
return SendRequest(SetCallBarringRequest(options), aCallback)
return SendRequest(SetCallBarringRequest(aProgram, aEnabled,
nsString(aPassword),
aServiceClass),
aCallback)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
MobileConnectionChild::GetCallBarring(JS::Handle<JS::Value> aOptions,
MobileConnectionChild::GetCallBarring(uint16_t aProgram,
const nsAString& aPassword,
uint16_t aServiceClass,
nsIMobileConnectionCallback* aCallback)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(&aOptions.toObject()))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
IPC::MozCallBarringOptions options;
if(!options.Init(cx, aOptions)) {
return NS_ERROR_TYPE_ERR;
}
return SendRequest(GetCallBarringRequest(options), aCallback)
return SendRequest(GetCallBarringRequest(aProgram, nsString(aPassword),
aServiceClass),
aCallback)
? NS_OK : NS_ERROR_FAILURE;
}
NS_IMETHODIMP
MobileConnectionChild::ChangeCallBarringPassword(JS::Handle<JS::Value> aOptions,
MobileConnectionChild::ChangeCallBarringPassword(const nsAString& aPin,
const nsAString& aNewPin,
nsIMobileConnectionCallback* aCallback)
{
AutoJSAPI jsapi;
if (!NS_WARN_IF(jsapi.Init(&aOptions.toObject()))) {
return NS_ERROR_FAILURE;
}
JSContext* cx = jsapi.cx();
IPC::MozCallBarringOptions options;
if(!options.Init(cx, aOptions)) {
return NS_ERROR_TYPE_ERR;
}
return SendRequest(ChangeCallBarringPasswordRequest(options), aCallback)
return SendRequest(ChangeCallBarringPasswordRequest(nsString(aPin),
nsString(aNewPin)),
aCallback)
? NS_OK : NS_ERROR_FAILURE;
}
@ -597,26 +570,45 @@ MobileConnectionRequestChild::DoReply(const MobileConnectionReplySuccessMmi& aRe
nsAutoString statusMessage(aReply.statusMessage());
AdditionalInformation info(aReply.additionalInformation());
nsRefPtr<MobileConnectionCallback> callback = static_cast<MobileConnectionCallback*>(mRequestCallback.get());
// Handle union types
switch (info.type()) {
case AdditionalInformation::Tvoid_t:
return NS_SUCCEEDED(callback->NotifySendCancelMmiSuccess(serviceCode,
statusMessage));
return NS_SUCCEEDED(mRequestCallback->NotifySendCancelMmiSuccess(serviceCode,
statusMessage));
case AdditionalInformation::Tuint16_t:
return NS_SUCCEEDED(callback->NotifySendCancelMmiSuccess(serviceCode,
statusMessage,
info.get_uint16_t()));
case AdditionalInformation::TArrayOfnsString:
return NS_SUCCEEDED(callback->NotifySendCancelMmiSuccess(serviceCode,
statusMessage,
info.get_ArrayOfnsString()));
case AdditionalInformation::TArrayOfMozCallForwardingOptions:
return NS_SUCCEEDED(callback->NotifySendCancelMmiSuccess(serviceCode,
statusMessage,
info.get_ArrayOfMozCallForwardingOptions()));
return NS_SUCCEEDED(mRequestCallback->NotifySendCancelMmiSuccessWithInteger(
serviceCode, statusMessage, info.get_uint16_t()));
case AdditionalInformation::TArrayOfnsString: {
uint32_t count = info.get_ArrayOfnsString().Length();
const nsTArray<nsString>& additionalInformation = info.get_ArrayOfnsString();
nsAutoArrayPtr<const char16_t*> additionalInfoPtrs(new const char16_t*[count]);
for (size_t i = 0; i < count; ++i) {
additionalInfoPtrs[i] = additionalInformation[i].get();
}
return NS_SUCCEEDED(mRequestCallback->NotifySendCancelMmiSuccessWithStrings(
serviceCode, statusMessage, count, additionalInfoPtrs));
}
case AdditionalInformation::TArrayOfnsMobileCallForwardingOptions: {
uint32_t count = info.get_ArrayOfnsMobileCallForwardingOptions().Length();
nsTArray<nsCOMPtr<nsIMobileCallForwardingOptions>> results;
for (uint32_t i = 0; i < count; i++) {
// Use dont_AddRef here because these instances are already AddRef-ed in
// MobileConnectionIPCSerializer.h
nsCOMPtr<nsIMobileCallForwardingOptions> item = dont_AddRef(
info.get_ArrayOfnsMobileCallForwardingOptions()[i]);
results.AppendElement(item);
}
return NS_SUCCEEDED(mRequestCallback->NotifySendCancelMmiSuccessWithCallForwardingOptions(
serviceCode, statusMessage, count,
const_cast<nsIMobileCallForwardingOptions**>(info.get_ArrayOfnsMobileCallForwardingOptions().Elements())));
}
default:
MOZ_CRASH("Received invalid type!");
@ -628,8 +620,17 @@ MobileConnectionRequestChild::DoReply(const MobileConnectionReplySuccessMmi& aRe
bool
MobileConnectionRequestChild::DoReply(const MobileConnectionReplySuccessCallForwarding& aReply)
{
nsRefPtr<MobileConnectionCallback> callback = static_cast<MobileConnectionCallback*>(mRequestCallback.get());
return NS_SUCCEEDED(callback->NotifyGetCallForwardingSuccess(aReply.results()));
uint32_t count = aReply.results().Length();
nsTArray<nsCOMPtr<nsIMobileCallForwardingOptions>> results;
for (uint32_t i = 0; i < count; i++) {
// Use dont_AddRef here because these instances are already AddRef-ed in
// MobileConnectionIPCSerializer.h
nsCOMPtr<nsIMobileCallForwardingOptions> item = dont_AddRef(aReply.results()[i]);
results.AppendElement(item);
}
return NS_SUCCEEDED(mRequestCallback->NotifyGetCallForwardingSuccess(
count, const_cast<nsIMobileCallForwardingOptions**>(aReply.results().Elements())));
}
bool

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

@ -6,12 +6,14 @@
#define mozilla_dom_mobileconnection_MobileConnectionIPCSerialiser_h
#include "ipc/IPCMessageUtils.h"
#include "mozilla/dom/mobileconnection/MobileCallForwardingOptions.h"
#include "mozilla/dom/MobileCellInfo.h"
#include "mozilla/dom/MobileConnectionInfo.h"
#include "mozilla/dom/MobileNetworkInfo.h"
#include "mozilla/dom/MozMobileConnectionBinding.h"
using mozilla::AutoJSContext;
using mozilla::dom::mobileconnection::MobileCallForwardingOptions;
using mozilla::dom::MobileNetworkInfo;
using mozilla::dom::MobileCellInfo;
using mozilla::dom::MobileConnectionInfo;
@ -19,6 +21,7 @@ using mozilla::dom::MobileConnectionInfo;
typedef nsIMobileCellInfo* nsMobileCellInfo;
typedef nsIMobileConnectionInfo* nsMobileConnectionInfo;
typedef nsIMobileNetworkInfo* nsMobileNetworkInfo;
typedef nsIMobileCallForwardingOptions* nsMobileCallForwardingOptions;
namespace IPC {
@ -53,27 +56,83 @@ struct MozCallForwardingOptions : public mozilla::dom::MozCallForwardingOptions
};
};
struct MozCallBarringOptions : mozilla::dom::MozCallBarringOptions
template <>
struct ParamTraits<nsIMobileCallForwardingOptions*>
{
bool operator==(const MozCallBarringOptions& aOther) const
typedef nsIMobileCallForwardingOptions* paramType;
// Function to serialize a MobileCallForwardingOptions.
static void Write(Message *aMsg, const paramType& aParam)
{
return // Compare mEnabled
((!mEnabled.WasPassed() && !aOther.mEnabled.WasPassed()) ||
(mEnabled.WasPassed() && aOther.mEnabled.WasPassed() &&
mEnabled.Value() == aOther.mEnabled.Value())) &&
// Compare mPassword
((!mPassword.WasPassed() && !aOther.mPassword.WasPassed()) ||
(mPassword.WasPassed() && aOther.mPassword.WasPassed() &&
mPassword.Value() == aOther.mPassword.Value())) &&
// Compare mProgram
((!mProgram.WasPassed() && !aOther.mProgram.WasPassed()) ||
(mProgram.WasPassed() && aOther.mProgram.WasPassed() &&
mProgram.Value() == aOther.mProgram.Value())) &&
// Compare mServiceClass
((!mServiceClass.WasPassed() && !aOther.mServiceClass.WasPassed()) ||
(mServiceClass.WasPassed() && aOther.mServiceClass.WasPassed() &&
mServiceClass.Value() == aOther.mServiceClass.Value()));
};
bool isNull = !aParam;
WriteParam(aMsg, isNull);
// If it is a null object, then we are done.
if (isNull) {
return;
}
int16_t pShort;
nsString pString;
bool pBool;
aParam->GetActive(&pBool);
WriteParam(aMsg, pBool);
aParam->GetAction(&pShort);
WriteParam(aMsg, pShort);
aParam->GetReason(&pShort);
WriteParam(aMsg, pShort);
aParam->GetNumber(pString);
WriteParam(aMsg, pString);
aParam->GetTimeSeconds(&pShort);
WriteParam(aMsg, pShort);
aParam->GetServiceClass(&pShort);
WriteParam(aMsg, pShort);
}
// Function to de-serialize a MobileCallForwardingOptions.
static bool Read(const Message *aMsg, void **aIter, paramType* aResult)
{
// Check if is the null pointer we have transfered.
bool isNull;
if (!ReadParam(aMsg, aIter, &isNull)) {
return false;
}
if (isNull) {
*aResult = nullptr;
return true;
}
bool active;
int16_t action;
int16_t reason;
nsString number;
int16_t timeSeconds;
int16_t serviceClass;
// It's not important to us where it fails, but rather if it fails
if (!(ReadParam(aMsg, aIter, &active) &&
ReadParam(aMsg, aIter, &action) &&
ReadParam(aMsg, aIter, &reason) &&
ReadParam(aMsg, aIter, &number) &&
ReadParam(aMsg, aIter, &timeSeconds) &&
ReadParam(aMsg, aIter, &serviceClass))) {
return false;
}
*aResult = new MobileCallForwardingOptions(active, action, reason,
number, timeSeconds, serviceClass);
// We release this ref after receiver finishes processing.
NS_ADDREF(*aResult);
return true;
}
};
/**
@ -584,166 +643,6 @@ struct ParamTraits<MozCallForwardingOptions>
}
};
/**
* MozCallBarringOptions Serialize/De-serialize.
*/
template <>
struct ParamTraits<MozCallBarringOptions>
{
typedef MozCallBarringOptions paramType;
// Function to serialize a MozCallBarringOptions.
static void Write(Message *aMsg, const paramType& aParam)
{
bool wasPassed = false;
bool isNull = false;
// Write mProgram
wasPassed = aParam.mProgram.WasPassed();
WriteParam(aMsg, wasPassed);
if (wasPassed) {
isNull = aParam.mProgram.Value().IsNull();
WriteParam(aMsg, isNull);
if (!isNull) {
WriteParam(aMsg, aParam.mProgram.Value().Value());
}
}
// Write mEnabled
wasPassed = aParam.mEnabled.WasPassed();
WriteParam(aMsg, wasPassed);
if (wasPassed) {
isNull = aParam.mEnabled.Value().IsNull();
WriteParam(aMsg, isNull);
if (!isNull) {
WriteParam(aMsg, aParam.mEnabled.Value().Value());
}
}
// Write mPassword
wasPassed = aParam.mPassword.WasPassed();
WriteParam(aMsg, wasPassed);
if (wasPassed) {
WriteParam(aMsg, aParam.mPassword.Value());
}
// Write mServiceClass
wasPassed = aParam.mServiceClass.WasPassed();
WriteParam(aMsg, wasPassed);
if (wasPassed) {
isNull = aParam.mServiceClass.Value().IsNull();
WriteParam(aMsg, isNull);
if (!isNull) {
WriteParam(aMsg, aParam.mServiceClass.Value().Value());
}
}
// Write mPin
wasPassed = aParam.mPin.WasPassed();
WriteParam(aMsg, wasPassed);
if (wasPassed) {
WriteParam(aMsg, aParam.mPin.Value());
}
// Write mNewPin
wasPassed = aParam.mNewPin.WasPassed();
WriteParam(aMsg, wasPassed);
if (wasPassed) {
WriteParam(aMsg, aParam.mNewPin.Value());
}
}
// Function to de-serialize a MozCallBarringOptions.
static bool Read(const Message *aMsg, void **aIter, paramType* aResult)
{
bool wasPassed = false;
bool isNull = false;
// Read mProgram
if (!ReadParam(aMsg, aIter, &wasPassed)) {
return false;
}
if (wasPassed) {
aResult->mProgram.Construct();
if (!ReadParam(aMsg, aIter, &isNull)) {
return false;
}
if (!isNull) {
if (!ReadParam(aMsg, aIter, &aResult->mProgram.Value().SetValue())) {
return false;
}
}
}
// Read mEnabled
if (!ReadParam(aMsg, aIter, &wasPassed)) {
return false;
}
if (wasPassed) {
aResult->mEnabled.Construct();
if (!ReadParam(aMsg, aIter, &isNull)) {
return false;
}
if (!isNull) {
if (!ReadParam(aMsg, aIter, &aResult->mEnabled.Value().SetValue())) {
return false;
}
}
}
// Read mPassword
if (!ReadParam(aMsg, aIter, &wasPassed)) {
return false;
}
if (wasPassed) {
if (!ReadParam(aMsg, aIter, &aResult->mPassword.Construct())) {
return false;
}
}
// Read mServiceClass
if (!ReadParam(aMsg, aIter, &wasPassed)) {
return false;
}
if (wasPassed) {
aResult->mServiceClass.Construct();
if (!ReadParam(aMsg, aIter, &isNull)) {
return false;
}
if (!isNull) {
if (!ReadParam(aMsg, aIter, &aResult->mServiceClass.Value().SetValue())) {
return false;
}
}
}
// Read mPin
if (!ReadParam(aMsg, aIter, &wasPassed)) {
return false;
}
if (wasPassed) {
if (!ReadParam(aMsg, aIter, &aResult->mPin.Construct())) {
return false;
}
}
// Read mNewPin
if (!ReadParam(aMsg, aIter, &wasPassed)) {
return false;
}
if (wasPassed) {
if (!ReadParam(aMsg, aIter, &aResult->mNewPin.Construct())) {
return false;
}
}
return true;
}
};
} // namespace IPC
#endif // mozilla_dom_mobileconnection_MobileConnectionIPCSerialiser_h

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

@ -423,26 +423,12 @@ MobileConnectionRequestParent::DoRequest(const SetCallForwardingRequest& aReques
{
NS_ENSURE_TRUE(mMobileConnection, false);
// There are cases (bug 1070083) where this is called with no JS on the stack.
// And since mobileConnectionService might be JS-Implemented, so we just
// create it in the System-Principaled Junk Scope. We are going to get rid of
// the "jsval" used in MobileConnection's interface in bug 1047196, after that
// we don't need these things.
// Note that using xpc::PrivilegedJunkScope requires explicit case-by-case
// approval from the XPConnect module owner (bholley).
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(xpc::PrivilegedJunkScope()))) {
return false;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aRequest.options(), &options)) {
JS_ClearPendingException(cx);
return false;
}
return NS_SUCCEEDED(mMobileConnection->SetCallForwarding(options, this));
return NS_SUCCEEDED(mMobileConnection->SetCallForwarding(aRequest.action(),
aRequest.reason(),
aRequest.number(),
aRequest.timeSeconds(),
aRequest.serviceClass(),
this));
}
bool
@ -450,7 +436,8 @@ MobileConnectionRequestParent::DoRequest(const GetCallForwardingRequest& aReques
{
NS_ENSURE_TRUE(mMobileConnection, false);
return NS_SUCCEEDED(mMobileConnection->GetCallForwarding(aRequest.reason(), this));
return NS_SUCCEEDED(mMobileConnection->GetCallForwarding(aRequest.reason(),
this));
}
bool
@ -458,26 +445,11 @@ MobileConnectionRequestParent::DoRequest(const SetCallBarringRequest& aRequest)
{
NS_ENSURE_TRUE(mMobileConnection, false);
// There are cases (bug 1070083) where this is called with no JS on the stack.
// And since mobileConnectionService might be JS-Implemented, so we just
// create it in the System-Principaled Junk Scope. We are going to get rid of
// the "jsval" used in MobileConnection's interface in bug 1047196, after that
// we don't need these things.
// Note that using xpc::PrivilegedJunkScope requires explicit case-by-case
// approval from the XPConnect module owner (bholley).
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(xpc::PrivilegedJunkScope()))) {
return false;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aRequest.options(), &options)) {
JS_ClearPendingException(cx);
return false;
}
return NS_SUCCEEDED(mMobileConnection->SetCallBarring(options, this));
return NS_SUCCEEDED(mMobileConnection->SetCallBarring(aRequest.program(),
aRequest.enabled(),
aRequest.password(),
aRequest.serviceClass(),
this));
}
bool
@ -485,26 +457,10 @@ MobileConnectionRequestParent::DoRequest(const GetCallBarringRequest& aRequest)
{
NS_ENSURE_TRUE(mMobileConnection, false);
// There are cases (bug 1070083) where this is called with no JS on the stack.
// And since mobileConnectionService might be JS-Implemented, so we just
// create it in the System-Principaled Junk Scope. We are going to get rid of
// the "jsval" used in MobileConnection's interface in bug 1047196, after that
// we don't need these things.
// Note that using xpc::PrivilegedJunkScope requires explicit case-by-case
// approval from the XPConnect module owner (bholley).
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(xpc::PrivilegedJunkScope()))) {
return false;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aRequest.options(), &options)) {
JS_ClearPendingException(cx);
return false;
}
return NS_SUCCEEDED(mMobileConnection->GetCallBarring(options, this));
return NS_SUCCEEDED(mMobileConnection->GetCallBarring(aRequest.program(),
aRequest.password(),
aRequest.serviceClass(),
this));
}
bool
@ -512,26 +468,9 @@ MobileConnectionRequestParent::DoRequest(const ChangeCallBarringPasswordRequest&
{
NS_ENSURE_TRUE(mMobileConnection, false);
// There are cases (bug 1070083) where this is called with no JS on the stack.
// And since mobileConnectionService might be JS-Implemented, so we just
// create it in the System-Principaled Junk Scope. We are going to get rid of
// the "jsval" used in MobileConnection's interface in bug 1047196, after that
// we don't need these things.
// Note that using xpc::PrivilegedJunkScope requires explicit case-by-case
// approval from the XPConnect module owner (bholley).
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(xpc::PrivilegedJunkScope()))) {
return false;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> options(cx);
if (!ToJSValue(cx, aRequest.options(), &options)) {
JS_ClearPendingException(cx);
return false;
}
return NS_SUCCEEDED(mMobileConnection->ChangeCallBarringPassword(options, this));
return NS_SUCCEEDED(mMobileConnection->ChangeCallBarringPassword(aRequest.pin(),
aRequest.newPin(),
this));
}
bool
@ -627,104 +566,63 @@ MobileConnectionRequestParent::NotifyGetNetworksSuccess(uint32_t aCount,
}
NS_IMETHODIMP
MobileConnectionRequestParent::NotifySendCancelMmiSuccess(JS::Handle<JS::Value> aResult,
JSContext* aCx)
MobileConnectionRequestParent::NotifySendCancelMmiSuccess(const nsAString& aServiceCode,
const nsAString& aStatusMessage)
{
RootedDictionary<MozMMIResult> result(aCx);
if (!result.Init(aCx, aResult)) {
return NS_ERROR_TYPE_ERR;
}
// No additionInformation passed
if (!result.mAdditionalInformation.WasPassed()) {
return SendReply(MobileConnectionReplySuccessMmi(result.mServiceCode,
result.mStatusMessage,
AdditionalInformation(mozilla::void_t())));
}
OwningUnsignedShortOrObject& additionInformation = result.mAdditionalInformation.Value();
if (additionInformation.IsUnsignedShort()) {
return SendReply(MobileConnectionReplySuccessMmi(result.mServiceCode,
result.mStatusMessage,
AdditionalInformation(uint16_t(additionInformation.GetAsUnsignedShort()))));
}
if (additionInformation.IsObject()) {
uint32_t length;
JS::Rooted<JS::Value> value(aCx);
JS::Rooted<JSObject*> object(aCx, additionInformation.GetAsObject());
if (!JS_IsArrayObject(aCx, object) ||
!JS_GetArrayLength(aCx, object, &length) || length <= 0 ||
// Check first element to decide the format of array.
!JS_GetElement(aCx, object, 0, &value)) {
return NS_ERROR_TYPE_ERR;
}
// Check first element to decide the format of array.
if (value.isString()) {
// String[]
nsTArray<nsString> infos;
for (uint32_t i = 0; i < length; i++) {
if (!JS_GetElement(aCx, object, i, &value) || !value.isString()) {
return NS_ERROR_TYPE_ERR;
}
nsAutoJSString str;
if (!str.init(aCx, value.toString())) {
return NS_ERROR_FAILURE;
}
infos.AppendElement(str);
}
return SendReply(MobileConnectionReplySuccessMmi(result.mServiceCode,
result.mStatusMessage,
AdditionalInformation(infos)));
} else {
// IPC::MozCallForwardingOptions[]
nsTArray<IPC::MozCallForwardingOptions> infos;
for (uint32_t i = 0; i < length; i++) {
IPC::MozCallForwardingOptions info;
if (!JS_GetElement(aCx, object, i, &value) || !info.Init(aCx, value)) {
return NS_ERROR_TYPE_ERR;
}
infos.AppendElement(info);
}
return SendReply(MobileConnectionReplySuccessMmi(result.mServiceCode,
result.mStatusMessage,
AdditionalInformation(infos)));
}
}
return NS_ERROR_TYPE_ERR;
return SendReply(MobileConnectionReplySuccessMmi(nsString(aServiceCode),
nsString(aStatusMessage),
AdditionalInformation(mozilla::void_t())));
}
NS_IMETHODIMP
MobileConnectionRequestParent::NotifyGetCallForwardingSuccess(JS::Handle<JS::Value> aResults,
JSContext* aCx)
MobileConnectionRequestParent::NotifySendCancelMmiSuccessWithInteger(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint16_t aAdditionalInformation)
{
uint32_t length;
JS::Rooted<JSObject*> object(aCx, &aResults.toObject());
nsTArray<IPC::MozCallForwardingOptions> results;
return SendReply(MobileConnectionReplySuccessMmi(nsString(aServiceCode),
nsString(aStatusMessage),
AdditionalInformation(aAdditionalInformation)));
}
if (!JS_IsArrayObject(aCx, object) ||
!JS_GetArrayLength(aCx, object, &length)) {
return NS_ERROR_TYPE_ERR;
NS_IMETHODIMP
MobileConnectionRequestParent::NotifySendCancelMmiSuccessWithStrings(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint32_t aCount,
const char16_t** aAdditionalInformation)
{
nsTArray<nsString> additionalInformation;
for (uint32_t i = 0; i < aCount; i++) {
additionalInformation.AppendElement(nsDependentString(aAdditionalInformation[i]));
}
for (uint32_t i = 0; i < length; i++) {
JS::Rooted<JS::Value> entry(aCx);
IPC::MozCallForwardingOptions info;
return SendReply(MobileConnectionReplySuccessMmi(nsString(aServiceCode),
nsString(aStatusMessage),
AdditionalInformation(additionalInformation)));
}
if (!JS_GetElement(aCx, object, i, &entry) || !info.Init(aCx, entry)) {
return NS_ERROR_TYPE_ERR;
}
NS_IMETHODIMP
MobileConnectionRequestParent::NotifySendCancelMmiSuccessWithCallForwardingOptions(const nsAString& aServiceCode,
const nsAString& aStatusMessage,
uint32_t aCount,
nsIMobileCallForwardingOptions** aAdditionalInformation)
{
nsTArray<nsIMobileCallForwardingOptions*> additionalInformation;
for (uint32_t i = 0; i < aCount; i++) {
additionalInformation.AppendElement(aAdditionalInformation[i]);
}
results.AppendElement(info);
return SendReply(MobileConnectionReplySuccessMmi(nsString(aServiceCode),
nsString(aStatusMessage),
AdditionalInformation(additionalInformation)));
}
NS_IMETHODIMP
MobileConnectionRequestParent::NotifyGetCallForwardingSuccess(uint32_t aCount,
nsIMobileCallForwardingOptions** aResults)
{
nsTArray<nsIMobileCallForwardingOptions*> results;
for (uint32_t i = 0; i < aCount; i++) {
results.AppendElement(aResults[i]);
}
return SendReply(MobileConnectionReplySuccessCallForwarding(results));

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

@ -109,27 +109,37 @@ struct CancelMmiRequest
struct SetCallForwardingRequest
{
MozCallForwardingOptions options;
uint16_t action;
uint16_t reason;
nsString number;
uint16_t timeSeconds;
uint16_t serviceClass;
};
struct GetCallForwardingRequest
{
int16_t reason;
uint16_t reason;
};
struct SetCallBarringRequest
{
MozCallBarringOptions options;
uint16_t program;
bool enabled;
nsString password;
uint16_t serviceClass;
};
struct GetCallBarringRequest
{
MozCallBarringOptions options;
uint16_t program;
nsString password;
uint16_t serviceClass;
};
struct ChangeCallBarringPasswordRequest
{
MozCallBarringOptions options;
nsString pin;
nsString newPin;
};
struct SetCallWaitingRequest

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

@ -54,7 +54,7 @@ struct MobileConnectionReplySuccessMmi
struct MobileConnectionReplySuccessCallForwarding
{
MozCallForwardingOptions[] results;
nsMobileCallForwardingOptions[] results;
};
struct MobileConnectionReplySuccessCallBarring

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

@ -8,7 +8,7 @@ using nsMobileConnectionInfo from "mozilla/dom/mobileconnection/MobileConnection
using nsMobileNetworkInfo from "mozilla/dom/mobileconnection/MobileConnectionIPCSerializer.h";
using struct mozilla::void_t from "ipc/IPCMessageUtils.h";
using struct IPC::MozCallForwardingOptions from "mozilla/dom/mobileconnection/MobileConnectionIPCSerializer.h";
using struct IPC::MozCallBarringOptions from "mozilla/dom/mobileconnection/MobileConnectionIPCSerializer.h";
using nsMobileCallForwardingOptions from "mozilla/dom/mobileconnection/MobileConnectionIPCSerializer.h";
namespace mozilla {
namespace dom {
@ -18,7 +18,7 @@ union AdditionalInformation {
void_t;
uint16_t;
nsString[];
MozCallForwardingOptions[];
nsMobileCallForwardingOptions[];
};
} // namespace mobileconnection

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

@ -19,10 +19,12 @@ EXPORTS.mozilla.dom.mobileconnection += [
'ipc/MobileConnectionChild.h',
'ipc/MobileConnectionIPCSerializer.h',
'ipc/MobileConnectionParent.h',
'MobileCallForwardingOptions.h',
]
XPIDL_SOURCES += [
'interfaces/nsICellInfo.idl',
'interfaces/nsIMobileCallForwardingOptions.idl',
'interfaces/nsIMobileCellInfo.idl',
'interfaces/nsIMobileConnectionInfo.idl',
'interfaces/nsIMobileConnectionService.idl',
@ -35,6 +37,7 @@ UNIFIED_SOURCES += [
'ipc/MobileConnectionChild.cpp',
'ipc/MobileConnectionIPCService.cpp',
'ipc/MobileConnectionParent.cpp',
'MobileCallForwardingOptions.cpp',
'MobileCellInfo.cpp',
'MobileConnection.cpp',
'MobileConnectionArray.cpp',

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

@ -22,7 +22,7 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' #bug 793211 # b2g(needs http
[test_bug600307-DBOps.html]
[test_bug746272-1.html]
[test_bug746272-2.html]
skip-if = os == "android" # bug 962029
skip-if = os == "android" || toolkit == 'gonk' # bug 962029
[test_cookieBlock.html]
skip-if = (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) # b2g-debug(bug 913706) b2g-desktop(bug 913706)
[test_cookieSession.html]

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

@ -417,7 +417,7 @@ this.MobileIdentityManager = {
onUICancel: function() {
log.debug("UI cancel");
if (this.activeVerificationFlow) {
this.activeVerificationFlow.cleanup(true);
this.rejectVerification();
}
},
@ -467,7 +467,7 @@ this.MobileIdentityManager = {
}
this.activeVerificationDeferred.reject(aReason);
this.activeVerificationDeferred = null;
this.cleanupVerification(true);
this.cleanupVerification(true /* unregister */);
},
resolveVerification: function(aResult) {
@ -479,11 +479,11 @@ this.MobileIdentityManager = {
this.cleanupVerification();
},
cleanupVerification: function() {
cleanupVerification: function(aUnregister = false) {
if (!this.activeVerificationFlow) {
return;
}
this.activeVerificationFlow.cleanup();
this.activeVerificationFlow.cleanup(aUnregister);
this.activeVerificationFlow = null;
},

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

@ -1459,3 +1459,54 @@ add_test(function() {
}
});
});
add_test(function() {
do_print("= Cancel verification flow =");
do_register_cleanup(cleanup);
do_test_pending();
let _sessionToken = Date.now();
let ui = new MockUi();
ui.verificationCodePrompt = function() {
MobileIdentityManager.onUICancel();
};
MobileIdentityManager.ui = ui;
let credStore = new MockCredStore();
MobileIdentityManager.credStore = credStore;
let client = new MockClient();
MobileIdentityManager.client = client;
let promiseId = Date.now();
let mm = {
sendAsyncMessage: function(aMsg, aData) {
do_print("sendAsyncMessage " + aMsg + " - " + JSON.stringify(aData));
// Check result.
do_check_eq(aMsg, GET_ASSERTION_RETURN_KO);
do_check_eq(typeof aData, "object");
do_check_eq(aData.promiseId, promiseId);
do_check_eq(aData.error, DIALOG_CLOSED_BY_USER);
do_test_finished();
run_next_test();
}
};
addPermission(Ci.nsIPermissionManager.ALLOW_ACTION);
MobileIdentityManager.receiveMessage({
name: GET_ASSERTION_IPC_MSG,
principal: PRINCIPAL,
target: mm,
json: {
promiseId: promiseId,
options: {}
}
});
});

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

@ -11,6 +11,7 @@ import pkg_resources
import sys
import time
from mozlog.structured.structuredlog import get_default_logger
import mozversion
from xmlgen import html
from xmlgen import raw
@ -247,9 +248,9 @@ class HTMLReportingTestResultMixin(object):
def gather_debug(self):
debug = {}
try:
self.marionette.switch_context(self.marionette.CONTEXT_CHROME)
self.marionette.set_context(self.marionette.CONTEXT_CHROME)
debug['screenshot'] = self.marionette.screenshot()
self.marionette.switch_context(self.marionette.CONTEXT_CONTENT)
self.marionette.set_context(self.marionette.CONTEXT_CONTENT)
debug['source'] = self.marionette.page_source
self.marionette.switch_to_frame()
debug['settings'] = json.dumps(self.marionette.execute_async_script("""
@ -260,6 +261,7 @@ req.onsuccess = function() {
marionetteScriptFinished(req.result);
}""", special_powers=True), sort_keys=True, indent=4, separators=(',', ': '))
except:
pass
logger = get_default_logger()
logger.warning('Failed to gather test failure debug.', exc_info=True)
return debug