1 /*
2 * Copyright (C) 2024 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
16 #include "number_identity_data_base_helper.h"
17
18 #include "ability_context.h"
19 #include "call_manager_errors.h"
20 #include "call_number_utils.h"
21 #include "iservice_registry.h"
22 #include "phonenumbers/phonenumber.pb.h"
23 #include "phonenumberutil.h"
24 #include "telephony_log_wrapper.h"
25
26 namespace OHOS {
27 namespace Telephony {
28 static constexpr const char *NUMBER_MARK_INFO_URI = "datashare:///numbermarkability/number_mark_info";
29 const char *NUMBER_LOCATION = "number_location";
30 const char *MARK_TYPE = "markType";
31 const char *MARK_CONTENT = "markContent";
32 const char *MARK_COUNT = "markCount";
33 const char *MARK_SOURCE = "markSource";
34 const char *IS_CLOUD = "isCloud";
35 const char *MARK_DETAILS = "markDetails";
36
NumberIdentityDataBaseHelper()37 NumberIdentityDataBaseHelper::NumberIdentityDataBaseHelper() {}
38
~NumberIdentityDataBaseHelper()39 NumberIdentityDataBaseHelper::~NumberIdentityDataBaseHelper() {}
40
CreateDataShareHelper(std::string uri)41 std::shared_ptr<DataShare::DataShareHelper> NumberIdentityDataBaseHelper::CreateDataShareHelper(std::string uri)
42 {
43 TELEPHONY_LOGI("uri: %{public}s", uri.c_str());
44 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
45 if (saManager == nullptr) {
46 TELEPHONY_LOGE("Get system ability mgr failed.");
47 return nullptr;
48 }
49 auto remoteObj = saManager->GetSystemAbility(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
50 if (remoteObj == nullptr) {
51 TELEPHONY_LOGE("GetSystemAbility Service Failed.");
52 return nullptr;
53 }
54 return DataShare::DataShareHelper::Creator(remoteObj, uri);
55 }
56
Query(std::string & numberLocation,DataShare::DataSharePredicates & predicates)57 bool NumberIdentityDataBaseHelper::Query(std::string &numberLocation, DataShare::DataSharePredicates &predicates)
58 {
59 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(NUMBER_IDENTITY_URI);
60 if (helper == nullptr) {
61 TELEPHONY_LOGE("helper is nullptr");
62 return false;
63 }
64 Uri uri(NUMBER_IDENTITY_URI);
65 std::string isExactMatchStr = "true";
66 std::vector<std::string> columns;
67 columns.push_back(isExactMatchStr);
68 auto resultSet = helper->Query(uri, predicates, columns);
69 if (resultSet == nullptr) {
70 TELEPHONY_LOGE("resultSet is nullptr");
71 helper->Release();
72 helper = nullptr;
73 return false;
74 }
75 int rowCount = 0;
76 resultSet->GetRowCount(rowCount);
77 if (rowCount == 0) {
78 TELEPHONY_LOGE("query success, but rowCount is 0");
79 helper->Release();
80 return TELEPHONY_SUCCESS;
81 }
82 resultSet->GoToFirstRow();
83 int columnIndex = 0;
84 resultSet->GetColumnIndex(NUMBER_LOCATION, columnIndex);
85 resultSet->GetString(columnIndex, numberLocation);
86 resultSet->Close();
87 helper->Release();
88 helper = nullptr;
89 TELEPHONY_LOGW("QueryNumberLocation end");
90 return true;
91 }
92
QueryYellowPageAndMark(NumberMarkInfo & numberMarkInfo,DataShare::DataSharePredicates & predicates)93 bool NumberIdentityDataBaseHelper::QueryYellowPageAndMark(NumberMarkInfo &numberMarkInfo,
94 DataShare::DataSharePredicates &predicates)
95 {
96 TELEPHONY_LOGI("query yellow page and mark.");
97 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(NUMBER_MARK_INFO_URI);
98 if (helper == nullptr) {
99 TELEPHONY_LOGE("helper is nullptr");
100 return false;
101 }
102 Uri uri(NUMBER_MARK_INFO_URI);
103 std::vector<std::string> columns;
104 TELEPHONY_LOGI("begin datashare query.");
105 auto resultSet = helper->Query(uri, predicates, columns);
106 if (resultSet == nullptr) {
107 TELEPHONY_LOGE("resultSet is nullptr");
108 helper->Release();
109 helper = nullptr;
110 return false;
111 }
112 TELEPHONY_LOGI("datashare query success.");
113 int rowCount = 0;
114 resultSet->GetRowCount(rowCount);
115 if (rowCount == 0) {
116 TELEPHONY_LOGE("query success, but rowCount is 0");
117 helper->Release();
118 numberMarkInfo.markType = MarkType::MARK_TYPE_NONE;
119 return TELEPHONY_SUCCESS;
120 }
121 SetMarkInfoValues(resultSet, numberMarkInfo);
122
123 resultSet->Close();
124 helper->Release();
125 helper = nullptr;
126 TELEPHONY_LOGI("QueryYellowPageAndMark success.");
127 return true;
128 }
129
SetMarkInfoValues(std::shared_ptr<DataShare::DataShareResultSet> & resultSet,NumberMarkInfo & numberMarkInfo)130 bool NumberIdentityDataBaseHelper::SetMarkInfoValues(std::shared_ptr<DataShare::DataShareResultSet> &resultSet,
131 NumberMarkInfo &numberMarkInfo)
132 {
133 resultSet->GoToFirstRow();
134 int columnIndex = 0;
135 int64_t longValue;
136 std::string stringValue = "";
137
138 resultSet->GetColumnIndex(MARK_TYPE, columnIndex);
139 resultSet->GetLong(columnIndex, longValue);
140 numberMarkInfo.markType = static_cast<MarkType>(longValue);
141
142 resultSet->GetColumnIndex(MARK_CONTENT, columnIndex);
143 resultSet->GetString(columnIndex, stringValue);
144 if (memcpy_s(numberMarkInfo.markContent, kMaxNumberLen, stringValue.c_str(), stringValue.length()) != EOK) {
145 TELEPHONY_LOGE("memcpy_s failed!");
146 return false;
147 }
148
149 resultSet->GetColumnIndex(MARK_COUNT, columnIndex);
150 resultSet->GetLong(columnIndex, longValue);
151 numberMarkInfo.markCount = longValue;
152
153 stringValue = "";
154 resultSet->GetColumnIndex(MARK_SOURCE, columnIndex);
155 resultSet->GetString(columnIndex, stringValue);
156 if (memcpy_s(numberMarkInfo.markSource, kMaxNumberLen, stringValue.c_str(), stringValue.length()) != EOK) {
157 TELEPHONY_LOGE("memcpy_s failed!");
158 return false;
159 }
160
161 resultSet->GetColumnIndex(IS_CLOUD, columnIndex);
162 resultSet->GetLong(columnIndex, longValue);
163 if (longValue == 1L) {
164 numberMarkInfo.isCloud = true;
165 } else {
166 numberMarkInfo.isCloud = false;
167 }
168
169 stringValue = "";
170 resultSet->GetColumnIndex(MARK_DETAILS, columnIndex);
171 resultSet->GetString(columnIndex, stringValue);
172 if (memcpy_s(numberMarkInfo.markDetails, kMaxNumberLen, stringValue.c_str(), stringValue.length()) != EOK) {
173 TELEPHONY_LOGE("memcpy_s failed!");
174 return false;
175 }
176 return true;
177 }
178 } // namespace Telephony
179 } // namespace OHOS