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