1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #include "vcard_contact.h" 16 17 #include <numeric> 18 19 #include "telephony_errors.h" 20 #include "telephony_log_wrapper.h" 21 #include "vcard_configuration.h" 22 #include "vcard_utils.h" 23 24 namespace OHOS { 25 namespace Telephony { 26 std::mutex mutex_; Init()27 void VCardContact::Init() {} 28 AddRawData(std::shared_ptr<VCardRawData> rawData,int32_t & errorCode)29 void VCardContact::AddRawData(std::shared_ptr<VCardRawData> rawData, int32_t &errorCode) 30 { 31 if (rawData == nullptr) { 32 return; 33 } 34 std::string name; 35 std::string rawValue; 36 std::string byte; 37 std::vector<std::string> values; 38 std::vector<std::string> groups; 39 std::map<std::string, std::vector<std::string>> parasMap; 40 name = rawData->GetName(); 41 rawValue = rawData->GetRawValue(); 42 byte = rawData->GetByte(); 43 values = rawData->GetValue(); 44 groups = rawData->GetGroup(); 45 parasMap = rawData->GetParasMap(); 46 if (values.size() == 0 && byte.empty()) { 47 return; 48 } 49 std::string propValue = (values.size() != 0) ? VCardUtils::TrimListToString(values) : ""; 50 AddDatas(name, rawValue, byte, values, propValue, groups, parasMap); 51 } 52 AddDatas(std::string name,std::string rawValue,std::string byte,std::vector<std::string> values,std::string propValue,std::vector<std::string> groups,std::map<std::string,std::vector<std::string>> parasMap)53 void VCardContact::AddDatas(std::string name, std::string rawValue, std::string byte, std::vector<std::string> values, 54 std::string propValue, std::vector<std::string> groups, std::map<std::string, std::vector<std::string>> parasMap) 55 { 56 std::lock_guard<std::mutex> lock(mutex_); 57 if (name == VCARD_TYPE_VERSION) { 58 vCardType_ = rawValue; 59 } else if (name == VCARD_TYPE_FN || name == VCARD_TYPE_NAME || name == VCARD_TYPE_N || 60 name == VCARD_TYPE_SORT_STRING || name == VCARD_TYPE_X_PHONETIC_FIRST_NAME || 61 name == VCARD_TYPE_X_PHONETIC_LAST_NAME || name == VCARD_TYPE_X_PHONETIC_MIDDLE_NAME) { 62 AddNameData(name, rawValue, values, parasMap, propValue); 63 } else if (name == VCARD_TYPE_NICKNAME) { 64 HandleNickName(propValue); 65 } else if (name == VCARD_TYPE_SOUND) { 66 AddSoundDatas(rawValue, propValue, values, parasMap); 67 } else if (name == VCARD_TYPE_ADR) { 68 AddPostalDatas(rawValue, propValue, values, parasMap); 69 } else if (name == VCARD_TYPE_EMAIL) { 70 AddEmailsData(rawValue, propValue, values, parasMap); 71 } else if (name == VCARD_TYPE_ORG) { 72 AddOrganizationsData(rawValue, propValue, values, parasMap); 73 } else if (name == VCARD_TYPE_TITLE) { 74 HandleTitleValue((parasMap.size() != 0) ? propValue : rawValue); 75 } else if (name == VCARD_TYPE_PHOTO || name == VCARD_TYPE_LOGO) { 76 AddPhotoDatas(byte, rawValue, propValue, values, parasMap); 77 } else if (name == VCARD_TYPE_TEL) { 78 AddPhonesData(rawValue, propValue, values, parasMap); 79 } 80 AddOtherDatas(name, rawValue, byte, values, propValue, groups, parasMap); 81 } 82 AddOtherDatas(std::string name,std::string rawValue,std::string byte,std::vector<std::string> values,std::string propValue,std::vector<std::string> groups,std::map<std::string,std::vector<std::string>> parasMap)83 void VCardContact::AddOtherDatas(std::string name, std::string rawValue, std::string byte, 84 std::vector<std::string> values, std::string propValue, std::vector<std::string> groups, 85 std::map<std::string, std::vector<std::string>> parasMap) 86 { 87 if (name == VCARD_TYPE_X_SKYPE_PSTNNUMBER) { 88 AddSkypePstnNumDatas(propValue, parasMap); 89 } else if (name == VCARD_TYPE_NOTE) { 90 AddNote((parasMap.size() != 0) ? propValue : rawValue); 91 } else if (name == VCARD_TYPE_URL) { 92 AddWebSiteDatas(rawValue, propValue, values, parasMap); 93 } else if (name == VCARD_TYPE_BDAY) { 94 AddBirthdayDatas(rawValue); 95 } else if (name == VCARD_TYPE_ANNIVERSARY) { 96 AddAnniversaryDatas(propValue); 97 } else if (name == VCARD_TYPE_IMPP) { 98 AddImppDatas(propValue, parasMap); 99 } else if (name == VCARD_TYPE_X_SIP) { 100 AddSipData(rawValue, parasMap, propValue); 101 } else if (name == VCARD_TYPE_X_OHOS_CUSTOM || name == VCARD_TYPE_X_MOBILE_CUSTOM) { 102 AddCustom(rawValue, parasMap, propValue); 103 } else if (name == VCARD_TYPE_X_AIM || name == VCARD_TYPE_X_MSN || name == VCARD_TYPE_X_YAHOO || 104 name == VCARD_TYPE_X_ICQ || name == VCARD_TYPE_X_JABBER || name == VCARD_TYPE_X_QQ || 105 name == VCARD_TYPE_X_SKYPE_USERNAME || name == VCARD_TYPE_X_HUANLIAO) { 106 AddIms(name, rawValue, propValue, values, parasMap); 107 } 108 } 109 CheckNameExist()110 void VCardContact::CheckNameExist() 111 { 112 if (nameData_ == nullptr) { 113 return; 114 } 115 if (!nameData_->GetPrefix().empty() || !nameData_->GetFamily().empty() || !nameData_->GetMiddle().empty() || 116 !nameData_->GetSuffix().empty() || !nameData_->GetFormatted().empty() || !nameData_->GetSort().empty() || 117 !nameData_->GetFormatted().empty() || !nameData_->GetPhoneticFamily().empty() || 118 !nameData_->GetPhoneticGiven().empty() || !nameData_->GetPhoneticMiddle().empty() || 119 !nameData_->GetDisplayName().empty()) { 120 return; 121 } 122 for (auto data : phones_) { 123 if (data != nullptr && !data->GetNumber().empty()) { 124 TELEPHONY_LOGI("replace phone as name: %{public}s", data->GetNumber().c_str()); 125 nameData_->setDispalyName(data->GetNumber()); 126 return; 127 } 128 } 129 for (auto data : emails_) { 130 if (data != nullptr && !data->GetAddress().empty()) { 131 TELEPHONY_LOGI("replace email as name: %{public}s", data->GetAddress().c_str()); 132 nameData_->setDispalyName(data->GetAddress()); 133 return; 134 } 135 } 136 } 137 BuildContactData(int32_t rawId,std::vector<DataShare::DataShareValuesBucket> & contactDataValues)138 int32_t VCardContact::BuildContactData(int32_t rawId, std::vector<DataShare::DataShareValuesBucket> &contactDataValues) 139 { 140 CheckNameExist(); 141 BuildValuesBucket(rawId, contactDataValues, nameData_); 142 if (!birthday_->GetBirthday().empty()) { 143 BuildValuesBucket(rawId, contactDataValues, birthday_); 144 } 145 if (!anniversary_->GetAnniversary().empty()) { 146 BuildValuesBucket(rawId, contactDataValues, anniversary_); 147 } 148 BuildValuesBuckets(rawId, contactDataValues, phones_); 149 BuildValuesBuckets(rawId, contactDataValues, emails_); 150 BuildValuesBuckets(rawId, contactDataValues, postals_); 151 BuildValuesBuckets(rawId, contactDataValues, organizations_); 152 BuildValuesBuckets(rawId, contactDataValues, ims_); 153 BuildValuesBuckets(rawId, contactDataValues, photos_); 154 BuildValuesBuckets(rawId, contactDataValues, websites_); 155 BuildValuesBuckets(rawId, contactDataValues, sips_); 156 BuildValuesBuckets(rawId, contactDataValues, nicknames_); 157 BuildValuesBuckets(rawId, contactDataValues, notes_); 158 BuildValuesBuckets(rawId, contactDataValues, relations_); 159 BuildValuesBuckets(rawId, contactDataValues, events_); 160 return TELEPHONY_SUCCESS; 161 } 162 BuildValuesBucket(int32_t rawId,std::vector<DataShare::DataShareValuesBucket> & contactDataValues,std::shared_ptr<VCardContactData> contactData)163 void VCardContact::BuildValuesBucket(int32_t rawId, std::vector<DataShare::DataShareValuesBucket> &contactDataValues, 164 std::shared_ptr<VCardContactData> contactData) 165 { 166 if (contactData == nullptr) { 167 return; 168 } 169 OHOS::DataShare::DataShareValuesBucket valuesBucket; 170 valuesBucket.Put(ContactData::RAW_CONTACT_ID, std::to_string(rawId)); 171 contactData->BuildValuesBucket(valuesBucket); 172 contactDataValues.push_back(valuesBucket); 173 } 174 175 template<typename T> BuildValuesBuckets(int32_t rawId,std::vector<DataShare::DataShareValuesBucket> & contactDataValues,std::vector<std::shared_ptr<T>> & contactDatas)176 void VCardContact::BuildValuesBuckets(int32_t rawId, std::vector<DataShare::DataShareValuesBucket> &contactDataValues, 177 std::vector<std::shared_ptr<T>> &contactDatas) 178 { 179 for (auto data : contactDatas) { 180 BuildValuesBucket(rawId, contactDataValues, data); 181 } 182 } 183 BuildContact(std::shared_ptr<DataShare::DataShareResultSet> resultSet)184 int32_t VCardContact::BuildContact(std::shared_ptr<DataShare::DataShareResultSet> resultSet) 185 { 186 std::lock_guard<std::mutex> lock(mutex_); 187 if (resultSet == nullptr) { 188 return TELEPHONY_ERROR; 189 } 190 int32_t resultSetNum = resultSet->GoToFirstRow(); 191 while (resultSetNum == 0) { 192 BuildOneData(resultSet); 193 resultSetNum = resultSet->GoToNextRow(); 194 } 195 return TELEPHONY_SUCCESS; 196 } 197 BuildOneData(std::shared_ptr<DataShare::DataShareResultSet> resultSet)198 int32_t VCardContact::BuildOneData(std::shared_ptr<DataShare::DataShareResultSet> resultSet) 199 { 200 if (resultSet == nullptr) { 201 return TELEPHONY_ERROR; 202 } 203 int typeId = 0; 204 int columnIndexType = 0; 205 resultSet->GetColumnIndex(ContactData::TYPE_ID, columnIndexType); 206 resultSet->GetInt(columnIndexType, typeId); 207 switch (typeId) { 208 case TypeId::NAME: { 209 BuildData(resultSet, names_); 210 return TELEPHONY_SUCCESS; 211 } 212 case TypeId::PHONE: { 213 BuildData(resultSet, phones_); 214 return TELEPHONY_SUCCESS; 215 } 216 case TypeId::RELATION: { 217 BuildData(resultSet, relations_); 218 return TELEPHONY_SUCCESS; 219 } 220 case TypeId::IM: { 221 BuildData(resultSet, ims_); 222 return TELEPHONY_SUCCESS; 223 } 224 case TypeId::SIP_ADDRESS: { 225 BuildData(resultSet, sips_); 226 return TELEPHONY_SUCCESS; 227 } 228 default: 229 break; 230 } 231 return BuildOtherData(typeId, resultSet); 232 } 233 BuildOtherData(int32_t typeId,std::shared_ptr<DataShare::DataShareResultSet> resultSet)234 int32_t VCardContact::BuildOtherData(int32_t typeId, std::shared_ptr<DataShare::DataShareResultSet> resultSet) 235 { 236 switch (typeId) { 237 case TypeId::NICKNAME: { 238 BuildData(resultSet, nicknames_); 239 return TELEPHONY_SUCCESS; 240 } 241 case TypeId::EMAIL: { 242 BuildData(resultSet, emails_); 243 return TELEPHONY_SUCCESS; 244 } 245 case TypeId::POSTAL_ADDRESS: { 246 BuildData(resultSet, postals_); 247 return TELEPHONY_SUCCESS; 248 } 249 case TypeId::ORGANIZATION: { 250 BuildData(resultSet, organizations_); 251 return TELEPHONY_SUCCESS; 252 } 253 case TypeId::WEBSITE: { 254 BuildData(resultSet, websites_); 255 return TELEPHONY_SUCCESS; 256 } 257 case TypeId::PHOTO: { 258 BuildData(resultSet, photos_); 259 return TELEPHONY_SUCCESS; 260 } 261 case TypeId::NOTE: { 262 BuildData(resultSet, notes_); 263 return TELEPHONY_SUCCESS; 264 } 265 case TypeId::CONTACT_EVENT: { 266 BuildData(resultSet, events_); 267 return TELEPHONY_SUCCESS; 268 } 269 default: 270 break; 271 } 272 return TELEPHONY_SUCCESS; 273 } 274 275 template<typename T> BuildData(std::shared_ptr<DataShare::DataShareResultSet> resultSet,std::vector<std::shared_ptr<T>> & contactDatas)276 void VCardContact::BuildData( 277 std::shared_ptr<DataShare::DataShareResultSet> resultSet, std::vector<std::shared_ptr<T>> &contactDatas) 278 { 279 auto data = std::make_shared<T>(); 280 data->BuildData(resultSet); 281 contactDatas.push_back(data); 282 } 283 GetNameData()284 std::shared_ptr<VCardNameData> VCardContact::GetNameData() 285 { 286 return nameData_; 287 } 288 GetNames()289 std::vector<std::shared_ptr<VCardNameData>> VCardContact::GetNames() 290 { 291 return names_; 292 } 293 GetRelations()294 std::vector<std::shared_ptr<VCardRelationData>> VCardContact::GetRelations() 295 { 296 return relations_; 297 } 298 GetIms()299 std::vector<std::shared_ptr<VCardImData>> VCardContact::GetIms() 300 { 301 return ims_; 302 } 303 GetSips()304 std::vector<std::shared_ptr<VCardSipData>> VCardContact::GetSips() 305 { 306 return sips_; 307 } 308 GetPhones()309 std::vector<std::shared_ptr<VCardPhoneData>> VCardContact::GetPhones() 310 { 311 return phones_; 312 } 313 GetOrganizations()314 std::vector<std::shared_ptr<VCardOrganizationData>> VCardContact::GetOrganizations() 315 { 316 return organizations_; 317 } 318 GetWebsites()319 std::vector<std::shared_ptr<VCardWebsiteData>> VCardContact::GetWebsites() 320 { 321 return websites_; 322 } 323 GetPhotos()324 std::vector<std::shared_ptr<VCardPhotoData>> VCardContact::GetPhotos() 325 { 326 return photos_; 327 } 328 GetEmails()329 std::vector<std::shared_ptr<VCardEmailData>> VCardContact::GetEmails() 330 { 331 return emails_; 332 } 333 GetNicknames()334 std::vector<std::shared_ptr<VCardNicknameData>> VCardContact::GetNicknames() 335 { 336 return nicknames_; 337 } 338 GetPostalDatas()339 std::vector<std::shared_ptr<VCardPostalData>> VCardContact::GetPostalDatas() 340 { 341 return postals_; 342 } 343 GetEventDatas()344 std::vector<std::shared_ptr<VCardEventData>> VCardContact::GetEventDatas() 345 { 346 return events_; 347 } 348 GetNotes()349 std::vector<std::shared_ptr<VCardNoteData>> VCardContact::GetNotes() 350 { 351 return notes_; 352 } 353 GetBirthdays()354 std::shared_ptr<VCardBirthdayData> VCardContact::GetBirthdays() 355 { 356 return birthday_; 357 } 358 HandleName(std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)359 void VCardContact::HandleName(std::vector<std::string> values, std::map<std::string, std::vector<std::string>> parasMap) 360 { 361 if (nameData_ == nullptr) { 362 return; 363 } 364 int32_t size = static_cast<int32_t>(values.size()); 365 if (values.empty() || size == 0) { 366 return; 367 } 368 if (size > N_MAX_VALUE_SIZE) { 369 size = N_MAX_VALUE_SIZE; 370 } 371 switch (size) { 372 case SIZE_FIVE: 373 nameData_->SetSuffix(values[N_SUFFIX_VALUE_INDEX]); 374 [[fallthrough]]; // fall_through 375 case SIZE_FOUR: 376 nameData_->SetPrefix(values[N_PREFIX_VALUE_INDEX]); 377 [[fallthrough]]; // fall_through 378 case SIZE_THREE: 379 nameData_->SetMiddle(values[N_MIDDLE_VALUE_INDEX]); 380 [[fallthrough]]; // fall_through 381 case SIZE_TWO: 382 nameData_->SetGiven(values[N_GIVEN_VALUE_INDEX]); 383 [[fallthrough]]; // fall_through 384 default: 385 nameData_->SetFamily(values[N_FAMILY_VALUE_INDEX]); 386 break; 387 } 388 } 389 HandleSortAsName(std::map<std::string,std::vector<std::string>> parasMap)390 void VCardContact::HandleSortAsName(std::map<std::string, std::vector<std::string>> parasMap) 391 { 392 if (nameData_ == nullptr) { 393 return; 394 } 395 if (vCardType_ == VERSION_30 && 396 !(nameData_->GetPhoneticFamily().empty() && nameData_->GetPhoneticMiddle().empty() && 397 nameData_->GetPhoneticGiven().empty())) { 398 return; 399 } 400 std::vector<std::string> sortAsList; 401 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_SORT_AS); 402 if (it == parasMap.end()) { 403 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_SORT_AS); 404 return; 405 } else { 406 sortAsList = it->second; 407 } 408 409 if (sortAsList.size() > 0) { 410 std::vector<std::string> sortNames = VCardUtils::ConstructListFromValue(sortAsList[0], vCardType_); 411 int32_t size = static_cast<int32_t>(sortNames.size()); 412 if (size > SORT_NAME_MAX_VALUE_SIZE) { 413 size = SORT_NAME_MAX_VALUE_SIZE; 414 } 415 switch (size) { 416 case SIZE_THREE: 417 nameData_->SetPhoneticMiddle(sortNames[PHONETIC_MIDDLE_VALUE_INDEX]); 418 [[fallthrough]]; // fall_through 419 case SIZE_TWO: 420 nameData_->SetPhoneticGiven(sortNames[PHONETIC_GIVEN_VALUE_INDEX]); 421 [[fallthrough]]; // fall_through 422 default: 423 nameData_->SetPhoneticFamily(sortNames[PHONETIC_FAMILY_VALUE_INDEX]); 424 break; 425 } 426 } 427 } 428 HandleNickName(std::string nickName)429 void VCardContact::HandleNickName(std::string nickName) 430 { 431 std::shared_ptr<VCardNicknameData> nn = std::make_shared<VCardNicknameData>(); 432 nn->SetNickName(nickName); 433 nicknames_.push_back(nn); 434 } 435 HandlePhoneticNameFromSound(std::vector<std::string> elems)436 void VCardContact::HandlePhoneticNameFromSound(std::vector<std::string> elems) 437 { 438 if (nameData_ == nullptr) { 439 return; 440 } 441 if (nameData_->GetPhoneticFamily().empty() && nameData_->GetPhoneticMiddle().empty() && 442 nameData_->GetPhoneticGiven().empty()) { 443 return; 444 } 445 int32_t size = static_cast<int32_t>(elems.size()); 446 if (elems.empty() || size == 0) { 447 return; 448 } 449 size = (size > PHONE_NAME_SOUND_MAX_VALUE_SIZE) ? PHONE_NAME_SOUND_MAX_VALUE_SIZE : size; 450 if (elems[0].length() > 0) { 451 bool onlyFirstElemIsNonEmpty = true; 452 for (int32_t i = 1; i < size; i++) { 453 if (elems[i].length() > 0) { 454 onlyFirstElemIsNonEmpty = false; 455 break; 456 } 457 } 458 if (onlyFirstElemIsNonEmpty) { 459 std::vector<std::string> namesArray = VCardUtils::Split(elems[VALUE_INDEX_ZERO], " "); 460 int32_t nameArrayLength = static_cast<int32_t>(namesArray.size()); 461 if (nameArrayLength == VALUE_LEN_THREE) { 462 nameData_->SetPhoneticFamily(namesArray[VALUE_INDEX_ZERO]); 463 nameData_->SetPhoneticMiddle(namesArray[VALUE_INDEX_ONE]); 464 nameData_->SetPhoneticGiven(namesArray[VALUE_INDEX_TWO]); 465 } else if (nameArrayLength == VALUE_LEN_TWO) { 466 nameData_->SetPhoneticFamily(namesArray[VALUE_INDEX_ZERO]); 467 nameData_->SetPhoneticGiven(namesArray[VALUE_INDEX_ONE]); 468 } else { 469 nameData_->SetPhoneticGiven(elems[VALUE_INDEX_ZERO]); 470 } 471 return; 472 } 473 } 474 switch (size) { 475 case SIZE_THREE: 476 nameData_->SetPhoneticMiddle(elems[VALUE_INDEX_TWO]); 477 break; 478 case SIZE_TWO: 479 nameData_->SetPhoneticGiven(elems[VALUE_INDEX_ONE]); 480 break; 481 default: 482 nameData_->SetPhoneticFamily(elems[VALUE_INDEX_ZERO]); 483 break; 484 } 485 } 486 AddPostal(int32_t type,std::vector<std::string> propValueList,std::string label,bool isPrimary)487 void VCardContact::AddPostal(int32_t type, std::vector<std::string> propValueList, std::string label, bool isPrimary) 488 { 489 std::shared_ptr<VCardPostalData> pd = std::make_shared<VCardPostalData>(); 490 pd->InitPostalData(propValueList, type, label); 491 postals_.push_back(pd); 492 } 493 AddEmail(int32_t type,std::string data,std::string label,std::string displayname,bool isPrimary)494 void VCardContact::AddEmail(int32_t type, std::string data, std::string label, std::string displayname, bool isPrimary) 495 { 496 std::shared_ptr<VCardEmailData> ed = std::make_shared<VCardEmailData>(); 497 ed->InitEmailData(data, std::to_string(type), label, displayname); 498 emails_.push_back(ed); 499 } 500 HandleOrgValue(int32_t type,std::vector<std::string> orgList,std::map<std::string,std::vector<std::string>> paramMap,bool isPrimary)501 void VCardContact::HandleOrgValue(int32_t type, std::vector<std::string> orgList, 502 std::map<std::string, std::vector<std::string>> paramMap, bool isPrimary) 503 { 504 std::string phoneticName = BuildSinglePhoneticNameFromSortAsParam(paramMap); 505 506 std::string organizationName; 507 std::string departmentName; 508 int32_t size = static_cast<int32_t>(orgList.size()); 509 switch (size) { 510 case SIZE_ZERO: 511 organizationName = ""; 512 departmentName = ""; 513 break; 514 case SIZE_ONE: 515 organizationName = orgList[0]; 516 departmentName = ""; 517 break; 518 default: 519 organizationName = orgList[0]; 520 std::string builder; 521 for (int32_t i = 1; i < size; i++) { 522 if (i > 1) { 523 builder += " "; 524 } 525 builder += orgList[i]; 526 } 527 departmentName = builder; 528 break; 529 } 530 531 if (organizations_.empty()) { 532 AddNewOrganization(organizationName, departmentName, "", "", phoneticName, type, isPrimary); 533 return; 534 } 535 536 for (std::shared_ptr<VCardOrganizationData> organizationData : organizations_) { 537 if (organizationData == nullptr) { 538 return; 539 } 540 if (organizationData->GetOrganization().empty() && organizationData->GetDepartmentName().empty()) { 541 organizationData->SetOrganization(organizationName); 542 organizationData->SetDepartmentName(departmentName); 543 return; 544 } 545 } 546 547 AddNewOrganization(organizationName, departmentName, "", "", phoneticName, type, isPrimary); 548 } 549 BuildSinglePhoneticNameFromSortAsParam(std::map<std::string,std::vector<std::string>> paramMap)550 std::string VCardContact::BuildSinglePhoneticNameFromSortAsParam( 551 std::map<std::string, std::vector<std::string>> paramMap) 552 { 553 std::vector<std::string> sortAsList; 554 std::map<std::string, std::vector<std::string>>::iterator it = paramMap.find(VCARD_PARAM_SORT_AS); 555 if (it == paramMap.end()) { 556 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_SORT_AS); 557 return ""; 558 } else { 559 sortAsList = it->second; 560 } 561 if (!sortAsList.empty()) { 562 std::vector<std::string> sortNames = VCardUtils::ConstructListFromValue(sortAsList.at(0), vCardType_); 563 std::string init = ""; 564 std::string builder = std::accumulate(sortNames.begin(), sortNames.end(), init); 565 return builder; 566 } else { 567 return ""; 568 } 569 } 570 AddNewOrganization(std::string organizationName,std::string departmentName,std::string company,std::string titleName,std::string phoneticName,int32_t type,bool isPrimary)571 void VCardContact::AddNewOrganization(std::string organizationName, std::string departmentName, std::string company, 572 std::string titleName, std::string phoneticName, int32_t type, bool isPrimary) 573 { 574 std::shared_ptr<VCardOrganizationData> od = std::make_shared<VCardOrganizationData>(); 575 od->InitOrganizationData(organizationName, departmentName, company, titleName, phoneticName, type); 576 organizations_.push_back(od); 577 } 578 HandleTitleValue(std::string title)579 void VCardContact::HandleTitleValue(std::string title) 580 { 581 if (organizations_.empty()) { 582 AddNewOrganization("", "", "", title, "", VALUE_INDEX_ONE, false); 583 return; 584 } 585 for (std::shared_ptr<VCardOrganizationData> organizationData : organizations_) { 586 if (organizationData == nullptr) { 587 return; 588 } 589 if (organizationData->GetTitle().empty()) { 590 organizationData->SetTitle(title); 591 return; 592 } 593 } 594 AddNewOrganization("", "", "", title, "", VALUE_INDEX_ONE, false); 595 } 596 AddPhotoBytes(std::string formatName,std::string photoBytes,bool isPrimary)597 void VCardContact::AddPhotoBytes(std::string formatName, std::string photoBytes, bool isPrimary) 598 { 599 std::shared_ptr<VCardPhotoData> pd = std::make_shared<VCardPhotoData>(); 600 pd->InitPhotoData(formatName, photoBytes); 601 photos_.push_back(pd); 602 } 603 HandleSipCase(std::string propValue,std::vector<std::string> typeCollection)604 void VCardContact::HandleSipCase(std::string propValue, std::vector<std::string> typeCollection) 605 { 606 if (propValue.empty()) { 607 return; 608 } 609 if (VCardUtils::StartWith(propValue, "sip:")) { 610 propValue = propValue.substr(VALUE_INDEX_FOUR); 611 if (propValue.length() == 0) { 612 return; 613 } 614 } 615 int32_t type = -1; 616 std::string label; 617 bool isPrimary = false; 618 if (!typeCollection.empty()) { 619 for (std::string typeStringOrg : typeCollection) { 620 std::string typeStringUpperCase = VCardUtils::ToUpper(typeStringOrg); 621 if (typeStringUpperCase == VCARD_PARAM_TYPE_PREF) { 622 isPrimary = true; 623 } else if (typeStringUpperCase == VCARD_PARAM_TYPE_HOME) { 624 type = static_cast<int32_t>(SipType::SIP_HOME); 625 } else if (typeStringUpperCase == VCARD_PARAM_TYPE_WORK) { 626 type = static_cast<int32_t>(SipType::SIP_WORK); 627 } else if (type < 0) { 628 label = (VCardUtils::StartWith(typeStringUpperCase, "X-")) ? typeStringOrg.substr(VALUE_INDEX_TWO) 629 : typeStringOrg; 630 type = static_cast<int32_t>(SipType::CUSTOM_LABEL); 631 } else { 632 TELEPHONY_LOGI("No need to do anything"); 633 } 634 } 635 } 636 if (type < 0) { 637 type = static_cast<int32_t>(SipType::SIP_OTHER); 638 } 639 AddSip(propValue, type, label, isPrimary); 640 } 641 AddPhone(int32_t type,std::string data,std::string label,bool isPrimary)642 void VCardContact::AddPhone(int32_t type, std::string data, std::string label, bool isPrimary) 643 { 644 std::string builder; 645 std::string trimmed = data; 646 std::string formattedNumber; 647 if (type == static_cast<int32_t>(PhoneVcType::NUM_PAGER) || 648 VCardConfiguration::RefrainPhoneNumberFormatting(VCardUtils::VcardtypeToInt(vCardType_))) { 649 formattedNumber = trimmed; 650 } else { 651 bool hasPauseOrWait = false; 652 std::size_t length = trimmed.length(); 653 for (std::size_t i = 0; i < length; i++) { 654 char ch = trimmed[i]; 655 if (ch == 'p' || ch == 'P') { 656 builder += ','; 657 hasPauseOrWait = true; 658 } else if (ch == 'w' || ch == 'W') { 659 builder += ';'; 660 hasPauseOrWait = true; 661 } else if (((ch >= '0' && ch <= '9') || ch == '*' || ch == '#') || (i == 0 && ch == '+')) { 662 builder += ch; 663 } else { 664 TELEPHONY_LOGI("No need to do anything"); 665 } 666 } 667 if (!hasPauseOrWait) { 668 formattedNumber = VCardUtils::FormatNumber(builder); 669 } else { 670 formattedNumber = builder; 671 } 672 } 673 std::shared_ptr<VCardPhoneData> object = std::make_shared<VCardPhoneData>(); 674 object->InitPhoneData(formattedNumber, type, label, isPrimary); 675 phones_.push_back(object); 676 } 677 AddSip(std::string sipData,int32_t type,std::string label,bool isPrimary)678 void VCardContact::AddSip(std::string sipData, int32_t type, std::string label, bool isPrimary) 679 { 680 std::shared_ptr<VCardSipData> object = std::make_shared<VCardSipData>(); 681 object->InitSipData(sipData, type, label); 682 sips_.push_back(object); 683 } 684 AddNote(const std::string note)685 void VCardContact::AddNote(const std::string note) 686 { 687 std::shared_ptr<VCardNoteData> object = std::make_shared<VCardNoteData>(); 688 object->InitNoteData(note); 689 notes_.push_back(object); 690 } 691 AddIms(std::string name,std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)692 void VCardContact::AddIms(std::string name, std::string rawValue, std::string propValue, 693 std::vector<std::string> values, std::map<std::string, std::vector<std::string>> parasMap) 694 { 695 int32_t labeId = VCardUtils::GetLabelIdFromImType(name); 696 std::shared_ptr<VCardImData> object = std::make_shared<VCardImData>(); 697 std::vector<std::string> valueList = GetValueListFromParasMap(rawValue, propValue, parasMap); 698 for (std::string value : valueList) { 699 object->SetAddress(value); 700 } 701 object->SetLabelId(std::to_string(labeId)); 702 ims_.push_back(object); 703 } 704 AddNameData(std::string name,std::string rawValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap,std::string propValue)705 void VCardContact::AddNameData(std::string name, std::string rawValue, std::vector<std::string> values, 706 std::map<std::string, std::vector<std::string>> parasMap, std::string propValue) 707 { 708 if (nameData_ == nullptr) { 709 return; 710 } 711 if (name == VCARD_TYPE_FN) { 712 nameData_->setDispalyName((values.size() != 0) ? values[0] : ""); 713 } else if (name == VCARD_TYPE_N) { 714 HandleSortAsName(parasMap); 715 HandleName(values, parasMap); 716 } else if (name == VCARD_TYPE_NAME) { 717 if (nameData_->GetFormatted().empty()) { 718 nameData_->SetFormatted(propValue); 719 } 720 } else if (name == VCARD_TYPE_SORT_STRING) { 721 nameData_->setSort(propValue); 722 } else if (name == VCARD_TYPE_X_PHONETIC_FIRST_NAME) { 723 std::vector<std::string> valueList = GetValueListFromParasMap(rawValue, propValue, parasMap); 724 nameData_->SetPhoneticGiven((valueList.size() != 0) ? valueList[0] : ""); 725 } else if (name == VCARD_TYPE_X_PHONETIC_MIDDLE_NAME) { 726 std::vector<std::string> valueList = GetValueListFromParasMap(rawValue, propValue, parasMap); 727 nameData_->SetPhoneticMiddle((valueList.size() != 0) ? valueList[0] : ""); 728 } else if (name == VCARD_TYPE_X_PHONETIC_LAST_NAME) { 729 std::vector<std::string> valueList = GetValueListFromParasMap(rawValue, propValue, parasMap); 730 nameData_->SetPhoneticFamily((valueList.size() != 0) ? valueList[0] : ""); 731 } else { 732 TELEPHONY_LOGI("No need to do anything"); 733 } 734 } 735 AddCustom(std::string rawValue,std::map<std::string,std::vector<std::string>> parasMap,std::string propValue)736 void VCardContact::AddCustom( 737 std::string rawValue, std::map<std::string, std::vector<std::string>> parasMap, std::string propValue) 738 { 739 std::vector<std::string> values = GetValueListFromParasMap(rawValue, propValue, parasMap); 740 std::string type = (values.size() != 0) ? values[0] : ""; 741 if (type == TypeData::NICKNAME) { 742 std::shared_ptr<VCardNicknameData> object = std::make_shared<VCardNicknameData>(); 743 int i = 0; 744 for (std::string value : values) { 745 if (i == SIZE_ONE) { 746 object->SetNickName(value); 747 break; 748 } 749 i++; 750 } 751 nicknames_.push_back(object); 752 } else if (type == TypeData::RELATION || type == VCARD_TYPE_X_MOBILE_RELATION) { 753 std::shared_ptr<VCardRelationData> object = std::make_shared<VCardRelationData>(); 754 int i = 0; 755 for (std::string value : values) { 756 if (i == SIZE_ONE) { 757 object->SetRelationName(value); 758 } else if (i == SIZE_TWO) { 759 value = value == std::to_string(VALUE_INDEX_ZERO) ? 760 std::to_string(static_cast<int32_t>(RelationType::CUSTOM_LABEL)) : value; 761 object->SetLabelId(value); 762 } else if (i == SIZE_THREE) { 763 object->SetLabelName(value); 764 break; 765 } 766 i++; 767 } 768 relations_.push_back(object); 769 } else if (type == TypeData::CONTACT_EVENT || type == VCARD_TYPE_X_MOBILE_EVENTS) { 770 std::shared_ptr<VCardEventData> object = std::make_shared<VCardEventData>(); 771 int i = 0; 772 for (std::string value : values) { 773 if (i == SIZE_ONE) { 774 object->SetEventDate(value); 775 } else if (i == SIZE_TWO) { 776 value = ConvertHarmonyEvents(type, value); 777 object->SetLabelId(value); 778 } else if (i == SIZE_THREE) { 779 object->SetLabelName(value); 780 break; 781 } 782 i++; 783 } 784 events_.push_back(object); 785 } 786 } 787 ConvertHarmonyEvents(std::string type,std::string value)788 std::string VCardContact::ConvertHarmonyEvents(std::string type, std::string value) 789 { 790 if (type != VCARD_TYPE_X_MOBILE_EVENTS) { 791 return value; 792 } 793 std::string convertedValue = value; 794 if (value == std::to_string(static_cast<int32_t>(EventHM4Type::EVENT_HM4_ANNIVERSARY))) { 795 convertedValue = std::to_string(static_cast<int32_t>(EventType::EVENT_ANNIVERSARY)); 796 } 797 if (value == std::to_string(static_cast<int32_t>(EventHM4Type::EVENT_HM4_OTHER))) { 798 convertedValue = std::to_string(static_cast<int32_t>(EventType::EVENT_OTHER)); 799 } 800 if (value == std::to_string(static_cast<int32_t>(EventHM4Type::EVENT_HM4_LUNAR_BIRTHDAY))) { 801 convertedValue = std::to_string(static_cast<int32_t>(EventType::EVENT_LUNAR_BIRTHDAY)); 802 } 803 return convertedValue; 804 } 805 SetSip(std::string rawValue,std::map<std::string,std::vector<std::string>> parasMap,std::string propValue)806 void VCardContact::SetSip( 807 std::string rawValue, std::map<std::string, std::vector<std::string>> parasMap, std::string propValue) 808 { 809 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 810 if (it == parasMap.end()) { 811 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 812 std::shared_ptr<VCardSipData> object = std::make_shared<VCardSipData>(); 813 std::vector<std::string> values = VCardUtils::Split(propValue, ";"); 814 for (size_t i = 0; i < values.size(); i++) { 815 if (i == SIZE_ZERO) { 816 std::vector<std::string> address = VCardUtils::Split(values[i], ":"); 817 object->SetAddress((address.size() >= SIZE_TWO) ? address[1] : ""); 818 } else if (i == SIZE_ONE) { 819 object->SetLabelId(values[i]); 820 } else if (i == SIZE_TWO) { 821 object->SetLabelName(values[i]); 822 break; 823 } 824 } 825 sips_.push_back(object); 826 } else { 827 std::vector<std::string> typeCollection; 828 typeCollection = it->second; 829 HandleSipCase(propValue, typeCollection); 830 } 831 } 832 AddSipData(std::string rawValue,std::map<std::string,std::vector<std::string>> parasMap,std::string propValue)833 void VCardContact::AddSipData( 834 std::string rawValue, std::map<std::string, std::vector<std::string>> parasMap, std::string propValue) 835 { 836 if (parasMap.size() != 0 && !propValue.empty()) { 837 SetSip(rawValue, parasMap, propValue); 838 return; 839 } 840 std::shared_ptr<VCardSipData> object = std::make_shared<VCardSipData>(); 841 std::vector<std::string> values = VCardUtils::Split(rawValue, ";"); 842 for (size_t i = 0; i < values.size(); i++) { 843 if (i == SIZE_ZERO) { 844 std::vector<std::string> address = VCardUtils::Split(values[i], ":"); 845 object->SetAddress((address.size() >= SIZE_TWO) ? address[1] : ""); 846 } 847 if (i == SIZE_ONE) { 848 object->SetLabelId(values[i]); 849 } 850 if (i == SIZE_TWO) { 851 object->SetLabelName(values[i]); 852 } 853 } 854 sips_.push_back(object); 855 } 856 AddPhonesData(std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)857 void VCardContact::AddPhonesData(std::string rawValue, std::string propValue, std::vector<std::string> values, 858 std::map<std::string, std::vector<std::string>> parasMap) 859 { 860 std::string phoneNumber; 861 bool isSip = false; 862 if (vCardType_ == VERSION_40) { 863 if (VCardUtils::StartWith(propValue, "sip:")) { 864 isSip = true; 865 } else if (VCardUtils::StartWith(propValue, "tel:")) { 866 phoneNumber = propValue.substr(VALUE_INDEX_FOUR); 867 } else { 868 phoneNumber = propValue; 869 } 870 } else { 871 phoneNumber = rawValue; 872 } 873 if (isSip) { 874 std::vector<std::string> typeCollection; 875 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 876 if (it == parasMap.end()) { 877 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 878 return; 879 } else { 880 typeCollection = it->second; 881 } 882 HandleSipCase(propValue, typeCollection); 883 } else { 884 HandlePhoneCase(phoneNumber, rawValue, propValue, values, parasMap); 885 } 886 } 887 HandlePhoneCase(std::string phoneNumber,std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)888 void VCardContact::HandlePhoneCase(std::string phoneNumber, std::string rawValue, std::string propValue, 889 std::vector<std::string> values, std::map<std::string, std::vector<std::string>> parasMap) 890 { 891 std::vector<std::string> typeCollection; 892 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 893 if (it == parasMap.end()) { 894 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 895 return; 896 } else { 897 typeCollection = it->second; 898 } 899 std::tuple<int32_t, std::string> result(NUM_MINUS_ONE, "-1"); 900 VCardUtils::GetPhoneTypeFromStrings(typeCollection, phoneNumber, result); 901 int32_t type = NUM_MINUS_ONE; 902 std::string label; 903 if (std::get<0>(result) != NUM_MINUS_ONE && std::get<1>(result) == "-1") { 904 type = std::get<0>(result); 905 label = ""; 906 } else if (std::get<0>(result) == NUM_MINUS_ONE && std::get<1>(result) != "-1") { 907 type = static_cast<int32_t>(PhoneVcType::CUSTOM_LABEL); 908 label = std::get<1>(result); 909 } 910 bool isPrimary = false; 911 bool contains = false; 912 if (std::find(typeCollection.begin(), typeCollection.end(), VCARD_PARAM_TYPE_PREF) != typeCollection.end()) { 913 contains = true; 914 } 915 if (!typeCollection.empty() && contains) { 916 isPrimary = true; 917 } 918 AddPhone(type, phoneNumber, label, isPrimary); 919 } 920 AddOrganizationsData(std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)921 void VCardContact::AddOrganizationsData(std::string rawValue, std::string propValue, std::vector<std::string> values, 922 std::map<std::string, std::vector<std::string>> parasMap) 923 { 924 int32_t type = SIZE_ONE; 925 bool isPrimary = false; 926 if (parasMap.size() != 0) { 927 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 928 if (it == parasMap.end()) { 929 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 930 AddNewOrganization("", "", propValue, "", "", type, isPrimary); 931 } else { 932 HandleOrgValue(type, values, parasMap, isPrimary); 933 } 934 } else { 935 AddNewOrganization("", "", rawValue, "", "", type, isPrimary); 936 } 937 } 938 AddEmailsData(std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)939 void VCardContact::AddEmailsData(std::string rawValue, std::string propValue, std::vector<std::string> values, 940 std::map<std::string, std::vector<std::string>> parasMap) 941 { 942 int32_t type = NUM_MINUS_ONE; 943 std::string label = ""; 944 bool isPrimary = false; 945 std::vector<std::string> typeCollection; 946 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 947 if (it == parasMap.end()) { 948 TELEPHONY_LOGI("Map does not contain this key, %{public}s, use OTHER type", VCARD_PARAM_TYPE); 949 // contains no type info will fallback to OTHER type 950 } else { 951 typeCollection = it->second; 952 } 953 if (!typeCollection.empty()) { 954 for (std::string typeStringOrg : typeCollection) { 955 std::string typeStringUpperCase = VCardUtils::ToUpper(typeStringOrg); 956 if (typeStringUpperCase == VCARD_PARAM_TYPE_PREF) { 957 isPrimary = true; 958 } else if (typeStringUpperCase == VCARD_PARAM_TYPE_HOME) { 959 type = static_cast<int32_t>(EmailType::EMAIL_HOME); 960 } else if (typeStringUpperCase == VCARD_PARAM_TYPE_WORK) { 961 type = static_cast<int32_t>(EmailType::EMAIL_WORK); 962 } else if (typeStringUpperCase == VCARD_PARAM_TYPE_CELL) { 963 type = VALUE_INDEX_FOUR; 964 } else if (type < 0) { 965 label = (VCardUtils::StartWith(typeStringUpperCase, "X-")) ? typeStringOrg.substr(VALUE_INDEX_TWO) 966 : typeStringOrg; 967 type = static_cast<int32_t>(EmailType::CUSTOM_LABEL); 968 } else { 969 TELEPHONY_LOGI("No need to do anything"); 970 } 971 } 972 } 973 if (type < 0) { 974 type = static_cast<int32_t>(EmailType::EMAIL_OTHER); 975 } 976 std::map<std::string, std::vector<std::string>>::iterator itCharset = parasMap.find(VCARD_PARAM_CHARSET); 977 std::map<std::string, std::vector<std::string>>::iterator itEncoding = parasMap.find(VCARD_PARAM_ENCODING); 978 std::vector<std::string> valueList = 979 VCardUtils::Split(((itCharset != parasMap.end() && itEncoding != parasMap.end()) ? propValue : rawValue), ";"); 980 std::string address = (valueList.size() != 0) ? valueList[0] : ""; 981 std::string displayname = (valueList.size() >= SIZE_TWO) ? valueList[1] : ""; 982 AddEmail(type, address, label, displayname, isPrimary); 983 } 984 AddPostalDatas(std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)985 void VCardContact::AddPostalDatas(std::string rawValue, std::string propValue, std::vector<std::string> values, 986 std::map<std::string, std::vector<std::string>> parasMap) 987 { 988 bool valueIsAllEmpty = true; 989 for (std::string value : values) { 990 if (!value.empty()) { 991 valueIsAllEmpty = false; 992 break; 993 } 994 } 995 if (valueIsAllEmpty) { 996 return; 997 } 998 int32_t type = -1; 999 std::string label = ""; 1000 bool isPrimary = false; 1001 std::vector<std::string> typeCollection; 1002 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 1003 if (it == parasMap.end()) { 1004 TELEPHONY_LOGI("Map does not contain this key, %{public}s, use OTHER type", VCARD_PARAM_TYPE); 1005 // contains no type info will fallback to OTHER type 1006 } else { 1007 typeCollection = it->second; 1008 } 1009 for (std::string typeStringOrg : typeCollection) { 1010 std::string typeStringUpperCase = VCardUtils::ToUpper(typeStringOrg); 1011 if (typeStringUpperCase == VCARD_PARAM_TYPE_PREF) { 1012 isPrimary = true; 1013 } else if (typeStringUpperCase == VCARD_PARAM_TYPE_HOME) { 1014 type = static_cast<int32_t>(PostalType::ADDR_HOME); 1015 label = ""; 1016 } else if (typeStringUpperCase == VCARD_PARAM_TYPE_WORK || 1017 typeStringUpperCase == VCARD_PARAM_EXTRA_TYPE_COMPANY) { 1018 type = static_cast<int32_t>(PostalType::ADDR_WORK); 1019 label = ""; 1020 } else if (typeStringUpperCase == VCARD_PARAM_ADR_TYPE_PARCEL || 1021 typeStringUpperCase == VCARD_PARAM_ADR_TYPE_DOM || 1022 typeStringUpperCase == VCARD_PARAM_ADR_TYPE_INTL) { 1023 // We do not have any appropriate way to store this information. 1024 } else if (type < 0) { 1025 type = static_cast<int32_t>(PostalType::CUSTOM_LABEL); 1026 label = (VCardUtils::StartWith(typeStringUpperCase, "X-")) ? typeStringOrg.substr(VALUE_INDEX_TWO) 1027 : typeStringOrg; 1028 if (VCardUtils::ToUpper(label) == VCARD_PARAM_ADR_EXTRA_TYPE_OTHER) { 1029 type = static_cast<int32_t>(PostalType::ADDR_OTHER); 1030 label = ""; 1031 } 1032 } else { 1033 TELEPHONY_LOGI("No need to do anything"); 1034 } 1035 } 1036 AddPostal(type < 0 ? static_cast<int32_t>(PostalType::ADDR_OTHER) : type, values, label, isPrimary); 1037 } 1038 AddSoundDatas(std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)1039 void VCardContact::AddSoundDatas(std::string rawValue, std::string propValue, std::vector<std::string> values, 1040 std::map<std::string, std::vector<std::string>> parasMap) 1041 { 1042 std::vector<std::string> typeList; 1043 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 1044 if (it == parasMap.end()) { 1045 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 1046 return; 1047 } else { 1048 typeList = it->second; 1049 } 1050 bool contains = false; 1051 if (std::find(typeList.begin(), typeList.end(), VCARD_PARAM_X_IRMC_N) != typeList.end()) { 1052 contains = true; 1053 } 1054 if (typeList.size() > 0 && contains) { 1055 std::vector<std::string> phoneticNameList = VCardUtils::ConstructListFromValue(propValue, vCardType_); 1056 HandlePhoneticNameFromSound(phoneticNameList); 1057 } 1058 } 1059 AddPhotoDatas(std::string byte,std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)1060 void VCardContact::AddPhotoDatas(std::string byte, std::string rawValue, std::string propValue, 1061 std::vector<std::string> values, std::map<std::string, std::vector<std::string>> parasMap) 1062 { 1063 std::vector<std::string> typeList; 1064 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 1065 if (it == parasMap.end()) { 1066 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 1067 return; 1068 } else { 1069 typeList = it->second; 1070 } 1071 std::string formatName; 1072 bool isPrimary = false; 1073 if (!typeList.empty()) { 1074 for (std::string typeValue : typeList) { 1075 if (typeValue == VCARD_PARAM_TYPE_PREF) { 1076 isPrimary = true; 1077 } else if (formatName.empty()) { 1078 formatName = typeValue; 1079 } else { 1080 TELEPHONY_LOGI("No need to do anything"); 1081 } 1082 } 1083 } 1084 AddPhotoBytes(formatName, byte, isPrimary); 1085 } 1086 AddSkypePstnNumDatas(std::string propValue,std::map<std::string,std::vector<std::string>> parasMap)1087 void VCardContact::AddSkypePstnNumDatas(std::string propValue, std::map<std::string, std::vector<std::string>> parasMap) 1088 { 1089 std::vector<std::string> typeCollection; 1090 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 1091 if (it == parasMap.end()) { 1092 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 1093 return; 1094 } else { 1095 typeCollection = it->second; 1096 } 1097 int32_t type = static_cast<int32_t>(PhoneVcType::NUM_OTHER); 1098 bool isPrimary = false; 1099 if (std::find(typeCollection.begin(), typeCollection.end(), VCARD_PARAM_TYPE_PREF) != typeCollection.end()) { 1100 isPrimary = true; 1101 } 1102 AddPhone(type, propValue, "", isPrimary); 1103 } 1104 AddWebSiteDatas(std::string rawValue,std::string propValue,std::vector<std::string> values,std::map<std::string,std::vector<std::string>> parasMap)1105 void VCardContact::AddWebSiteDatas(std::string rawValue, std::string propValue, std::vector<std::string> values, 1106 std::map<std::string, std::vector<std::string>> parasMap) 1107 { 1108 std::shared_ptr<VCardWebsiteData> object = std::make_shared<VCardWebsiteData>(); 1109 std::vector<std::string> valueList = VCardUtils::Split((parasMap.size() != 0) ? propValue : rawValue, ";"); 1110 object->InitWebsite((valueList.size() > SIZE_ZERO) ? valueList[VALUE_INDEX_ZERO] : ""); 1111 object->SetLabelId((valueList.size() > SIZE_ONE) ? valueList[VALUE_INDEX_ONE] : ""); 1112 object->SetLabelName((valueList.size() > SIZE_TWO) ? valueList[VALUE_INDEX_TWO] : ""); 1113 websites_.push_back(object); 1114 } 1115 AddBirthdayDatas(std::string rawValue)1116 void VCardContact::AddBirthdayDatas(std::string rawValue) 1117 { 1118 std::shared_ptr<VCardBirthdayData> object = std::make_shared<VCardBirthdayData>(); 1119 object->InitBirthdayData(rawValue); 1120 birthday_ = object; 1121 } 1122 AddAnniversaryDatas(std::string propValue)1123 void VCardContact::AddAnniversaryDatas(std::string propValue) 1124 { 1125 std::shared_ptr<VCardAnniversaryData> object = std::make_shared<VCardAnniversaryData>(); 1126 object->InitAnniversaryData(propValue); 1127 anniversary_ = object; 1128 } 1129 AddImppDatas(std::string propValue,std::map<std::string,std::vector<std::string>> parasMap)1130 void VCardContact::AddImppDatas(std::string propValue, std::map<std::string, std::vector<std::string>> parasMap) 1131 { 1132 if (VCardUtils::StartWith(propValue, "sip:")) { 1133 std::vector<std::string> typeCollection; 1134 std::map<std::string, std::vector<std::string>>::iterator it = parasMap.find(VCARD_PARAM_TYPE); 1135 if (it == parasMap.end()) { 1136 TELEPHONY_LOGE("Map does not contain this key, %{public}s", VCARD_PARAM_TYPE); 1137 return; 1138 } else { 1139 typeCollection = it->second; 1140 } 1141 HandleSipCase(propValue, typeCollection); 1142 } 1143 } 1144 GetValueListFromParasMap(std::string rawValue,std::string propValue,std::map<std::string,std::vector<std::string>> parasMap)1145 std::vector<std::string> VCardContact::GetValueListFromParasMap( 1146 std::string rawValue, std::string propValue, std::map<std::string, std::vector<std::string>> parasMap) 1147 { 1148 return VCardUtils::Split(((parasMap.size() == 0) ? rawValue : propValue), ";"); 1149 } 1150 1151 } // namespace Telephony 1152 } // namespace OHOS 1153