Bug 1114937 - Part 4: IPDL Implementation. r=echen

This commit is contained in:
Bevis Tseng 2015-06-16 17:41:47 +08:00
parent 215693c2b0
commit 9097c85589
11 changed files with 313 additions and 36 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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!");
}

View 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
View 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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',
]