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_encoder.h"
16
17 #include "telephony_errors.h"
18 #include "telephony_log_wrapper.h"
19 #include "vcard_constant.h"
20 #include "vcard_contact.h"
21
22 namespace OHOS {
23 namespace Telephony {
VCardEncoder(int32_t cardType, const std::string &charset)24 VCardEncoder::VCardEncoder(int32_t cardType, const std::string &charset)
25 {
26 contructor_ = std::make_shared<VCardConstructor>(cardType, charset);
27 }
28
ContructVCard(std::shared_ptr<DataShare::DataShareResultSet> resultSet, int32_t &errorCode)29 std::string VCardEncoder::ContructVCard(std::shared_ptr<DataShare::DataShareResultSet> resultSet, int32_t &errorCode)
30 {
31 if (resultSet == nullptr) {
32 TELEPHONY_LOGE("resultSet is null");
33 return "";
34 }
35 int32_t index = 0;
36 int32_t id = 0;
37 resultSet->GetColumnIndex(Contact::ID, index);
38 resultSet->GetInt(index, id);
39 std::vector<std::string> columns;
40 DataShare::DataSharePredicates predicates;
41 predicates.EqualTo(RawContact::CONTACT_ID, id)->And()->EqualTo(RawContact::IS_DELETED, CONTACTS_NOT_DELETED);
42 auto rawResultSet = VCardRdbHelper::GetInstance().QueryRawContact(columns, predicates);
43 if (rawResultSet == nullptr) {
44 TELEPHONY_LOGE("QueryContactData failed");
45 errorCode = TELEPHONY_ERR_LOCAL_PTR_NULL;
46 return "";
47 }
48 int rowCount = 0;
49 rawResultSet->GetRowCount(rowCount);
50 if (rowCount == 0) {
51 return "";
52 }
53 std::shared_ptr<VCardContact> contact = std::make_shared<VCardContact>();
54 ContructContact(contact, rawResultSet, errorCode);
55 rawResultSet->Close();
56 if (phoneNumberEncodedCallback_ != nullptr) {
57 contructor_->SetPhoneNumberEncodedCallback(phoneNumberEncodedCallback_);
58 }
59 return contructor_->ContactVCard(contact);
60 }
61
SetPhoneNumberEncodedCallback(std::shared_ptr<PhoneNumberEncodedCallback> PhoneNumberEncodedCallback)62 void VCardEncoder::SetPhoneNumberEncodedCallback(std::shared_ptr<PhoneNumberEncodedCallback> PhoneNumberEncodedCallback)
63 {
64 phoneNumberEncodedCallback_ = PhoneNumberEncodedCallback;
65 }
66
ContructContact(std::shared_ptr<VCardContact> contact, std::shared_ptr<DataShare::DataShareResultSet> rawResultSet, int32_t &errorCode)67 void VCardEncoder::ContructContact(std::shared_ptr<VCardContact> contact,
68 std::shared_ptr<DataShare::DataShareResultSet> rawResultSet, int32_t &errorCode)
69 {
70 if (rawResultSet == nullptr) {
71 TELEPHONY_LOGE("rawResultSet is nullptr!");
72 return;
73 }
74 int32_t rawResultSetNum = rawResultSet->GoToFirstRow();
75 while (rawResultSetNum == 0 && errorCode == TELEPHONY_SUCCESS) {
76 int32_t index = 0;
77 int32_t rawContactId;
78 rawResultSet->GetColumnIndex(RawContact::ID, index);
79 rawResultSet->GetInt(index, rawContactId);
80 std::vector<std::string> columns;
81 DataShare::DataSharePredicates predicates;
82 predicates.EqualTo(ContactData::RAW_CONTACT_ID, rawContactId);
83 auto contactDataResultSet = VCardRdbHelper::GetInstance().QueryContactData(columns, predicates);
84 if (contactDataResultSet == nullptr) {
85 TELEPHONY_LOGE("QueryContactData failed");
86 errorCode = TELEPHONY_ERR_LOCAL_PTR_NULL;
87 return;
88 }
89 int32_t contactDataResultSetNum = contactDataResultSet->GoToFirstRow();
90 if (contactDataResultSetNum == 0) {
91 contact->BuildContact(contactDataResultSet);
92 }
93 rawResultSetNum = rawResultSet->GoToNextRow();
94 }
95 }
96 } // namespace Telephony
97 } // namespace OHOS
98