1/*
2 * Copyright (C) 2023 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_broadcast_subscriber_receiver.h"
17#include "sms_persist_helper.h"
18#include "telephony_log_wrapper.h"
19#include "want.h"
20#include "event_handler.h"
21#include "event_runner.h"
22
23namespace OHOS {
24namespace Telephony {
25using namespace EventFwk;
26
27std::queue<std::shared_ptr<SmsBroadcastSubscriberReceiver>> sptrQueue;
28std::shared_ptr<AppExecFwk::EventRunner> eventRunner_ = nullptr;
29std::shared_ptr<AppExecFwk::EventHandler> eventHandler_ = nullptr;
30
31SmsBroadcastSubscriberReceiver::SmsBroadcastSubscriberReceiver(const CommonEventSubscribeInfo &subscriberInfo,
32    std::shared_ptr<SmsReceiveReliabilityHandler> handler, uint16_t refId, uint16_t dataBaseId,
33    const std::string &address)
34    : CommonEventSubscriber(subscriberInfo)
35{
36    handler_ = handler;
37    refId_ = refId;
38    dataBaseId_ = dataBaseId;
39    address_ = address;
40}
41
42void SmsBroadcastSubscriberReceiver::OnReceiveEvent(const OHOS::EventFwk::CommonEventData &data)
43{
44    std::string action = data.GetWant().GetAction();
45    bool isSms = action == CommonEventSupport::COMMON_EVENT_SMS_RECEIVE_COMPLETED;
46    bool isWapPush = action == CommonEventSupport::COMMON_EVENT_SMS_WAPPUSH_RECEIVE_COMPLETED;
47    if (isSms || isWapPush) {
48        TELEPHONY_LOGI("OnReceiveEvent refId_ =%{public}d, dataBaseId_ =%{public}d", refId_, dataBaseId_);
49        if (handler_ == nullptr) {
50            TELEPHONY_LOGE("handler_ is nullptr");
51            return;
52        }
53        if (!address_.empty() && isSms) {
54            DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateContact(address_);
55        }
56        handler_->DeleteMessageFormDb(refId_, dataBaseId_);
57        // only save one object of eventrunner and eventhandler because each object will create a new thread.
58        if (eventRunner_ == nullptr) {
59            eventRunner_ = AppExecFwk::EventRunner::Create("unsubscribe thread");
60        }
61        if (eventHandler_ == nullptr) {
62            eventHandler_ = std::make_shared<AppExecFwk::EventHandler>(eventRunner_);
63        }
64        if (eventHandler_ == nullptr) {
65            TELEPHONY_LOGE("create eventhandler fail");
66            return;
67        }
68        // post a task that be excuted after 10s, and callback is static function in this class.
69        bool postTaskResult = eventHandler_->PostTask(UnsubscribeInCes, "unsubscribe event task", 10000);
70        if (!postTaskResult) {
71            TELEPHONY_LOGE("post unsubscribe task fail");
72        }
73    }
74}
75
76void SmsBroadcastSubscriberReceiver::UnsubscribeInCes()
77{
78    TELEPHONY_LOGE("UnsubscribeInCes entry");
79    if (sptrQueue.empty()) {
80        TELEPHONY_LOGE("SmsBroadcastSubscriberReceiver queue is empty");
81    } else {
82        auto smsBroadcastSubscriberReceiver = sptrQueue.front();
83        sptrQueue.pop();
84        // call api to unsubscribe
85        bool unsubscribeResult = CommonEventManager::UnSubscribeCommonEvent(smsBroadcastSubscriberReceiver);
86        if (!unsubscribeResult) {
87            TELEPHONY_LOGE("unsubscribe fail");
88        }
89    }
90}
91} // namespace Telephony
92} // namespace OHOS