/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LOG_TAG #define LOG_TAG "CallbackHandlerInner" #endif #include "callback_handler.h" #include "event_handler.h" #include "event_runner.h" #include "audio_service_log.h" namespace OHOS { namespace AudioStandard { using namespace std; class CallbackHandlerInner : public CallbackHandler, public AppExecFwk::EventHandler { public: explicit CallbackHandlerInner(std::shared_ptr<IHandler> iHandler, const std::string &handlerName); ~CallbackHandlerInner(); void SendCallbackEvent(uint32_t eventCode, int64_t data) override; void SendCallbackEvent(uint32_t eventCode, int64_t data, int64_t delayTime) override; void ReleaseEventRunner() override; protected: void ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) override; private: std::weak_ptr<IHandler> iHandler_; }; std::shared_ptr<CallbackHandler> CallbackHandler::GetInstance(std::shared_ptr<IHandler> iHandler, const std::string &handlerName) { return std::make_shared<CallbackHandlerInner>(iHandler, handlerName); } CallbackHandlerInner::CallbackHandlerInner(std::shared_ptr<IHandler> iHandler, const std::string &handlerName) : AppExecFwk::EventHandler(AppExecFwk::EventRunner::Create(handlerName)) { iHandler_ = iHandler; } CallbackHandlerInner::~CallbackHandlerInner() { AUDIO_WARNING_LOG("Destructor callback handler inner"); } void CallbackHandlerInner::SendCallbackEvent(uint32_t eventCode, int64_t data) { SendEvent(AppExecFwk::InnerEvent::Get(eventCode, data)); } void CallbackHandlerInner::SendCallbackEvent(uint32_t eventCode, int64_t data, int64_t delayTime) { SendEvent(AppExecFwk::InnerEvent::Get(eventCode, data), delayTime, Priority::LOW); } void CallbackHandlerInner::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) { uint32_t eventCode = event->GetInnerEventId(); int64_t data = event->GetParam(); std::shared_ptr<IHandler> handler = iHandler_.lock(); if (handler == nullptr) { AUDIO_ERR_LOG("iHandler is nullptr"); return; } handler->OnHandle(eventCode, data); } void CallbackHandlerInner::ReleaseEventRunner() { SetEventRunner(nullptr); } } // namespace AudioStandard } // namespace OHOS