• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "cdma_sms_receive_handler.h"
17 
18 #include "cdma_sms_common.h"
19 #include "cdma_sms_message.h"
20 #include "cdma_sms_sender.h"
21 #include "common_event.h"
22 #include "common_event_manager.h"
23 #include "common_event_support.h"
24 #include "core_manager_inner.h"
25 #include "radio_event.h"
26 #include "singleton.h"
27 #include "sms_common.h"
28 #include "sms_hisysevent.h"
29 #include "sms_persist_helper.h"
30 #include "sms_receive_reliability_handler.h"
31 #include "telephony_log_wrapper.h"
32 #include "telephony_permission.h"
33 #include "want.h"
34 
35 namespace OHOS {
36 namespace Telephony {
37 using namespace OHOS::EventFwk;
CdmaSmsReceiveHandler(int32_t slotId)38 CdmaSmsReceiveHandler::CdmaSmsReceiveHandler(int32_t slotId) : SmsReceiveHandler(slotId)
39 {
40     TELEPHONY_LOGI("%{public}d", slotId_);
41 }
42 
HandleSmsByType(const std::shared_ptr<SmsBaseMessage> smsBaseMessage)43 int32_t CdmaSmsReceiveHandler::HandleSmsByType(const std::shared_ptr<SmsBaseMessage> smsBaseMessage)
44 {
45     if (smsBaseMessage == nullptr) {
46         TELEPHONY_LOGE("SmsBaseMessage is null!");
47         return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
48     }
49     bool block = DelayedSingleton<SmsPersistHelper>::GetInstance()->QueryBlockPhoneNumber(
50         smsBaseMessage->GetOriginatingAddress());
51     if (block) {
52         TELEPHONY_LOGE("sms address is blocked");
53         SmsHiSysEvent::WriteSmsReceiveFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
54             SmsMmsErrorCode::SMS_ERROR_ADDRESS_BLOCKED, "The SMS address is blocked");
55         return AckIncomeCause::SMS_ACK_RESULT_OK;
56     }
57     CdmaSmsMessage *message = static_cast<CdmaSmsMessage *>(smsBaseMessage.get());
58     if (message->IsBroadcastMsg()) {
59         SendCBBroadcast(smsBaseMessage);
60         return AckIncomeCause::SMS_ACK_RESULT_OK;
61     }
62     int service = message->GetTransTeleService();
63     if (static_cast<int>(SmsTransTelsvcId::WEMT) != service && static_cast<int>(SmsTransTelsvcId::CMT_95) != service) {
64         return AckIncomeCause::SMS_ACK_RESULT_OK;
65     }
66     if (message->IsStatusReport() && !cdmaSmsSender_.expired()) {
67         std::shared_ptr<SmsSender> smsSender = cdmaSmsSender_.lock();
68         CdmaSmsSender *cdmaSend = static_cast<CdmaSmsSender *>(smsSender.get());
69         std::shared_ptr<SmsReceiveIndexer> statusInfo = std::make_shared<SmsReceiveIndexer>();
70         if (statusInfo == nullptr) {
71             TELEPHONY_LOGE("statusInfo is null!");
72             return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
73         }
74         statusInfo->SetMsgRefId(message->GetMsgRef());
75         statusInfo->SetPdu(message->GetRawPdu());
76         cdmaSend->ReceiveStatusReport(statusInfo);
77         return AckIncomeCause::SMS_ACK_RESULT_OK;
78     }
79     return HandleSmsOtherSvcid(smsBaseMessage);
80 }
81 
HandleSmsOtherSvcid(const std::shared_ptr<SmsBaseMessage> smsBaseMessage)82 int32_t CdmaSmsReceiveHandler::HandleSmsOtherSvcid(const std::shared_ptr<SmsBaseMessage> smsBaseMessage)
83 {
84     if (smsBaseMessage == nullptr) {
85         TELEPHONY_LOGE("SmsBaseMessage is null!");
86         return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
87     }
88     CdmaSmsMessage *message = static_cast<CdmaSmsMessage *>(smsBaseMessage.get());
89     // Encapsulate key information to Tracker
90     std::shared_ptr<SmsReceiveIndexer> indexer;
91     if (!message->IsConcatMsg()) {
92         indexer = std::make_shared<SmsReceiveIndexer>(message->GetRawPdu(), message->GetScTimestamp(),
93             message->GetDestPort(), true, false, message->GetOriginatingAddress(),
94             message->GetVisibleOriginatingAddress(), message->GetVisibleMessageBody());
95     } else {
96         std::shared_ptr<SmsConcat> smsConcat = message->GetConcatMsg();
97         if (smsConcat == nullptr) {
98             return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
99         }
100         indexer = std::make_shared<SmsReceiveIndexer>(message->GetRawPdu(), message->GetScTimestamp(),
101             message->GetDestPort(), true, message->GetOriginatingAddress(), message->GetVisibleOriginatingAddress(),
102             smsConcat->msgRef, smsConcat->seqNum, smsConcat->totalSeg, false, message->GetVisibleMessageBody());
103     }
104     // add messages to the database
105     if (indexer == nullptr) {
106         TELEPHONY_LOGE("indexer is nullptr.");
107         return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
108     }
109     TELEPHONY_LOGI("receive a cdma sms, this is %{public}d, a total of %{public}d", indexer->GetMsgSeqId(),
110         indexer->GetMsgCount());
111     if (indexer->GetIsText() && message->IsConcatMsg() && IsRepeatedMessagePart(indexer)) {
112         SmsHiSysEvent::WriteSmsReceiveFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
113             SmsMmsErrorCode::SMS_ERROR_REPEATED_ERROR, "cdma message repeated error");
114         return AckIncomeCause::SMS_ACK_REPEATED_ERROR;
115     }
116     if (!AddMsgToDB(indexer)) {
117         return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
118     }
119     auto reliabilityHandler = std::make_shared<SmsReceiveReliabilityHandler>(slotId_);
120     if (reliabilityHandler == nullptr) {
121         TELEPHONY_LOGE("reliabilityHandler nullptr");
122         return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
123     }
124     if (!reliabilityHandler->DeleteExpireSmsFromDB()) {
125         TELEPHONY_LOGE("DeleteExpireSmsFromDB fail");
126         return AckIncomeCause::SMS_ACK_UNKNOWN_ERROR;
127     }
128     CombineMessagePart(indexer);
129     return AckIncomeCause::SMS_ACK_RESULT_OK;
130 }
131 
ReplySmsToSmsc(int result,const std::shared_ptr<SmsBaseMessage> response)132 void CdmaSmsReceiveHandler::ReplySmsToSmsc(int result, const std::shared_ptr<SmsBaseMessage> response)
133 {
134     TELEPHONY_LOGI("Reply To Smsc ackResult %{public}d", result);
135     CoreManagerInner::GetInstance().SendSmsAck(
136         slotId_, SMS_EVENT_NEW_SMS_REPLY, result == AckIncomeCause::SMS_ACK_RESULT_OK, result, shared_from_this());
137 }
138 
SetCdmaSender(const std::weak_ptr<SmsSender> & smsSender)139 void CdmaSmsReceiveHandler::SetCdmaSender(const std::weak_ptr<SmsSender> &smsSender)
140 {
141     cdmaSmsSender_ = smsSender;
142 }
143 
TransformMessageInfo(const std::shared_ptr<SmsMessageInfo> info)144 std::shared_ptr<SmsBaseMessage> CdmaSmsReceiveHandler::TransformMessageInfo(const std::shared_ptr<SmsMessageInfo> info)
145 {
146     std::shared_ptr<SmsBaseMessage> baseMessage = nullptr;
147     if (info == nullptr) {
148         TELEPHONY_LOGE("SmsBaseMessage is null!");
149         return baseMessage;
150     }
151     std::string pdu = StringUtils::StringToHex(info->pdu);
152     baseMessage = CdmaSmsMessage::CreateMessage(pdu);
153     return baseMessage;
154 }
155 
Init()156 void CdmaSmsReceiveHandler::Init()
157 {
158     if (!RegisterHandler()) {
159         TELEPHONY_LOGI("GsmSmsSender::Init Register RADIO_SMS_STATUS fail.");
160     }
161 }
162 
RegisterHandler()163 bool CdmaSmsReceiveHandler::RegisterHandler()
164 {
165     TELEPHONY_LOGI("CdmaSmsReceiveHandler::RegisteHandler Register RADIO_CDMA_SMS ok.");
166     CoreManagerInner::GetInstance().RegisterCoreNotify(
167         slotId_, shared_from_this(), RadioEvent::RADIO_CDMA_SMS, nullptr);
168     return true;
169 }
170 
UnRegisterHandler()171 void CdmaSmsReceiveHandler::UnRegisterHandler()
172 {
173     TELEPHONY_LOGI("CdmaSmsReceiveHandler::UnRegisterHandler::slotId= %{public}d", slotId_);
174     CoreManagerInner::GetInstance().UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_CDMA_SMS);
175 }
176 
SendCBBroadcast(const std::shared_ptr<SmsBaseMessage> smsBaseMessage)177 bool CdmaSmsReceiveHandler::SendCBBroadcast(const std::shared_ptr<SmsBaseMessage> smsBaseMessage)
178 {
179     if (smsBaseMessage == nullptr) {
180         TELEPHONY_LOGE("smsBaseMessage is nullptr.");
181         return false;
182     }
183 
184     bool isMergency = false;
185     SmsCbData::CbData sendData;
186     GetCBData(smsBaseMessage, sendData, isMergency);
187     EventFwk::Want want;
188     EventFwk::CommonEventData data;
189     if (isMergency) {
190         want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SMS_EMERGENCY_CB_RECEIVE_COMPLETED);
191     } else {
192         want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SMS_CB_RECEIVE_COMPLETED);
193     }
194     SetCBBroadcastParam(want, sendData);
195     data.SetWant(want);
196     EventFwk::CommonEventPublishInfo publishInfo;
197     publishInfo.SetOrdered(true);
198     std::vector<std::string> cdmaCbPermissions;
199     cdmaCbPermissions.emplace_back(Permission::RECEIVE_MESSAGES);
200     publishInfo.SetSubscriberPermissions(cdmaCbPermissions);
201     bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
202     if (!publishResult) {
203         TELEPHONY_LOGE("SendBroadcast PublishBroadcastEvent result fail");
204         SmsHiSysEvent::WriteSmsReceiveFaultEvent(slotId_, SmsMmsMessageType::CELL_BROAD_CAST,
205             SmsMmsErrorCode::SMS_ERROR_PUBLISH_COMMON_EVENT_FAIL, "publish cell broadcast event fail");
206         return false;
207     }
208     DelayedSingleton<SmsHiSysEvent>::GetInstance()->SetCbBroadcastStartTime();
209     return true;
210 }
211 
SetCBBroadcastParam(AppExecFwk::Want & want,SmsCbData::CbData & sendData)212 bool CdmaSmsReceiveHandler::SetCBBroadcastParam(AppExecFwk::Want &want, SmsCbData::CbData &sendData)
213 {
214     const int lac = -1;
215     const int cid = -1;
216     want.SetParam(SmsCbData::GEO_SCOPE, static_cast<char>(sendData.geoScope));
217     want.SetParam(SmsCbData::CMAS_RESPONSE, static_cast<char>(sendData.cmasRes));
218     want.SetParam(SmsCbData::SLOT_ID, static_cast<int>(slotId_));
219     want.SetParam(SmsCbData::FORMAT, static_cast<char>(sendData.format));
220     want.SetParam(SmsCbData::CB_MSG_TYPE, static_cast<char>(sendData.msgType));
221     want.SetParam(SmsCbData::MSG_ID, static_cast<int>(sendData.msgId));
222     want.SetParam(SmsCbData::SERVICE_CATEGORY, static_cast<int>(sendData.category));
223     want.SetParam(SmsCbData::LANG_TYPE, static_cast<char>(sendData.langType));
224     want.SetParam(SmsCbData::PRIORITY, static_cast<char>(sendData.priority));
225     want.SetParam(SmsCbData::MSG_BODY, sendData.msgBody);
226     want.SetParam(SmsCbData::CMAS_CLASS, static_cast<char>(sendData.cmasClass));
227     want.SetParam(SmsCbData::CMAS_CATEGORY, static_cast<char>(sendData.cmasCate));
228     want.SetParam(SmsCbData::SEVERITY, static_cast<char>(sendData.severity));
229     want.SetParam(SmsCbData::URGENCY, static_cast<char>(sendData.urgency));
230     want.SetParam(SmsCbData::CERTAINTY, static_cast<char>(sendData.certainty));
231     want.SetParam(SmsCbData::IS_CMAS_MESSAGE, sendData.isCmas);
232     want.SetParam(SmsCbData::SERIAL_NUM, static_cast<int>(sendData.serial));
233     want.SetParam(SmsCbData::RECV_TIME, std::to_string(sendData.recvTime));
234     want.SetParam(SmsCbData::DCS, static_cast<char>(sendData.dcs));
235     want.SetParam(SmsCbData::IS_ETWS_PRIMARY, sendData.isPrimary);
236     want.SetParam(SmsCbData::IS_ETWS_MESSAGE, sendData.isEtws);
237     want.SetParam(SmsCbData::PLMN, StringUtils::ToUtf8(plmn_));
238     want.SetParam(SmsCbData::LAC, static_cast<int>(lac));
239     want.SetParam(SmsCbData::CID, static_cast<int>(cid));
240     want.SetParam(SmsCbData::WARNING_TYPE, static_cast<int>(sendData.warnType));
241     return true;
242 }
243 
GetCBData(const std::shared_ptr<SmsBaseMessage> smsBaseMessage,SmsCbData::CbData & sendData,bool & isEmergency)244 void CdmaSmsReceiveHandler::GetCBData(
245     const std::shared_ptr<SmsBaseMessage> smsBaseMessage, SmsCbData::CbData &sendData, bool &isEmergency)
246 {
247     if (smsBaseMessage == nullptr) {
248         TELEPHONY_LOGE("smsBaseMessage is nullptr.");
249         return;
250     }
251     CdmaSmsMessage *message = static_cast<CdmaSmsMessage *>(smsBaseMessage.get());
252     if (message == nullptr) {
253         TELEPHONY_LOGE("message is nullptr.");
254         return;
255     }
256 
257     sendData.format = message->GetFormat();
258     sendData.geoScope = message->GetGeoScope();
259     sendData.msgId = message->GetMessageId();
260     sendData.serial = message->GetMessageId();
261     sendData.category = message->GetServiceCategoty();
262     sendData.langType = static_cast<uint8_t>(message->GetLanguage());
263     sendData.msgBody = message->GetVisibleMessageBody();
264     sendData.priority = message->GetPriority();
265     sendData.isCmas = message->IsCMAS();
266     sendData.cmasClass = message->GetCMASMessageClass();
267     sendData.cmasCate = message->GetCMASCategory();
268     sendData.severity = message->GetCMASSeverity();
269     sendData.urgency = message->GetCMASUrgency();
270     sendData.certainty = message->GetCMASCertainty();
271     sendData.recvTime = message->GetReceTime();
272     sendData.langType = static_cast<uint8_t>(message->GetLanguage());
273     isEmergency = message->IsEmergencyMsg();
274     plmn_ = CoreManagerInner::GetInstance().GetOperatorNumeric(slotId_);
275 }
276 } // namespace Telephony
277 } // namespace OHOS
278