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 int32_t rawResultSetNum = rawResultSet->GoToFirstRow();
71 while (rawResultSetNum == 0 && errorCode == TELEPHONY_SUCCESS) {
72 int32_t index = 0;
73 int32_t rawContactId;
74 rawResultSet->GetColumnIndex(RawContact::CONTACT_ID, index);
75 rawResultSet->GetInt(index, rawContactId);
76 std::vector<std::string> columns;
77 DataShare::DataSharePredicates predicates;
78 predicates.EqualTo(ContactData::RAW_CONTACT_ID, rawContactId);
79 auto contactDataResultSet = VCardRdbHelper::GetInstance().QueryContactData(columns, predicates);
80 if (contactDataResultSet == nullptr) {
81 TELEPHONY_LOGE("QueryContactData failed");
82 errorCode = TELEPHONY_ERR_LOCAL_PTR_NULL;
83 return;
84 }
85 int32_t contactDataResultSetNum = contactDataResultSet->GoToFirstRow();
86 if (contactDataResultSetNum == 0) {
87 contact->BuildContact(contactDataResultSet);
88 }
89 rawResultSetNum = rawResultSet->GoToNextRow();
90 }
91 }
92 } // namespace Telephony
93 } // namespace OHOS
94