mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1114937 - Part 4: IPDL Implementation. r=echen
This commit is contained in:
parent
215693c2b0
commit
9097c85589
@ -69,6 +69,24 @@ IccContact::Create(mozContact& aMozContact, nsIIccContact** aIccContact)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*static*/ nsresult
|
||||
IccContact::Create(const nsAString& aId,
|
||||
const nsTArray<nsString>& aNames,
|
||||
const nsTArray<nsString>& aNumbers,
|
||||
const nsTArray<nsString>& aEmails,
|
||||
nsIIccContact** aIccContact)
|
||||
{
|
||||
*aIccContact = nullptr;
|
||||
|
||||
nsCOMPtr<nsIIccContact> iccContact = new IccContact(aId,
|
||||
aNames,
|
||||
aNumbers,
|
||||
aEmails);
|
||||
iccContact.forget(aIccContact);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
IccContact::IccContact(const nsAString& aId,
|
||||
const nsTArray<nsString>& aNames,
|
||||
const nsTArray<nsString>& aNumbers,
|
||||
|
@ -22,6 +22,13 @@ public:
|
||||
Create(mozContact& aMozContact,
|
||||
nsIIccContact** aIccContact);
|
||||
|
||||
static nsresult
|
||||
Create(const nsAString& aId,
|
||||
const nsTArray<nsString>& aNames,
|
||||
const nsTArray<nsString>& aNumbers,
|
||||
const nsTArray<nsString>& aEmails,
|
||||
nsIIccContact** aIccContact);
|
||||
|
||||
private:
|
||||
IccContact(const nsAString& aId,
|
||||
const nsTArray<nsString>& aNames,
|
||||
|
@ -4,8 +4,9 @@
|
||||
* 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/icc/IccChild.h"
|
||||
#include "IccInfo.h"
|
||||
#include "mozilla/dom/icc/IccChild.h"
|
||||
#include "mozilla/dom/icc/IccIPCUtils.h"
|
||||
#include "nsIStkCmdFactory.h"
|
||||
#include "nsIStkProactiveCmd.h"
|
||||
|
||||
@ -365,6 +366,31 @@ IccChild::SendStkEventDownload(nsIStkDownloadEvent* aEvent)
|
||||
return PIccChild::SendStkEventDownload(event) ? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
IccChild::ReadContacts(uint32_t aContactType, nsIIccCallback* aRequestReply)
|
||||
{
|
||||
return SendRequest(ReadContactsRequest(aContactType),
|
||||
aRequestReply)
|
||||
? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
IccChild::UpdateContact(uint32_t aContactType, nsIIccContact* aContact,
|
||||
const nsAString& aPin2,
|
||||
nsIIccCallback* aRequestReply)
|
||||
{
|
||||
MOZ_ASSERT(aContact);
|
||||
|
||||
IccContactData contactData;
|
||||
IccIPCUtils::GetIccContactDataFromIccContact(aContact, contactData);
|
||||
|
||||
return SendRequest(UpdateContactRequest(aContactType,
|
||||
nsAutoString(aPin2),
|
||||
contactData),
|
||||
aRequestReply)
|
||||
? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
/**
|
||||
* PIccRequestChild Implementation.
|
||||
*/
|
||||
@ -407,6 +433,42 @@ IccRequestChild::Recv__delete__(const IccReply& aResponse)
|
||||
mRequestReply->NotifyCardLockError(error.message(),
|
||||
error.retryCount()));
|
||||
}
|
||||
case IccReply::TIccReplyReadContacts: {
|
||||
const nsTArray<IccContactData>& data
|
||||
= aResponse.get_IccReplyReadContacts().contacts();
|
||||
|
||||
uint32_t count = data.Length();
|
||||
nsCOMArray<nsIIccContact> contactList;
|
||||
nsresult rv;
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
nsCOMPtr<nsIIccContact> contact;
|
||||
rv = IccContact::Create(data[i].id(),
|
||||
data[i].names(),
|
||||
data[i].numbers(),
|
||||
data[i].emails(),
|
||||
getter_AddRefs(contact));
|
||||
NS_ENSURE_SUCCESS(rv, false);
|
||||
contactList.AppendElement(contact);
|
||||
}
|
||||
|
||||
rv = mRequestReply->NotifyRetrievedIccContacts(contactList.Elements(),
|
||||
count);
|
||||
|
||||
return NS_SUCCEEDED(rv);
|
||||
}
|
||||
case IccReply::TIccReplyUpdateContact: {
|
||||
IccContactData data
|
||||
= aResponse.get_IccReplyUpdateContact().contact();
|
||||
nsCOMPtr<nsIIccContact> contact;
|
||||
IccContact::Create(data.id(),
|
||||
data.names(),
|
||||
data.numbers(),
|
||||
data.emails(),
|
||||
getter_AddRefs(contact));
|
||||
|
||||
return NS_SUCCEEDED(
|
||||
mRequestReply->NotifyUpdatedIccContact(contact));
|
||||
}
|
||||
default:
|
||||
MOZ_CRASH("Received invalid response type!");
|
||||
}
|
||||
|
86
dom/icc/ipc/IccIPCUtils.cpp
Normal file
86
dom/icc/ipc/IccIPCUtils.cpp
Normal file
@ -0,0 +1,86 @@
|
||||
/* 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/icc/IccIPCUtils.h"
|
||||
#include "mozilla/dom/icc/PIccTypes.h"
|
||||
#include "nsIIccContact.h"
|
||||
#include "nsIIccInfo.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
namespace icc {
|
||||
|
||||
/*static*/ void
|
||||
IccIPCUtils::GetIccInfoDataFromIccInfo(nsIIccInfo* aInInfo,
|
||||
IccInfoData& aOutData)
|
||||
{
|
||||
aInInfo->GetIccType(aOutData.iccType());
|
||||
aInInfo->GetIccid(aOutData.iccid());
|
||||
aInInfo->GetMcc(aOutData.mcc());
|
||||
aInInfo->GetMnc(aOutData.mnc());
|
||||
aInInfo->GetSpn(aOutData.spn());
|
||||
aInInfo->GetIsDisplayNetworkNameRequired(
|
||||
&aOutData.isDisplayNetworkNameRequired());
|
||||
aInInfo->GetIsDisplaySpnRequired(
|
||||
&aOutData.isDisplaySpnRequired());
|
||||
|
||||
nsCOMPtr<nsIGsmIccInfo> gsmIccInfo(do_QueryInterface(aInInfo));
|
||||
if (gsmIccInfo) {
|
||||
gsmIccInfo->GetMsisdn(aOutData.phoneNumber());
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICdmaIccInfo> cdmaIccInfo(do_QueryInterface(aInInfo));
|
||||
if (cdmaIccInfo) {
|
||||
cdmaIccInfo->GetMdn(aOutData.phoneNumber());
|
||||
cdmaIccInfo->GetPrlVersion(&aOutData.prlVersion());
|
||||
}
|
||||
}
|
||||
|
||||
/*static*/ void
|
||||
IccIPCUtils::GetIccContactDataFromIccContact(nsIIccContact* aContact,
|
||||
IccContactData& aOutData){
|
||||
// Id
|
||||
nsresult rv = aContact->GetId(aOutData.id());
|
||||
NS_ENSURE_SUCCESS_VOID(rv);
|
||||
|
||||
// Names
|
||||
char16_t** rawStringArray = nullptr;
|
||||
uint32_t count = 0;
|
||||
rv = aContact->GetNames(&count, &rawStringArray);
|
||||
NS_ENSURE_SUCCESS_VOID(rv);
|
||||
if (count > 0) {
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
aOutData.names().AppendElement(nsDependentString(rawStringArray[i]));
|
||||
}
|
||||
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count, rawStringArray);
|
||||
}
|
||||
|
||||
// Numbers
|
||||
rawStringArray = nullptr;
|
||||
count = 0;
|
||||
rv = aContact->GetNumbers(&count, &rawStringArray);
|
||||
NS_ENSURE_SUCCESS_VOID(rv);
|
||||
if (count > 0) {
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
aOutData.numbers().AppendElement(nsDependentString(rawStringArray[i]));
|
||||
}
|
||||
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count, rawStringArray);
|
||||
}
|
||||
|
||||
// Emails
|
||||
rawStringArray = nullptr;
|
||||
count = 0;
|
||||
rv = aContact->GetEmails(&count, &rawStringArray);
|
||||
NS_ENSURE_SUCCESS_VOID(rv);
|
||||
if (count > 0) {
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
aOutData.emails().AppendElement(nsDependentString(rawStringArray[i]));
|
||||
}
|
||||
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count, rawStringArray);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace icc
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
35
dom/icc/ipc/IccIPCUtils.h
Normal file
35
dom/icc/ipc/IccIPCUtils.h
Normal file
@ -0,0 +1,35 @@
|
||||
/* 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_icc_IccIPCUtils_h
|
||||
#define mozilla_dom_icc_IccIPCUtils_h
|
||||
|
||||
class nsIIccContact;
|
||||
class nsIIccInfo;
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
namespace icc {
|
||||
|
||||
class IccInfoData;
|
||||
class IccContactData;
|
||||
|
||||
class IccIPCUtils
|
||||
{
|
||||
public:
|
||||
static void GetIccInfoDataFromIccInfo(nsIIccInfo* aInInfo,
|
||||
IccInfoData& aOutData);
|
||||
static void GetIccContactDataFromIccContact(nsIIccContact* aContact,
|
||||
IccContactData& aOutData);
|
||||
|
||||
private:
|
||||
IccIPCUtils() {}
|
||||
virtual ~IccIPCUtils() {}
|
||||
};
|
||||
|
||||
} // namespace icc
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_icc_IccIPCUtils_h
|
@ -4,47 +4,16 @@
|
||||
* 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/icc/IccIPCUtils.h"
|
||||
#include "mozilla/dom/icc/IccParent.h"
|
||||
#include "IccInfo.h"
|
||||
#include "nsIIccService.h"
|
||||
#include "nsIStkCmdFactory.h"
|
||||
#include "nsIStkProactiveCmd.h"
|
||||
|
||||
|
||||
using mozilla::dom::IccInfo;
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
namespace icc {
|
||||
|
||||
namespace {
|
||||
|
||||
static void
|
||||
GetIccInfoDataFromIccInfo(nsIIccInfo* aInInfo, IccInfoData& aOutData) {
|
||||
aInInfo->GetIccType(aOutData.iccType());
|
||||
aInInfo->GetIccid(aOutData.iccid());
|
||||
aInInfo->GetMcc(aOutData.mcc());
|
||||
aInInfo->GetMnc(aOutData.mnc());
|
||||
aInInfo->GetSpn(aOutData.spn());
|
||||
aInInfo->GetIsDisplayNetworkNameRequired(
|
||||
&aOutData.isDisplayNetworkNameRequired());
|
||||
aInInfo->GetIsDisplaySpnRequired(
|
||||
&aOutData.isDisplaySpnRequired());
|
||||
|
||||
nsCOMPtr<nsIGsmIccInfo> gsmIccInfo(do_QueryInterface(aInInfo));
|
||||
if (gsmIccInfo) {
|
||||
gsmIccInfo->GetMsisdn(aOutData.phoneNumber());
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICdmaIccInfo> cdmaIccInfo(do_QueryInterface(aInInfo));
|
||||
if (cdmaIccInfo) {
|
||||
cdmaIccInfo->GetMdn(aOutData.phoneNumber());
|
||||
cdmaIccInfo->GetPrlVersion(&aOutData.prlVersion());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
/**
|
||||
* PIccParent Implementation.
|
||||
*/
|
||||
@ -89,7 +58,7 @@ IccParent::RecvInit(OptionalIccInfoData* aInfoData,
|
||||
|
||||
if (iccInfo) {
|
||||
IccInfoData data;
|
||||
GetIccInfoDataFromIccInfo(iccInfo, data);
|
||||
IccIPCUtils::GetIccInfoDataFromIccInfo(iccInfo, data);
|
||||
*aInfoData = OptionalIccInfoData(data);
|
||||
|
||||
return true;
|
||||
@ -209,6 +178,10 @@ IccParent::RecvPIccRequestConstructor(PIccRequestParent* aActor,
|
||||
return actor->DoRequest(aRequest.get_MatchMvnoRequest());
|
||||
case IccRequest::TGetServiceStateEnabledRequest:
|
||||
return actor->DoRequest(aRequest.get_GetServiceStateEnabledRequest());
|
||||
case IccRequest::TReadContactsRequest:
|
||||
return actor->DoRequest(aRequest.get_ReadContactsRequest());
|
||||
case IccRequest::TUpdateContactRequest:
|
||||
return actor->DoRequest(aRequest.get_UpdateContactRequest());
|
||||
default:
|
||||
MOZ_CRASH("Received invalid request type!");
|
||||
}
|
||||
@ -269,7 +242,7 @@ IccParent::NotifyIccInfoChanged()
|
||||
}
|
||||
|
||||
IccInfoData data;
|
||||
GetIccInfoDataFromIccInfo(iccInfo, data);
|
||||
IccIPCUtils::GetIccInfoDataFromIccInfo(iccInfo, data);
|
||||
|
||||
return SendNotifyIccInfoChanged(OptionalIccInfoData(data))
|
||||
? NS_OK : NS_ERROR_FAILURE;
|
||||
@ -347,6 +320,30 @@ IccRequestParent::DoRequest(const GetServiceStateEnabledRequest& aRequest)
|
||||
this));
|
||||
}
|
||||
|
||||
bool
|
||||
IccRequestParent::DoRequest(const ReadContactsRequest& aRequest)
|
||||
{
|
||||
return NS_SUCCEEDED(mIcc->ReadContacts(aRequest.contactType(),
|
||||
this));
|
||||
}
|
||||
|
||||
bool
|
||||
IccRequestParent::DoRequest(const UpdateContactRequest& aRequest)
|
||||
{
|
||||
nsCOMPtr<nsIIccContact> contact;
|
||||
nsresult rv = IccContact::Create(aRequest.contact().id(),
|
||||
aRequest.contact().names(),
|
||||
aRequest.contact().numbers(),
|
||||
aRequest.contact().emails(),
|
||||
getter_AddRefs(contact));
|
||||
NS_ENSURE_SUCCESS(rv, false);
|
||||
|
||||
return NS_SUCCEEDED(mIcc->UpdateContact(aRequest.contactType(),
|
||||
contact,
|
||||
aRequest.pin2(),
|
||||
this));
|
||||
}
|
||||
|
||||
nsresult
|
||||
IccRequestParent::SendReply(const IccReply& aReply)
|
||||
{
|
||||
@ -392,6 +389,36 @@ IccRequestParent::NotifyCardLockError(const nsAString & aErrorMsg,
|
||||
return SendReply(IccReplyCardLockError(aRetryCount, nsAutoString(aErrorMsg)));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
IccRequestParent::NotifyRetrievedIccContacts(nsIIccContact** aContacts,
|
||||
unsigned int aCount)
|
||||
{
|
||||
nsTArray<IccContactData> contacts;
|
||||
|
||||
for (uint32_t i = 0; i < aCount; i++) {
|
||||
MOZ_ASSERT(aContacts[i]);
|
||||
|
||||
IccContactData contactData;
|
||||
|
||||
IccIPCUtils::GetIccContactDataFromIccContact(aContacts[i], contactData);
|
||||
contacts.AppendElement(contactData);
|
||||
}
|
||||
|
||||
return SendReply(IccReplyReadContacts(contacts));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
IccRequestParent::NotifyUpdatedIccContact(nsIIccContact* aContact)
|
||||
{
|
||||
MOZ_ASSERT(aContact);
|
||||
|
||||
IccContactData contactData;
|
||||
|
||||
IccIPCUtils::GetIccContactDataFromIccContact(aContact, contactData);
|
||||
|
||||
return SendReply(IccReplyUpdateContact(contactData));
|
||||
}
|
||||
|
||||
} // namespace icc
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
@ -110,6 +110,12 @@ private:
|
||||
bool
|
||||
DoRequest(const GetServiceStateEnabledRequest& aRequest);
|
||||
|
||||
bool
|
||||
DoRequest(const ReadContactsRequest& aRequest);
|
||||
|
||||
bool
|
||||
DoRequest(const UpdateContactRequest& aRequest);
|
||||
|
||||
nsresult
|
||||
SendReply(const IccReply& aReply);
|
||||
|
||||
|
@ -60,6 +60,18 @@ struct GetServiceStateEnabledRequest
|
||||
uint32_t service;
|
||||
};
|
||||
|
||||
struct ReadContactsRequest
|
||||
{
|
||||
uint32_t contactType;
|
||||
};
|
||||
|
||||
struct UpdateContactRequest
|
||||
{
|
||||
uint32_t contactType;
|
||||
nsString pin2;
|
||||
IccContactData contact;
|
||||
};
|
||||
|
||||
union IccRequest
|
||||
{
|
||||
GetCardLockEnabledRequest;
|
||||
@ -69,6 +81,8 @@ union IccRequest
|
||||
GetCardLockRetryCountRequest;
|
||||
MatchMvnoRequest;
|
||||
GetServiceStateEnabledRequest;
|
||||
ReadContactsRequest;
|
||||
UpdateContactRequest;
|
||||
};
|
||||
|
||||
sync protocol PIcc
|
||||
|
@ -34,12 +34,24 @@ struct IccReplyCardLockError
|
||||
nsString message;
|
||||
};
|
||||
|
||||
struct IccReplyReadContacts
|
||||
{
|
||||
IccContactData[] contacts;
|
||||
};
|
||||
|
||||
struct IccReplyUpdateContact
|
||||
{
|
||||
IccContactData contact;
|
||||
};
|
||||
|
||||
union IccReply
|
||||
{
|
||||
// Success
|
||||
IccReplySuccess;
|
||||
IccReplySuccessWithBoolean;
|
||||
IccReplyCardLockRetryCount;
|
||||
IccReplyReadContacts;
|
||||
IccReplyUpdateContact;
|
||||
// Error
|
||||
IccReplyError;
|
||||
IccReplyCardLockError;
|
||||
|
@ -19,6 +19,14 @@ struct IccInfoData
|
||||
int32_t prlVersion;
|
||||
};
|
||||
|
||||
struct IccContactData
|
||||
{
|
||||
nsString id;
|
||||
nsString[] names;
|
||||
nsString[] numbers;
|
||||
nsString[] emails;
|
||||
};
|
||||
|
||||
} // namespace icc
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
@ -15,7 +15,8 @@ EXPORTS.mozilla.dom += [
|
||||
|
||||
EXPORTS.mozilla.dom.icc += [
|
||||
'ipc/IccChild.h',
|
||||
'ipc/IccParent.h',
|
||||
'ipc/IccIPCUtils.h',
|
||||
'ipc/IccParent.h'
|
||||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
@ -29,6 +30,7 @@ UNIFIED_SOURCES += [
|
||||
'IccManager.cpp',
|
||||
'ipc/IccChild.cpp',
|
||||
'ipc/IccIPCService.cpp',
|
||||
'ipc/IccIPCUtils.cpp',
|
||||
'ipc/IccParent.cpp',
|
||||
]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user