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 predicates.NotEqualTo(RawContact::PRIMARY_CONTACT, TELEPHONY_ERROR);
43 auto rawResultSet = VCardRdbHelper::GetInstance().QueryRawContact(columns, predicates);
44 if (rawResultSet == nullptr) {
45 TELEPHONY_LOGE("QueryContactData failed");
46 errorCode = TELEPHONY_ERR_LOCAL_PTR_NULL;
47 return "";
48 }
49 int rowCount = 0;
50 rawResultSet->GetRowCount(rowCount);
51 if (rowCount == 0) {
52 return "";
53 }
54 std::shared_ptr<VCardContact> contact = std::make_shared<VCardContact>();
55 ContructContact(contact, rawResultSet, errorCode);
56 rawResultSet->Close();
57 if (phoneNumberEncodedCallback_ != nullptr) {
58 contructor_->SetPhoneNumberEncodedCallback(phoneNumberEncodedCallback_);
59 }
60 return contructor_->ContactVCard(contact);
61 }
62
SetPhoneNumberEncodedCallback(std::shared_ptr<PhoneNumberEncodedCallback> PhoneNumberEncodedCallback)63 void VCardEncoder::SetPhoneNumberEncodedCallback(std::shared_ptr<PhoneNumberEncodedCallback> PhoneNumberEncodedCallback)
64 {
65 phoneNumberEncodedCallback_ = PhoneNumberEncodedCallback;
66 }
67
ContructContact(std::shared_ptr<VCardContact> contact,std::shared_ptr<DataShare::DataShareResultSet> rawResultSet,int32_t & errorCode)68 void VCardEncoder::ContructContact(std::shared_ptr<VCardContact> contact,
69 std::shared_ptr<DataShare::DataShareResultSet> rawResultSet, int32_t &errorCode)
70 {
71 if (rawResultSet == nullptr) {
72 TELEPHONY_LOGE("rawResultSet is nullptr!");
73 return;
74 }
75 int32_t rawResultSetNum = rawResultSet->GoToFirstRow();
76 while (rawResultSetNum == 0 && errorCode == TELEPHONY_SUCCESS) {
77 int32_t index = 0;
78 int32_t rawContactId;
79 rawResultSet->GetColumnIndex(RawContact::CONTACT_ID, index);
80 rawResultSet->GetInt(index, rawContactId);
81 std::vector<std::string> columns;
82 DataShare::DataSharePredicates predicates;
83 predicates.EqualTo(ContactData::RAW_CONTACT_ID, rawContactId);
84 auto contactDataResultSet = VCardRdbHelper::GetInstance().QueryContactData(columns, predicates);
85 if (contactDataResultSet == nullptr) {
86 TELEPHONY_LOGE("QueryContactData failed");
87 errorCode = TELEPHONY_ERR_LOCAL_PTR_NULL;
88 return;
89 }
90 int32_t contactDataResultSetNum = contactDataResultSet->GoToFirstRow();
91 if (contactDataResultSetNum == 0) {
92 contact->BuildContact(contactDataResultSet);
93 }
94 rawResultSetNum = rawResultSet->GoToNextRow();
95 }
96 }
97 } // namespace Telephony
98 } // namespace OHOS
99