1 /*
2 * Copyright (C) 2021 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 "sms_persist_helper.h"
17
18 #include "ability_manager_interface.h"
19 #include "if_system_ability_manager.h"
20 #include "iservice_registry.h"
21 #include "parameter.h"
22 #include "phonenumbers/phonenumber.pb.h"
23 #include "resource_manager.h"
24 #include "string_utils.h"
25 #include "system_ability.h"
26 #include "system_ability_definition.h"
27 #include "telephony_errors.h"
28 #include "telephony_log_wrapper.h"
29
30 namespace OHOS {
31 namespace Telephony {
32 constexpr static uint8_t SMS_TYPE_CDMA = 2;
33 const std::string SMS_URI = "datashare:///com.ohos.smsmmsability";
34 const std::string SMS_SUBSECTION = "datashare:///com.ohos.smsmmsability/sms_mms/sms_subsection";
35 const std::string SMS_MMS_INFO = "datashare:///com.ohos.smsmmsability/sms_mms/sms_mms_info";
36 const std::string SMS_SESSION = "datashare:///com.ohos.smsmmsability/sms_mms/session";
37 const std::string CONTACT_URI = "datashare:///com.ohos.contactsdataability";
38 const std::string CONTACT_BLOCK = "datashare:///com.ohos.contactsdataability/contacts/contact_blocklist";
39 const std::string CONTACT_DATA = "datashare:///com.ohos.contactsdataability/contacts/contact_data";
40 const std::string RAW_CONTACT = "datashare:///com.ohos.contactsdataability/contacts/raw_contact";
41 const std::string ISO_COUNTRY_CODE = "CN";
42 const std::string PHONE_NUMBER = "phone_number";
43 const std::string DETAIL_INFO = "detail_info";
44 const std::string TYPE_ID = "type_id";
45 std::string ID = "id";
46 const std::string RAW_CONTACT_ID = "raw_contact_id";
47 const std::string CONTACTED_COUNT = "contacted_count";
48 const std::string LASTEST_CONTACTED_TIME = "lastest_contacted_time";
49 constexpr static uint8_t TYPE_ID_VALUE = 5;
50 const std::string PREFIX = "+86";
51 const std::string NUMBER_START_STR = "192";
52
SmsPersistHelper()53 SmsPersistHelper::SmsPersistHelper() {}
54
~SmsPersistHelper()55 SmsPersistHelper::~SmsPersistHelper() {}
56
CreateDataShareHelper(const std::string & uri)57 std::shared_ptr<DataShare::DataShareHelper> SmsPersistHelper::CreateDataShareHelper(const std::string &uri)
58 {
59 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
60 if (saManager == nullptr) {
61 TELEPHONY_LOGE(" Get system ability mgr failed.");
62 return nullptr;
63 }
64 auto remoteObj = saManager->GetSystemAbility(TELEPHONY_SMS_MMS_SYS_ABILITY_ID);
65 if (remoteObj == nullptr) {
66 TELEPHONY_LOGE("GetSystemAbility Service Failed.");
67 return nullptr;
68 }
69 return DataShare::DataShareHelper::Creator(remoteObj, uri);
70 }
71
Insert(DataShare::DataShareValuesBucket & values,uint16_t & dataBaseId)72 bool SmsPersistHelper::Insert(DataShare::DataShareValuesBucket &values, uint16_t &dataBaseId)
73 {
74 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(SMS_URI);
75 if (helper == nullptr) {
76 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
77 return false;
78 }
79 Uri uri(SMS_SUBSECTION);
80 int ret = helper->Insert(uri, values);
81 helper->Release();
82 dataBaseId = ret;
83 return ret >= 0 ? true : false;
84 }
85
Insert(std::string tableUri,DataShare::DataShareValuesBucket & values)86 bool SmsPersistHelper::Insert(std::string tableUri, DataShare::DataShareValuesBucket &values)
87 {
88 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(SMS_URI);
89 if (helper == nullptr) {
90 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
91 return false;
92 }
93 Uri uri(tableUri);
94 int ret = helper->Insert(uri, values);
95 helper->Release();
96 return ret >= 0 ? true : false;
97 }
98
QuerySession(DataShare::DataSharePredicates & predicates,uint16_t & sessionId,uint16_t & messageCount)99 bool SmsPersistHelper::QuerySession(
100 DataShare::DataSharePredicates &predicates, uint16_t &sessionId, uint16_t &messageCount)
101 {
102 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(SMS_URI);
103 if (helper == nullptr) {
104 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
105 return false;
106 }
107 Uri uri(SMS_SESSION);
108 std::vector<std::string> columns;
109 auto resultSet = helper->Query(uri, predicates, columns);
110 if (resultSet == nullptr) {
111 TELEPHONY_LOGE("Query Result Set nullptr Failed.");
112 helper->Release();
113 return false;
114 }
115 resultSet->GoToFirstRow();
116 int32_t columnInt;
117 int columnIndex;
118 resultSet->GetColumnIndex("id", columnIndex);
119 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
120 sessionId = columnInt;
121 }
122 resultSet->GetColumnIndex("message_count", columnIndex);
123 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
124 messageCount = columnInt;
125 resultSet->Close();
126 helper->Release();
127 return true;
128 }
129 resultSet->Close();
130 helper->Release();
131 return false;
132 }
133
Update(DataShare::DataSharePredicates & predicates,DataShare::DataShareValuesBucket & values)134 bool SmsPersistHelper::Update(DataShare::DataSharePredicates &predicates, DataShare::DataShareValuesBucket &values)
135 {
136 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(SMS_URI);
137 if (helper == nullptr) {
138 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
139 return false;
140 }
141 Uri uri(SMS_SESSION);
142 int ret = helper->Update(uri, predicates, values);
143 helper->Release();
144 return ret >= 0 ? true : false;
145 }
146
Query(DataShare::DataSharePredicates & predicates,std::vector<SmsReceiveIndexer> & indexers)147 bool SmsPersistHelper::Query(DataShare::DataSharePredicates &predicates, std::vector<SmsReceiveIndexer> &indexers)
148 {
149 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(SMS_URI);
150 if (helper == nullptr) {
151 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
152 return false;
153 }
154 Uri uri(SMS_SUBSECTION);
155 std::vector<std::string> columns;
156 auto resultSet = helper->Query(uri, predicates, columns);
157 if (resultSet == nullptr) {
158 TELEPHONY_LOGE("Query Result Set nullptr Failed.");
159 helper->Release();
160 return false;
161 }
162
163 int resultSetNum = resultSet->GoToFirstRow();
164 while (resultSetNum == 0) {
165 SmsReceiveIndexer indexer;
166 ResultSetConvertToIndexer(indexer, resultSet);
167 indexers.push_back(indexer);
168 resultSetNum = resultSet->GoToNextRow();
169 }
170 resultSet->Close();
171 helper->Release();
172 return true;
173 }
174
QueryMaxGroupId(DataShare::DataSharePredicates & predicates,uint16_t & maxGroupId)175 bool SmsPersistHelper::QueryMaxGroupId(DataShare::DataSharePredicates &predicates, uint16_t &maxGroupId)
176 {
177 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(SMS_URI);
178 if (helper == nullptr) {
179 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
180 return false;
181 }
182 Uri uri(SMS_MMS_INFO);
183 std::vector<std::string> columns;
184 auto resultSet = helper->Query(uri, predicates, columns);
185 if (resultSet == nullptr) {
186 TELEPHONY_LOGE("Query Result Set nullptr Failed.");
187 helper->Release();
188 return false;
189 }
190
191 int32_t columnInt;
192 int columnIndex;
193 resultSet->GoToLastRow();
194 resultSet->GetColumnIndex(SmsMmsInfo::GROUP_ID, columnIndex);
195 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
196 maxGroupId = columnInt;
197 }
198 resultSet->Close();
199 helper->Release();
200 return true;
201 }
202
Delete(DataShare::DataSharePredicates & predicates)203 bool SmsPersistHelper::Delete(DataShare::DataSharePredicates &predicates)
204 {
205 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(SMS_URI);
206 if (helper == nullptr) {
207 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
208 return false;
209 }
210 Uri uri(SMS_SUBSECTION);
211 int ret = helper->Delete(uri, predicates);
212 helper->Release();
213 return ret >= 0 ? true : false;
214 }
215
QueryBlockPhoneNumber(const std::string & phoneNum)216 bool SmsPersistHelper::QueryBlockPhoneNumber(const std::string &phoneNum)
217 {
218 bool result = false;
219 if (phoneNum.empty()) {
220 return result;
221 }
222 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(CONTACT_URI);
223 if (helper == nullptr) {
224 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
225 return false;
226 }
227 Uri uri(CONTACT_BLOCK);
228 std::vector<std::string> columns;
229 DataShare::DataSharePredicates predicates;
230 std::string nationalNum;
231 std::string internationalNum;
232 int32_t ret = FormatSmsNumber(
233 phoneNum, ISO_COUNTRY_CODE, i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::NATIONAL, nationalNum);
234 if (ret != TELEPHONY_SUCCESS) {
235 TELEPHONY_LOGE("Phone Number format Failed.");
236 nationalNum = phoneNum;
237 }
238 ret = FormatSmsNumber(phoneNum, ISO_COUNTRY_CODE,
239 i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::INTERNATIONAL, internationalNum);
240 if (ret != TELEPHONY_SUCCESS) {
241 TELEPHONY_LOGE("Phone Number format Failed.");
242 internationalNum = phoneNum;
243 }
244 predicates.EqualTo(PHONE_NUMBER, nationalNum)->Or()->EqualTo(PHONE_NUMBER, internationalNum);
245 auto resultSet = helper->Query(uri, predicates, columns);
246 if (resultSet == nullptr) {
247 TELEPHONY_LOGE("Query Result Set nullptr Failed.");
248 helper->Release();
249 return result;
250 }
251 int count = 0;
252 if (resultSet->GetRowCount(count) == 0 && count != 0) {
253 result = true;
254 }
255 resultSet->Close();
256 helper->Release();
257 return result;
258 }
259
FormatSmsNumber(const std::string & num,std::string countryCode,const i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat formatInfo,std::string & formatNum)260 int32_t SmsPersistHelper::FormatSmsNumber(const std::string &num, std::string countryCode,
261 const i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat formatInfo, std::string &formatNum)
262 {
263 if (num.empty()) {
264 TELEPHONY_LOGE("num is nullptr!");
265 return TELEPHONY_ERR_ARGUMENT_INVALID;
266 }
267 i18n::phonenumbers::PhoneNumberUtil *phoneUtils = i18n::phonenumbers::PhoneNumberUtil::GetInstance();
268 if (phoneUtils == nullptr) {
269 TELEPHONY_LOGE("phoneUtils is nullptr");
270 return TELEPHONY_ERR_LOCAL_PTR_NULL;
271 }
272 transform(countryCode.begin(), countryCode.end(), countryCode.begin(), ::toupper);
273 i18n::phonenumbers::PhoneNumber parseResult;
274 phoneUtils->Parse(num, countryCode, &parseResult);
275 if (phoneUtils->IsValidNumber(parseResult)) {
276 phoneUtils->Format(parseResult, formatInfo, &formatNum);
277 } else {
278 std::string numTemp = "";
279 numTemp.assign(num);
280 CbnFormat(numTemp, formatInfo, formatNum);
281 }
282 if (formatNum.empty() || formatNum == "0") {
283 TELEPHONY_LOGE("FormatSmsNumber failed!");
284 return TELEPHONY_ERROR;
285 }
286 TrimSpace(formatNum);
287 return TELEPHONY_SUCCESS;
288 }
289
CbnFormat(std::string & numTemp,const i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat formatInfo,std::string & formatNum)290 void SmsPersistHelper::CbnFormat(std::string &numTemp,
291 const i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat formatInfo, std::string &formatNum)
292 {
293 TELEPHONY_LOGD("into CbnFormat");
294 if (numTemp.substr(0, NUMBER_START_STR.size()) == NUMBER_START_STR ||
295 numTemp.substr(PREFIX.size(), NUMBER_START_STR.size()) == NUMBER_START_STR) {
296 if (formatInfo == i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::NATIONAL) {
297 if (numTemp.substr(0, PREFIX.size()) == PREFIX) {
298 numTemp.erase(0, PREFIX.size());
299 formatNum.assign(numTemp);
300 return;
301 }
302 formatNum.assign(numTemp);
303 return;
304 }
305 if (formatInfo == i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::INTERNATIONAL) {
306 if (numTemp.substr(0, PREFIX.size()) == PREFIX) {
307 formatNum.assign(numTemp);
308 return;
309 }
310 formatNum.assign(PREFIX + numTemp);
311 }
312 }
313 }
314
TrimSpace(std::string & num)315 void SmsPersistHelper::TrimSpace(std::string &num)
316 {
317 std::string word;
318 std::stringstream streamNum(num);
319 std::string store;
320 while (streamNum >> word) {
321 store += word;
322 }
323 num = store;
324 }
325
UpdateContact(const std::string & address)326 bool SmsPersistHelper::UpdateContact(const std::string &address)
327 {
328 bool result = false;
329 if (address.empty()) {
330 TELEPHONY_LOGE("address empty");
331 return result;
332 }
333 int32_t rawCountId = 0;
334 int32_t contactedCount = 0;
335 bool ret = QueryContactedCount(address, rawCountId, contactedCount);
336 if (!ret) {
337 TELEPHONY_LOGE("get contacted count fail");
338 return result;
339 }
340 TELEPHONY_LOGI("rawCountId:%{public}d, contactedCount:%{public}d", rawCountId, contactedCount);
341 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(CONTACT_URI);
342 if (helper == nullptr) {
343 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
344 return false;
345 }
346 std::time_t timep;
347 int64_t currentTime = time(&timep);
348 Uri uri(RAW_CONTACT);
349 DataShare::DataSharePredicates predicates;
350 predicates.EqualTo(ID, rawCountId);
351 DataShare::DataShareValuesBucket bucket;
352 bucket.Put(CONTACTED_COUNT, contactedCount + 1);
353 bucket.Put(LASTEST_CONTACTED_TIME, std::to_string(currentTime));
354 auto updateValue = helper->Update(uri, predicates, bucket);
355 TELEPHONY_LOGI("updateValue:%{public}d", updateValue);
356 helper->Release();
357 return updateValue >= 0 ? true : false;
358 }
359
QueryContactedCount(const std::string & address,int32_t & rawCountId,int32_t & contactedCount)360 bool SmsPersistHelper::QueryContactedCount(const std::string &address, int32_t &rawCountId, int32_t &contactedCount)
361 {
362 bool ret = QueryRawContactId(address, rawCountId);
363 if (!ret) {
364 TELEPHONY_LOGE("no sms address in contact");
365 return ret;
366 }
367 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(CONTACT_URI);
368 if (helper == nullptr) {
369 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
370 return false;
371 }
372 Uri uri(RAW_CONTACT);
373 std::vector<std::string> columns;
374 DataShare::DataSharePredicates predicates;
375 predicates.EqualTo(ID, rawCountId);
376 auto resultSet = helper->Query(uri, predicates, columns);
377 bool result = false;
378 if (resultSet == nullptr) {
379 TELEPHONY_LOGE("result set nullptr.");
380 helper->Release();
381 return result;
382 }
383 int32_t count = 0;
384 if (resultSet->GetRowCount(count) == 0 && count != 0) {
385 resultSet->GoToFirstRow();
386 int columnIndex;
387 resultSet->GetColumnIndex(CONTACTED_COUNT, columnIndex);
388 if (resultSet->GetInt(columnIndex, contactedCount) == 0) {
389 result = true;
390 }
391 }
392 resultSet->Close();
393 helper->Release();
394 return result;
395 }
396
QueryRawContactId(const std::string & address,int32_t & rawCountId)397 bool SmsPersistHelper::QueryRawContactId(const std::string &address, int32_t &rawCountId)
398 {
399 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(CONTACT_URI);
400 if (helper == nullptr) {
401 TELEPHONY_LOGE("Create Data Ability Helper nullptr Failed.");
402 return false;
403 }
404 Uri uri(CONTACT_DATA);
405 std::vector<std::string> columns;
406 DataShare::DataSharePredicates predicates;
407 std::string nationalNum;
408 std::string internationalNum;
409 int32_t ret = FormatSmsNumber(
410 address, ISO_COUNTRY_CODE, i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::NATIONAL, nationalNum);
411 if (ret != TELEPHONY_SUCCESS) {
412 TELEPHONY_LOGE("Phone Number format Failed.");
413 nationalNum = address;
414 }
415 ret = FormatSmsNumber(address, ISO_COUNTRY_CODE,
416 i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::INTERNATIONAL, internationalNum);
417 if (ret != TELEPHONY_SUCCESS) {
418 TELEPHONY_LOGE("Phone Number format Failed.");
419 internationalNum = address;
420 }
421 predicates.EqualTo(DETAIL_INFO, nationalNum)->Or()->EqualTo(DETAIL_INFO, internationalNum);
422 predicates.EqualTo(TYPE_ID, TYPE_ID_VALUE);
423 auto resultSet = helper->Query(uri, predicates, columns);
424 bool result = false;
425 if (resultSet == nullptr) {
426 TELEPHONY_LOGE("result set nullptr.");
427 helper->Release();
428 return result;
429 }
430 int32_t count = 0;
431 if (resultSet->GetRowCount(count) == 0 && count != 0) {
432 resultSet->GoToFirstRow();
433 int columnIndex;
434 resultSet->GetColumnIndex(RAW_CONTACT_ID, columnIndex);
435 if (resultSet->GetInt(columnIndex, rawCountId) == 0) {
436 result = true;
437 }
438 }
439 resultSet->Close();
440 helper->Release();
441 return result;
442 }
443
QueryParamBoolean(const std::string key,bool defValue)444 bool SmsPersistHelper::QueryParamBoolean(const std::string key, bool defValue)
445 {
446 const int PARAM_SIZE = 64;
447 char paramOutBuff[PARAM_SIZE] = { 0 };
448 std::string defStrValue = defValue ? "1" : "0";
449 std::string paramValue(defStrValue);
450
451 int retLen = GetParameter(key.c_str(), defStrValue.c_str(), paramOutBuff, PARAM_SIZE);
452 if (retLen > 0) {
453 paramOutBuff[retLen] = '\0';
454 paramValue.assign(paramOutBuff, retLen);
455 }
456
457 TELEPHONY_LOGI("QueryParamBoolean: %{public}zu : %{public}s", paramValue.size(), paramValue.c_str());
458 if ((paramValue == std::string("1")) || (paramValue == std::string("y")) || (paramValue == std::string("yes")) ||
459 (paramValue == std::string("on")) || (paramValue == std::string("true"))) {
460 return true;
461 } else if ((paramValue == std::string("0")) || (paramValue == std::string("n")) ||
462 (paramValue == std::string("no")) || (paramValue == std::string("off")) ||
463 (paramValue == std::string("false"))) {
464 return false;
465 }
466 return defValue;
467 }
468
ConvertIntToIndexer(SmsReceiveIndexer & info,const std::shared_ptr<DataShare::DataShareResultSet> & resultSet)469 void SmsPersistHelper::ConvertIntToIndexer(
470 SmsReceiveIndexer &info, const std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
471 {
472 int32_t columnInt;
473 int columnIndex;
474 resultSet->GetColumnIndex(SmsSubsection::FORMAT, columnIndex);
475 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
476 info.SetIsCdma(columnInt == SMS_TYPE_CDMA);
477 }
478
479 resultSet->GetColumnIndex(SmsSubsection::SMS_SUBSECTION_ID, columnIndex);
480 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
481 info.SetMsgRefId(columnInt);
482 }
483
484 resultSet->GetColumnIndex(SmsSubsection::SIZE, columnIndex);
485 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
486 info.SetMsgCount(columnInt);
487 }
488
489 resultSet->GetColumnIndex(SmsSubsection::SUBSECTION_INDEX, columnIndex);
490 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
491 info.SetMsgSeqId(columnInt);
492 }
493
494 resultSet->GetColumnIndex(SmsSubsection::DEST_PORT, columnIndex);
495 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
496 info.SetDestPort(columnInt);
497 }
498
499 resultSet->GetColumnIndex(SmsSubsection::ID, columnIndex);
500 if (resultSet->GetInt(columnIndex, columnInt) == 0) {
501 info.SetDataBaseId(columnInt);
502 }
503 }
504
ConvertStringToIndexer(SmsReceiveIndexer & info,const std::shared_ptr<DataShare::DataShareResultSet> & resultSet)505 void SmsPersistHelper::ConvertStringToIndexer(
506 SmsReceiveIndexer &info, const std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
507 {
508 int columnIndex;
509 std::string columnValue;
510 resultSet->GetColumnIndex(SmsSubsection::RECEIVER_NUMBER, columnIndex);
511 if (resultSet->GetString(columnIndex, columnValue) == 0) {
512 info.SetVisibleAddress(columnValue);
513 }
514 resultSet->GetColumnIndex(SmsSubsection::SENDER_NUMBER, columnIndex);
515 if (resultSet->GetString(columnIndex, columnValue) == 0) {
516 info.SetOriginatingAddress(columnValue);
517 }
518
519 resultSet->GetColumnIndex(SmsSubsection::START_TIME, columnIndex);
520 if (resultSet->GetString(columnIndex, columnValue) == 0) {
521 info.SetTimestamp(std::stol(columnValue));
522 }
523 resultSet->GetColumnIndex(SmsSubsection::END_TIME, columnIndex);
524 if (resultSet->GetString(columnIndex, columnValue) == 0) {
525 info.SetTimestamp(std::stol(columnValue));
526 }
527
528 resultSet->GetColumnIndex(SmsSubsection::REW_PUD, columnIndex);
529 if (resultSet->GetString(columnIndex, columnValue) == 0) {
530 info.SetPdu(StringUtils::HexToByteVector(columnValue));
531 }
532 }
533
ResultSetConvertToIndexer(SmsReceiveIndexer & info,const std::shared_ptr<DataShare::DataShareResultSet> & resultSet)534 void SmsPersistHelper::ResultSetConvertToIndexer(
535 SmsReceiveIndexer &info, const std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
536 {
537 ConvertIntToIndexer(info, resultSet);
538 ConvertStringToIndexer(info, resultSet);
539 }
540 } // namespace Telephony
541 } // namespace OHOS
542