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