From: Ilho Kim Date: Mon, 23 Aug 2021 01:29:02 +0000 (+0900) Subject: Implement EventSignalSender X-Git-Tag: submit/tizen/20210826.063234~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5dc9a847614a1ceed6ddf0e48b8b56cd539212a0;p=platform%2Fcore%2Fappfw%2Fpkgmgr-tool.git Implement EventSignalSender Change-Id: Ie9caa2fa8d39272132a100cbcd0930da49d5c4f5 Signed-off-by: Ilho Kim --- diff --git a/src/res-copy/CMakeLists.txt b/src/res-copy/CMakeLists.txt index 1e960e1..172cabd 100644 --- a/src/res-copy/CMakeLists.txt +++ b/src/res-copy/CMakeLists.txt @@ -11,7 +11,9 @@ APPLY_PKG_CONFIG(${TARGET_RES_COPY} PUBLIC GLIB_DEPS BUNDLE_DEPS Boost + PKGMGR_DEPS PKGMGR_INFO_DEPS + PKGMGR_INSTALLER_DEPS TZPLATFORM_DEPS ) diff --git a/src/res-copy/include/error_type.hh b/src/res-copy/include/error_type.hh index 3d25689..c2309bd 100644 --- a/src/res-copy/include/error_type.hh +++ b/src/res-copy/include/error_type.hh @@ -17,17 +17,19 @@ #ifndef ERROR_TYPE_HH_ #define ERROR_TYPE_HH_ +#include + namespace res_handler { enum ErrorType { - ERROR_NONE = 0, - ERROR_INVALID_PARAMETER, - ERROR_PKG_NOT_FOUND, - ERROR_PERMISSION_DENIED, - ERROR_SYSTEM_ERROR, - ERROR_RES_NOT_FOUND, - ERROR_OUT_OF_SPACE, - ERROR_OUT_OF_MEMORY + ERROR_NONE = PKGMGR_INSTALLER_ERRCODE_OK, + ERROR_INVALID_PARAMETER = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE, + ERROR_PKG_NOT_FOUND = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND, + ERROR_PERMISSION_DENIED = PKGMGR_INSTALLER_ERRCODE_SECURITY_ERROR, + ERROR_SYSTEM_ERROR = PKGMGR_INSTALLER_ERRCODE_ERROR, + ERROR_RES_NOT_FOUND = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND, + ERROR_OUT_OF_SPACE = PKGMGR_INSTALLER_ERRCODE_OUT_OF_SPACE, + ERROR_OUT_OF_MEMORY = PKGMGR_INSTALLER_ERRCODE_ERROR }; } // namespace res_handler diff --git a/src/res-copy/include/event_signal_sender.hh b/src/res-copy/include/event_signal_sender.hh index 9bb5fb3..3f0c52d 100644 --- a/src/res-copy/include/event_signal_sender.hh +++ b/src/res-copy/include/event_signal_sender.hh @@ -17,8 +17,11 @@ #ifndef EVENT_SIGNAL_SENDER_HH_ #define EVENT_SIGNAL_SENDER_HH_ +#include #include +#include + #include "include/error_type.hh" #include "include/request_type.hh" @@ -26,16 +29,24 @@ namespace res_handler { class EventSignalSender { public: - EventSignalSender() : pkgid_(""), req_type_(ReqType::REQ_TYPE_UNKNOWN) {}; + EventSignalSender(pkgmgr_installer* installer); bool SendStart(); bool SendOK(); bool SendFail(ErrorType error); void SetPkgID(std::string pkgid); void SetReqType(ReqType req_type); + void SetUID(uid_t uid); + void SetSessionID(std::string session_id); private: + bool SendSignal(const char* status, ErrorType error); + std::string pkgid_; ReqType req_type_; + uid_t uid_; + std::string session_id_; + std::unique_ptr installer_; }; } // res_handler diff --git a/src/res-copy/include/param_checker.hh b/src/res-copy/include/param_checker.hh index 7434863..8fa10fb 100644 --- a/src/res-copy/include/param_checker.hh +++ b/src/res-copy/include/param_checker.hh @@ -30,6 +30,7 @@ class ParamChecker { ParamChecker(int argc, char* argv[]); ReqType GetRequestType(); std::string GetPkgID() const; + std::string GetSessionID() const; uid_t GetUID() const; const std::list& GetPathList() const; bool Validate(); diff --git a/src/res-copy/include/request_handler_invoker.hh b/src/res-copy/include/request_handler_invoker.hh index d4fff8b..be52769 100644 --- a/src/res-copy/include/request_handler_invoker.hh +++ b/src/res-copy/include/request_handler_invoker.hh @@ -28,16 +28,17 @@ namespace res_handler { class RequestHandlerInvoker { public: - RequestHandlerInvoker(ParamChecker option, EventSignalSender signal); + RequestHandlerInvoker(ParamChecker option, + std::shared_ptr signal); bool Validate(); bool Execute(); const std::string GetHandlerType() const; private: - std::unique_ptr handler_; ParamChecker option_; - EventSignalSender signal_; + std::unique_ptr handler_; + std::shared_ptr signal_; void SetReqHandler(); }; diff --git a/src/res-copy/src/event_signal_sender.cc b/src/res-copy/src/event_signal_sender.cc index 332ca27..b6c23d4 100644 --- a/src/res-copy/src/event_signal_sender.cc +++ b/src/res-copy/src/event_signal_sender.cc @@ -20,25 +20,65 @@ #include #include +#include +#include + #include "include/error_type.hh" #include "include/request_type.hh" +#include "include/logging.hh" namespace res_handler { +EventSignalSender::EventSignalSender(pkgmgr_installer* installer) + : pkgid_(""), req_type_(ReqType::REQ_TYPE_UNKNOWN), + installer_(installer, pkgmgr_installer_free) {} + +bool EventSignalSender::SendSignal(const char* status, ErrorType error) { + if (!installer_) + return false; + + std::unique_ptr + event_info(pkgmgr_res_event_info_new(), pkgmgr_res_event_info_free); + if (!event_info) { + LOG(ERROR) << "Fail to create event info"; + return false; + } + + pkgmgr_res_event_info_set_error_code(event_info.get(), + static_cast(error)); + + if (pkgmgr_installer_send_res_copy_signal(installer_.get(), pkgid_.c_str(), + status, event_info.get()) != 0) { + LOG(ERROR) << "Fail to send resource copy signal"; + return false; + } + + return true; +} + bool EventSignalSender::SendStart() { - std::cout << "EventSignalSender::SendStart" << std::endl; + if (!SendSignal(PKGMGR_INSTALLER_START_KEY_STR, ErrorType::ERROR_NONE)) { + LOG(ERROR) << "Fail to send start signal"; + return false; + } return true; } bool EventSignalSender::SendOK() { - std::cout << "EventSignalSender::SendOK" << std::endl; + if (!SendSignal(PKGMGR_INSTALLER_OK_EVENT_STR, ErrorType::ERROR_NONE)) { + LOG(ERROR) << "Fail to send ok signal"; + return false; + } return true; } bool EventSignalSender::SendFail(ErrorType error) { - std::cout << "EventSignalSender::SendFail" << std::endl; + if (!SendSignal(PKGMGR_INSTALLER_FAIL_EVENT_STR, error)) { + LOG(ERROR) << "Fail to send fail signal"; + return false; + } return true; } @@ -48,7 +88,27 @@ void EventSignalSender::SetPkgID(std::string pkgid) { } void EventSignalSender::SetReqType(ReqType req_type) { + if (req_type == ReqType::REQ_TYPE_NEW) + pkgmgr_installer_set_request_type(installer_.get(), PKGMGR_REQ_RES_COPY); + else if (req_type == ReqType::REQ_TYPE_CREATEDIR) + pkgmgr_installer_set_request_type(installer_.get(), + PKGMGR_REQ_RES_CREATE_DIR); + else if (req_type == ReqType::REQ_TYPE_REMOVE) + pkgmgr_installer_set_request_type(installer_.get(), PKGMGR_REQ_RES_REMOVE); + else if (req_type == ReqType::REQ_TYPE_UNINSTALL) + pkgmgr_installer_set_request_type(installer_.get(), + PKGMGR_REQ_RES_UNINSTALL); req_type_ = req_type; } +void EventSignalSender::SetUID(uid_t uid) { + pkgmgr_installer_set_uid(installer_.get(), uid); + uid_ = uid; +} + +void EventSignalSender::SetSessionID(std::string session_id) { + pkgmgr_installer_set_session_id(installer_.get(), session_id.c_str()); + session_id_ = session_id; +} + } // namespace res_handler diff --git a/src/res-copy/src/param_checker.cc b/src/res-copy/src/param_checker.cc index 72083a0..a34d37c 100644 --- a/src/res-copy/src/param_checker.cc +++ b/src/res-copy/src/param_checker.cc @@ -58,7 +58,8 @@ ParamChecker::ParamChecker(int argc, char* argv[]) { options.add_options() ("uid,u", bpo::value()->default_value(0), "user id") - ("session-id,k", bpo::value(), "session id") + ("session-id,k", bpo::value()->default_value(""), + "session id") ("path,p", bpo::value>()->multitoken(), "source-destination path") ("remove,r", bpo::value(), "remove shared resource") @@ -100,6 +101,10 @@ std::string ParamChecker::GetPkgID() const { return pkgid_; } +std::string ParamChecker::GetSessionID() const { + return session_id_; +} + uid_t ParamChecker::GetUID() const { return uid_; } diff --git a/src/res-copy/src/request_handler_invoker.cc b/src/res-copy/src/request_handler_invoker.cc index 588182c..a0da08d 100644 --- a/src/res-copy/src/request_handler_invoker.cc +++ b/src/res-copy/src/request_handler_invoker.cc @@ -46,7 +46,7 @@ std::string GetRootPathForUid(uid_t uid) { namespace res_handler { RequestHandlerInvoker::RequestHandlerInvoker( - ParamChecker option, EventSignalSender signal) : + ParamChecker option, std::shared_ptr signal) : option_(option), signal_(signal) { SetReqHandler(); } @@ -54,6 +54,7 @@ RequestHandlerInvoker::RequestHandlerInvoker( bool RequestHandlerInvoker::Validate() { if (handler_ == nullptr) { LOG(ERROR) << "Failed to initialize handler"; + signal_->SendFail(ErrorType::ERROR_SYSTEM_ERROR); return false; } @@ -62,6 +63,7 @@ bool RequestHandlerInvoker::Validate() { option_.GetRequestType(), option_.GetPathList()) != ErrorType::ERROR_NONE) { LOG(ERROR) << "Validation failed"; + signal_->SendFail(ErrorType::ERROR_SYSTEM_ERROR); return false; } @@ -69,11 +71,18 @@ bool RequestHandlerInvoker::Validate() { } bool RequestHandlerInvoker::Execute() { - if (handler_ == nullptr) + if (handler_ == nullptr) { + signal_->SendFail(ErrorType::ERROR_SYSTEM_ERROR); return false; + } - if (handler_->Execute() != ErrorType::ERROR_NONE) + signal_->SendStart(); + ErrorType ret = handler_->Execute(); + if (ret != ErrorType::ERROR_NONE) { + signal_->SendFail(ret); return false; + } + signal_->SendOK(); return true; } diff --git a/src/res-copy/src/res_handler.cc b/src/res-copy/src/res_handler.cc index b15b030..8790639 100644 --- a/src/res-copy/src/res_handler.cc +++ b/src/res-copy/src/res_handler.cc @@ -18,6 +18,8 @@ #include +#include + #include "include/event_signal_sender.hh" #include "include/logging.hh" #include "include/param_checker.hh" @@ -26,17 +28,26 @@ namespace res_handler { bool ResHandler::Init(int argc, char* argv[]) { + pkgmgr_installer *installer = pkgmgr_installer_new(); + if (!installer) { + LOG(ERROR) << "Fail to get pkgmgr installer"; + return false; + } + std::shared_ptr signal = + std::make_shared(installer); + res_handler::ParamChecker option(argc, argv); if (!option.Validate()) { LOG(ERROR) << "Invalid argument has given"; + signal->SendFail(ErrorType::ERROR_INVALID_PARAMETER); return false; } + signal->SetPkgID(option.GetPkgID()); + signal->SetReqType(option.GetRequestType()); + signal->SetUID(option.GetUID()); + signal->SetSessionID(option.GetSessionID()); - res_handler::EventSignalSender signal; - signal.SetPkgID(option.GetPkgID()); - signal.SetReqType(option.GetRequestType()); - - handler_.reset(new res_handler::RequestHandlerInvoker(option, signal)); + handler_.reset(new RequestHandlerInvoker(option, signal)); if (!handler_->Validate()) { LOG(ERROR) << "Failed to initialize request handler"; return false; diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt index 7591000..ab88138 100644 --- a/tests/unit_tests/CMakeLists.txt +++ b/tests/unit_tests/CMakeLists.txt @@ -5,8 +5,10 @@ INCLUDE(FindPkgConfig) PKG_CHECK_MODULES(pkgmgr-tool_unittests REQUIRED dlog gmock + pkgmgr pkgmgr-parser pkgmgr-info + pkgmgr-installer libtzplatform-config libsmack sqlite3 diff --git a/tests/unit_tests/res-copy/src/test_request_handler_invoker.cc b/tests/unit_tests/res-copy/src/test_request_handler_invoker.cc index ac446a4..be3ac62 100644 --- a/tests/unit_tests/res-copy/src/test_request_handler_invoker.cc +++ b/tests/unit_tests/res-copy/src/test_request_handler_invoker.cc @@ -45,15 +45,16 @@ class Mocks : public ::testing::NiceMock, class RequestHandlerInvokerTest : public TestFixture { public: RequestHandlerInvokerTest() : TestFixture(std::make_unique()) { - signal_sender_.SetPkgID("org.tizen.targepkgid"); - signal_sender_.SetReqType(res_handler::ReqType::REQ_TYPE_UNKNOWN); + signal_sender_ = std::make_shared(nullptr); + signal_sender_->SetPkgID("org.tizen.targepkgid"); + signal_sender_->SetReqType(res_handler::ReqType::REQ_TYPE_UNKNOWN); } virtual ~RequestHandlerInvokerTest() {} virtual void SetUp() {} virtual void TearDown() {} - res_handler::EventSignalSender signal_sender_; + std::shared_ptr signal_sender_; }; TEST_F(RequestHandlerInvokerTest, CopyType) {