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