• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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