!2437 修复VCard单双导入导出一致性

Merge pull request !2437 from mayuecheng/vcard_release_1111
This commit is contained in:
openharmony_ci 2024-11-14 02:25:38 +00:00 committed by Gitee
commit 908c451bb4
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
10 changed files with 137 additions and 39 deletions

View File

@ -46,7 +46,7 @@ bool NrSsbInformation::Marshalling(Parcel &parcel) const
if (!parcel.WriteInt32(timeAdvance_)) {
return false;
}
for (int32_t i = 0; i < SCELL_SSB_LIST; ++i) {
for (int32_t i = 0; i < SCELL_SSB_LIST && i < static_cast<int32_t>(sCellSsbList_.size()); ++i) {
if (!parcel.WriteInt32(sCellSsbList_[i].ssbId)) {
return false;
}

View File

@ -77,6 +77,7 @@ constexpr const char *VCARD_TYPE_X_SKYPE_USERNAME = "X-SKYPE-USERNAME";
constexpr const char *VCARD_TYPE_X_QQ = "X-QQ";
constexpr const char *VCARD_TYPE_X_NETMEETING = "X-NETMEETING";
constexpr const char *VCARD_TYPE_X_SKYPE_PSTNNUMBER = "X-SKYPE-PSTNNUMBER";
constexpr const char *VCARD_TYPE_X_HUANLIAO = "X-HUANLIAO";
constexpr const char *VCARD_TYPE_X_CLASS = "X-CLASS";
constexpr const char *VCARD_TYPE_X_REDUCTION = "X-REDUCTION";
@ -84,6 +85,10 @@ constexpr const char *VCARD_TYPE_X_NO = "X-NO";
constexpr const char *VCARD_TYPE_X_DCM_HMN_MODE = "X-DCM-HMN-MODE";
constexpr const char *VCARD_TYPE_X_OHOS_CUSTOM = "X_OHOS_CUSTOM";
constexpr const char *VCARD_TYPE_X_MOBILE_CUSTOM = "X-OHOS-CUSTOM";
constexpr const char *VCARD_TYPE_X_MOBILE_RELATION = "RELATION";
constexpr const char *VCARD_TYPE_X_MOBILE_EVENTS = "CONTACT_EVENT";
constexpr const char *VCARD_PARAM_TYPE = "TYPE";
constexpr const char *VCARD_PARAM_X_IRMC_N = "X-IRMC-N";
@ -161,7 +166,7 @@ constexpr const int32_t CONTACTS_NOT_DELETED = 0;
constexpr const int32_t ENCODEN_QUOTED_PRIN_MAX_LEN = 67;
constexpr const int32_t NUM_MINUS_ONE = -1;
constexpr const int32_t DECODE_CHAR_MAX_SIZE = 16;
constexpr const int32_t BATCH_INSERT_MAX_SIZE = 300;
constexpr const int32_t BATCH_INSERT_MAX_SIZE = 100;
constexpr const int32_t INT_64_LENTGH = 19;
class TypeId {
@ -251,6 +256,7 @@ public:
static constexpr const char *CITY = "city";
static constexpr const char *POSITION = "position";
static constexpr const char *PHONETIC_NAME = "phonetic_name";
static constexpr const char *BLOB_DATA = "blob_data";
};
enum class EmailType {
@ -292,17 +298,29 @@ enum class EventType {
/**
* Indicates an anniversary event.
*/
EVENT_ANNIVERSARY = 1,
EVENT_ANNIVERSARY = 3,
/**
* Indicates an event of the OTHER type.
*/
EVENT_OTHER = 2,
EVENT_OTHER = 4,
/**
* Indicates an birthday event.
*/
EVENT_BIRTHDAY = 3,
EVENT_BIRTHDAY = 1,
/**
* Indicates a lunar birthday event.
*/
EVENT_LUNAR_BIRTHDAY = 2,
};
enum class EventHM4Type {
EVENT_HM4_ANNIVERSARY = 1,
EVENT_HM4_OTHER = 2,
EVENT_HM4_BIRTHDAY = 3,
EVENT_HM4_LUNAR_BIRTHDAY = 4,
};
enum class ImType {
@ -319,37 +337,42 @@ enum class ImType {
/**
* Indicates an AIM instant message.
*/
IM_AIM = 0,
IM_AIM = 1,
/**
* Indicates a Windows Live instant message.
*/
IM_MSN = 1,
IM_MSN = 2,
/**
* Indicates a Yahoo instant message.
*/
IM_YAHOO = 2,
IM_YAHOO = 3,
/**
* Indicates a Skype instant message.
*/
IM_SKYPE = 3,
IM_SKYPE = 4,
/**
* Indicates a QQ instant message.
*/
IM_QQ = 4,
IM_QQ = 5,
/**
* Indicates an ICQ instant message.
*/
IM_ICQ = 6,
IM_ICQ = 7,
/**
* Indicates a huanliao instant message.
*/
IM_HUANLIAO = 6,
/**
* Indicates a Jabber instant message.
*/
IM_JABBER = 7,
IM_JABBER = 8,
};
enum class PhoneVcType {
@ -527,7 +550,7 @@ enum class RelationType {
/**
* Indicates a custom label.
*/
CUSTOM_LABEL = 0,
CUSTOM_LABEL = 10000,
/**
* Indicates an assistant.

View File

@ -137,6 +137,8 @@ private:
std::map<std::string, std::vector<std::string>> parasMap);
std::vector<std::string> GetValueListFromParasMap(
std::string rawValue, std::string propValue, std::map<std::string, std::vector<std::string>> parasMap);
void CheckNameExist();
std::string ConvertHarmonyEvents(std::string type, std::string value);
private:
const int32_t SORT_NAME_MAX_VALUE_SIZE = 3;

View File

@ -22,7 +22,7 @@ namespace Telephony {
int32_t VCardPhotoData::BuildValuesBucket(OHOS::DataShare::DataShareValuesBucket &valuesBucket)
{
valuesBucket.Put(ContactData::TYPE_ID, TypeId::PHOTO);
valuesBucket.Put(ContactData::DETAIL_INFO, bytes_);
valuesBucket.Put(ContactData::BLOB_DATA, std::vector<uint8_t>(bytes_.begin(), bytes_.end()));
return TELEPHONY_SUCCESS;
}

View File

@ -85,6 +85,9 @@ void VCardPostalData::InitPostalData(std::vector<std::string> propValueList, int
pobox_ = dataArray[POBOX_VALUE_INDEX];
postalAddress_ = dataArray[POSTAL_ADDRESS_VALUE_INDEX];
street_ = dataArray[STREET_VALUE_INDEX];
if (!street_.empty() && postalAddress_.empty()) {
postalAddress_ = street_;
}
city_ = dataArray[CITY_VALUE_INDEX];
region_ = dataArray[REGION_VALUE_INDEX];
postCode_ = dataArray[POSTCODE_VALUE_INDEX];

View File

@ -16,6 +16,7 @@
#include <iomanip>
#include <set>
#include <map>
#include "telephony_errors.h"
#include "telephony_log_wrapper.h"
@ -377,8 +378,12 @@ int32_t VCardConstructor::ConstructRelation(std::shared_ptr<VCardContact> contac
if (relationData == nullptr) {
continue;
}
AddCustomType(TypeData::RELATION,
{ relationData->GetRelationName(), relationData->GetLabelId(), relationData->GetLabelName() });
std::string labelId = relationData->GetLabelId();
if (labelId == std::to_string(static_cast<int32_t>(RelationType::CUSTOM_LABEL))) {
labelId = std::to_string(VALUE_INDEX_ZERO);
}
AddCustomType(VCARD_TYPE_X_MOBILE_RELATION,
{ relationData->GetRelationName(), labelId, relationData->GetLabelName() });
}
return TELEPHONY_SUCCESS;
}
@ -387,7 +392,7 @@ void VCardConstructor::AddCustomType(const std::string &type, std::vector<std::s
{
bool needAddCharset = IsNeedCharsetParam(values);
bool needAddQuotedPrintable = needQP_ && !VCardUtils::IsPrintableAscii(values);
result_ << VCARD_TYPE_X_OHOS_CUSTOM;
result_ << VCARD_TYPE_X_MOBILE_CUSTOM;
AddCharsetOrQuotedPrintable(needAddCharset, needAddQuotedPrintable);
result_ << DATA_SEPARATOR << type;
for (auto value : values) {
@ -532,7 +537,7 @@ void VCardConstructor::AddPostalLine(
postalTypeStr = "X-" + labelName;
}
if (postalType == static_cast<int32_t>(PostalType::ADDR_OTHER)) {
postalTypeStr = "X-" + std::string(VCARD_PARAM_ADR_EXTRA_TYPE_OTHER);
postalTypeStr = "";
}
if (!postalTypeStr.empty()) {
paramTypes.push_back(postalTypeStr);
@ -699,23 +704,30 @@ int32_t VCardConstructor::ConstructEvents(std::shared_ptr<VCardContact> contact)
return TELEPHONY_ERR_LOCAL_PTR_NULL;
}
std::string birthdayDate = "";
std::map<int32_t, int32_t> eventMap = {
{static_cast<int32_t>(EventType::EVENT_ANNIVERSARY), static_cast<int32_t>(EventHM4Type::EVENT_HM4_ANNIVERSARY)},
{static_cast<int32_t>(EventType::EVENT_LUNAR_BIRTHDAY),
static_cast<int32_t>(EventHM4Type::EVENT_HM4_LUNAR_BIRTHDAY)},
{static_cast<int32_t>(EventType::CUSTOM_LABEL), static_cast<int32_t>(EventHM4Type::EVENT_HM4_OTHER)},
{static_cast<int32_t>(EventType::EVENT_BIRTHDAY), static_cast<int32_t>(EventHM4Type::EVENT_HM4_BIRTHDAY)}
};
for (auto eventData : contact->GetEventDatas()) {
if (eventData == nullptr) {
continue;
}
int32_t labelId = static_cast<int32_t>(EventType::EVENT_OTHER);
if (VCardUtils::IsNum(eventData->GetLabelId())) {
labelId = std::stoi(eventData->GetLabelId());
labelId = eventMap[std::stoi(eventData->GetLabelId())];
}
if (labelId == static_cast<int32_t>(EventType::EVENT_BIRTHDAY)) {
if (labelId == static_cast<int32_t>(EventHM4Type::EVENT_HM4_BIRTHDAY)) {
if (eventData->GetEventDate().empty()) {
continue;
}
birthdayDate = eventData->GetEventDate();
continue;
}
AddCustomType(
TypeData::CONTACT_EVENT, { eventData->GetEventDate(), eventData->GetLabelId(), eventData->GetLabelName() });
AddCustomType(VCARD_TYPE_X_MOBILE_EVENTS,
{ eventData->GetEventDate(), std::to_string(labelId), eventData->GetLabelName() });
}
VCardUtils::Trim(birthdayDate);
if (!birthdayDate.empty()) {
@ -793,6 +805,9 @@ void VCardConstructor::AddEmailLine(
if (emailType == static_cast<int32_t>(EmailType::CUSTOM_LABEL)) {
postalTypeStr = "X-" + labelName;
}
if (emailType == static_cast<int32_t>(EmailType::EMAIL_OTHER)) {
postalTypeStr = "";
}
if (!postalTypeStr.empty()) {
paramTypes.push_back(postalTypeStr);
}

View File

@ -98,18 +98,48 @@ void VCardContact::AddOtherDatas(std::string name, std::string rawValue, std::st
AddImppDatas(propValue, parasMap);
} else if (name == VCARD_TYPE_X_SIP) {
AddSipData(rawValue, parasMap, propValue);
} else if (name == VCARD_TYPE_X_OHOS_CUSTOM) {
} else if (name == VCARD_TYPE_X_OHOS_CUSTOM || name == VCARD_TYPE_X_MOBILE_CUSTOM) {
AddCustom(rawValue, parasMap, propValue);
} else if (name == VCARD_TYPE_X_AIM || name == VCARD_TYPE_X_MSN || name == VCARD_TYPE_X_YAHOO ||
name == VCARD_TYPE_X_ICQ || name == VCARD_TYPE_X_JABBER || name == VCARD_TYPE_X_QQ) {
name == VCARD_TYPE_X_ICQ || name == VCARD_TYPE_X_JABBER || name == VCARD_TYPE_X_QQ ||
name == VCARD_TYPE_X_SKYPE_USERNAME || name == VCARD_TYPE_X_HUANLIAO) {
AddIms(name, rawValue, propValue, values, parasMap);
} else {
TELEPHONY_LOGI("No need to do anything");
}
}
void VCardContact::CheckNameExist()
{
if (nameData_ == nullptr) {
return;
}
if (!nameData_->GetPrefix().empty() || !nameData_->GetFamily().empty() || !nameData_->GetMiddle().empty() ||
!nameData_->GetSuffix().empty() || !nameData_->GetFormatted().empty() || !nameData_->GetSort().empty() ||
!nameData_->GetFormatted().empty() || !nameData_->GetPhoneticFamily().empty() ||
!nameData_->GetPhoneticGiven().empty() || !nameData_->GetPhoneticMiddle().empty() ||
!nameData_->GetDisplayName().empty()) {
return;
}
for (auto data : phones_) {
if (data != nullptr && !data->GetNumber().empty()) {
TELEPHONY_LOGI("replace phone as name: %{public}s", data->GetNumber().c_str());
nameData_->setDispalyName(data->GetNumber());
return;
}
}
for (auto data : emails_) {
if (data != nullptr && !data->GetAddress().empty()) {
TELEPHONY_LOGI("replace email as name: %{public}s", data->GetAddress().c_str());
nameData_->setDispalyName(data->GetAddress());
return;
}
}
}
int32_t VCardContact::BuildContactData(int32_t rawId, std::vector<DataShare::DataShareValuesBucket> &contactDataValues)
{
CheckNameExist();
BuildValuesBucket(rawId, contactDataValues, nameData_);
if (!birthday_->GetBirthday().empty()) {
BuildValuesBucket(rawId, contactDataValues, birthday_);
@ -721,13 +751,15 @@ void VCardContact::AddCustom(
i++;
}
nicknames_.push_back(object);
} else if (type == TypeData::RELATION) {
} else if (type == TypeData::RELATION || type == VCARD_TYPE_X_MOBILE_RELATION) {
std::shared_ptr<VCardRelationData> object = std::make_shared<VCardRelationData>();
int i = 0;
for (std::string value : values) {
if (i == SIZE_ONE) {
object->SetRelationName(value);
} else if (i == SIZE_TWO) {
value = value == std::to_string(VALUE_INDEX_ZERO) ?
std::to_string(static_cast<int32_t>(RelationType::CUSTOM_LABEL)) : value;
object->SetLabelId(value);
} else if (i == SIZE_THREE) {
object->SetLabelName(value);
@ -736,13 +768,14 @@ void VCardContact::AddCustom(
i++;
}
relations_.push_back(object);
} else if (type == TypeData::CONTACT_EVENT) {
} else if (type == TypeData::CONTACT_EVENT || type == VCARD_TYPE_X_MOBILE_EVENTS) {
std::shared_ptr<VCardEventData> object = std::make_shared<VCardEventData>();
int i = 0;
for (std::string value : values) {
if (i == SIZE_ONE) {
object->SetEventDate(value);
} else if (i == SIZE_TWO) {
value = ConvertHarmonyEvents(type, value);
object->SetLabelId(value);
} else if (i == SIZE_THREE) {
object->SetLabelName(value);
@ -754,6 +787,24 @@ void VCardContact::AddCustom(
}
}
std::string VCardContact::ConvertHarmonyEvents(std::string type, std::string value)
{
if (type != VCARD_TYPE_X_MOBILE_EVENTS) {
return value;
}
std::string convertedValue = value;
if (value == std::to_string(static_cast<int32_t>(EventHM4Type::EVENT_HM4_ANNIVERSARY))) {
convertedValue = std::to_string(static_cast<int32_t>(EventType::EVENT_ANNIVERSARY));
}
if (value == std::to_string(static_cast<int32_t>(EventHM4Type::EVENT_HM4_OTHER))) {
convertedValue = std::to_string(static_cast<int32_t>(EventType::EVENT_OTHER));
}
if (value == std::to_string(static_cast<int32_t>(EventHM4Type::EVENT_HM4_LUNAR_BIRTHDAY))) {
convertedValue = std::to_string(static_cast<int32_t>(EventType::EVENT_LUNAR_BIRTHDAY));
}
return convertedValue;
}
void VCardContact::SetSip(
std::string rawValue, std::map<std::string, std::vector<std::string>> parasMap, std::string propValue)
{
@ -896,8 +947,8 @@ void VCardContact::AddEmailsData(std::string rawValue, std::string propValue, st
std::vector<std::string> typeCollection;
std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE);
if (it == parasMap.end()) {
TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE);
return;
TELEPHONY_LOGI("Map does not contain this key, %{public}s, use OTHER type", VCARD_PARAM_TYPE);
// contains no type info will fallback to OTHER type
} else {
typeCollection = it->second;
}
@ -952,8 +1003,8 @@ void VCardContact::AddPostalDatas(std::string rawValue, std::string propValue, s
std::vector<std::string> typeCollection;
std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE);
if (it == parasMap.end()) {
TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE);
return;
TELEPHONY_LOGI("Map does not contain this key, %{public}s, use OTHER type", VCARD_PARAM_TYPE);
// contains no type info will fallback to OTHER type
} else {
typeCollection = it->second;
}
@ -984,7 +1035,7 @@ void VCardContact::AddPostalDatas(std::string rawValue, std::string propValue, s
TELEPHONY_LOGI("No need to do anything");
}
}
AddPostal(type < 0 ? static_cast<int32_t>(PostalType::ADDR_HOME) : type, values, label, isPrimary);
AddPostal(type < 0 ? static_cast<int32_t>(PostalType::ADDR_OTHER) : type, values, label, isPrimary);
}
void VCardContact::AddSoundDatas(std::string rawValue, std::string propValue, std::vector<std::string> values,

View File

@ -739,7 +739,7 @@ std::string VCardDecoderV21::GetBase64(const std::string &value, int32_t &errorC
str += value;
while (true) {
std::string line = PeekLine();
if (line.empty()) {
if (line[0] != ' ') {
break;
}
std::string nameUp = getUpperName(line);

View File

@ -196,7 +196,6 @@ void VCardManager::BatchInsertContactData(
std::vector<DataShare::DataShareValuesBucket> contactDataValues;
for (size_t i = 0; i < rawIds.size(); i++) {
int32_t rawId = rawIds[i];
TELEPHONY_LOGI("rawId %{public}d", rawId);
std::shared_ptr<VCardContact> contact = contactList[i];
if (contact == nullptr) {
errorCode = TELEPHONY_ERROR;

View File

@ -37,9 +37,10 @@ namespace {
std::map<ImType, std::string> imLabelIdToType = { { ImType::IM_AIM, VCARD_TYPE_X_AIM },
{ ImType::IM_MSN, VCARD_TYPE_X_MSN }, { ImType::IM_YAHOO, VCARD_TYPE_X_YAHOO },
{ ImType::IM_ICQ, VCARD_TYPE_X_ICQ }, { ImType::IM_JABBER, VCARD_TYPE_X_JABBER },
{ ImType::IM_SKYPE, VCARD_TYPE_X_SKYPE_USERNAME }, { ImType::IM_QQ, VCARD_TYPE_X_QQ } };
std::map<PhoneVcType, std::string> phoneLabelIdToType = { { PhoneVcType::NUM_HOME, VCARD_PARAM_TYPE_HOME },
{ PhoneVcType::NUM_MOBILE, VCARD_PARAM_TYPE_CELL }, { PhoneVcType::NUM_WORK, VCARD_PARAM_TYPE_WORK },
{ ImType::IM_SKYPE, VCARD_TYPE_X_SKYPE_USERNAME }, { ImType::IM_QQ, VCARD_TYPE_X_QQ },
{ ImType::IM_HUANLIAO, VCARD_TYPE_X_HUANLIAO} };
std::map<PhoneVcType, std::string> phoneLabelIdToType = { { PhoneVcType::NUM_HOME, VCARD_PARAM_TYPE_CELL },
{ PhoneVcType::NUM_MOBILE, VCARD_PARAM_TYPE_HOME }, { PhoneVcType::NUM_WORK, VCARD_PARAM_TYPE_WORK },
{ PhoneVcType::NUM_PAGER, VCARD_PARAM_TYPE_PAGER }, { PhoneVcType::NUM_OTHER, VCARD_PARAM_TYPE_VOICE },
{ PhoneVcType::NUM_CALLBACK, VCARD_PARAM_PHONE_EXTRA_TYPE_CALLBACK },
{ PhoneVcType::NUM_CAR, VCARD_PARAM_TYPE_CAR }, { PhoneVcType::NUM_COMPANY_MAIN, VCARD_PARAM_TYPE_WORK },
@ -47,11 +48,11 @@ std::map<PhoneVcType, std::string> phoneLabelIdToType = { { PhoneVcType::NUM_HOM
{ PhoneVcType::NUM_RADIO, VCARD_PARAM_PHONE_EXTRA_TYPE_RADIO }, { PhoneVcType::NUM_TELEX, VCARD_PARAM_TYPE_TLX },
{ PhoneVcType::NUM_TTY_TDD, VCARD_PARAM_PHONE_EXTRA_TYPE_TTY_TDD },
{ PhoneVcType::NUM_ASSISTANT, VCARD_PARAM_PHONE_EXTRA_TYPE_ASSISTANT },
{ PhoneVcType::NUM_MMS, VCARD_PARAM_TYPE_MSG } };
{ PhoneVcType::NUM_MMS, VCARD_PARAM_TYPE_MSG }, { PhoneVcType::NUM_MAIN, VCARD_PARAM_TYPE_PREF }};
std::map<std::string, PhoneVcType> typeToPhoneTypeMap = { { VCARD_PARAM_TYPE_CAR, PhoneVcType::NUM_CAR },
{ VCARD_PARAM_TYPE_PAGER, PhoneVcType::NUM_PAGER }, { VCARD_PARAM_TYPE_ISDN, PhoneVcType::NUM_ISDN },
{ VCARD_PARAM_TYPE_HOME, PhoneVcType::NUM_HOME }, { VCARD_PARAM_TYPE_WORK, PhoneVcType::NUM_WORK },
{ VCARD_PARAM_TYPE_CELL, PhoneVcType::NUM_MOBILE },
{ VCARD_PARAM_TYPE_HOME, PhoneVcType::NUM_MOBILE }, { VCARD_PARAM_TYPE_WORK, PhoneVcType::NUM_WORK },
{ VCARD_PARAM_TYPE_CELL, PhoneVcType::NUM_HOME },
{ VCARD_PARAM_PHONE_EXTRA_TYPE_CALLBACK, PhoneVcType::NUM_CALLBACK },
{ VCARD_PARAM_PHONE_EXTRA_TYPE_RADIO, PhoneVcType::NUM_RADIO },
{ VCARD_PARAM_PHONE_EXTRA_TYPE_TTY_TDD, PhoneVcType::NUM_TTY_TDD },
@ -282,6 +283,10 @@ int32_t VCardUtils::GetLabelIdFromImType(std::string type)
return static_cast<int32_t>(ImType::IM_JABBER);
} else if (type == VCARD_TYPE_X_QQ) {
return static_cast<int32_t>(ImType::IM_QQ);
} else if (type == VCARD_TYPE_X_SKYPE_USERNAME) {
return static_cast<int32_t>(ImType::IM_SKYPE);
} else if (type == VCARD_TYPE_X_HUANLIAO) {
return static_cast<int32_t>(ImType::IM_HUANLIAO);
} else {
return static_cast<int32_t>(ImType::CUSTOM_LABEL);
}