1 // Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
2 // Use of this source code is governed by an apache-2.0 license that can be
3 // found in the LICENSE file.
5 #include "pkginfo_client.hh"
7 #include "parcelable_factory.hh"
8 #include "get_appinfo_request_handler.hh"
9 #include "get_cert_request_handler.hh"
10 #include "get_pkginfo_request_handler.hh"
11 #include "query_request_handler.hh"
12 #include "set_cert_request_handler.hh"
13 #include "set_pkginfo_request_handler.hh"
19 #include "pkgmgrinfo_debug.h"
23 namespace pkgmgr_client {
25 static const char SOCK_PATH[] = "/run/pkgmgr-info-server";
27 PkgInfoClient::PkgInfoClient(
28 std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> parcel, uid_t uid,
29 pkgmgr_common::ReqType req_type)
30 : parcel_(parcel), result_parcel_(nullptr), uid_(uid), req_type_(req_type), is_offline_(false) {
31 socket_ = std::make_unique<pkgmgr_common::socket::ClientSocket>(SOCK_PATH);
34 bool PkgInfoClient::SendRequest() {
35 if (socket_ == nullptr)
38 if (!socket_->Connect()) {
39 LOGE("Failed to connect client socket, try to direct access");
41 return RequestHandlerDirectAccess();
44 if (socket_->SendData(&req_type_, sizeof(req_type_)) != 0) {
45 LOGE("fail to send data");
50 p.WriteParcelable(*parcel_.get());
51 const auto& raw = p.GetRaw();
54 if (socket_->SendData(&len, sizeof(len)) != 0) {
55 LOGE("fail to send data");
59 if (socket_->SendData(&raw[0], len) != 0) {
60 LOGE("Fail to send data");
67 std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable>
68 PkgInfoClient::GetResultParcel() {
70 return result_parcel_;
72 if (socket_ == nullptr)
76 if (socket_->ReceiveData(&len, sizeof(len)) != 0) {
77 LOGE("Fail to receive data");
81 unsigned char* raw = new (std::nothrow) unsigned char[len];
83 LOGE("Out of memory");
87 if (socket_->ReceiveData(raw, len) != 0) {
88 LOGE("Fail to receive data");
93 auto res = pkgmgr_common::parcel::ParcelableFactory::GetInst()
94 .CreateParcel(raw, len);
100 bool PkgInfoClient::RequestHandlerDirectAccess() {
101 std::unique_ptr<pkgmgr_server::request_handler::AbstractRequestHandler> handler;
103 case pkgmgr_common::ReqType::GET_PKG_INFO:
104 handler.reset(new pkgmgr_server::request_handler::GetPkginfoRequestHandler());
106 case pkgmgr_common::ReqType::GET_APP_INFO:
107 handler.reset(new pkgmgr_server::request_handler::GetAppinfoRequestHandler());
109 case pkgmgr_common::ReqType::SET_PKG_INFO:
110 handler.reset(new pkgmgr_server::request_handler::SetPkginfoRequestHandler());
112 case pkgmgr_common::ReqType::SET_CERT_INFO:
113 handler.reset(new pkgmgr_server::request_handler::SetCertRequestHandler());
115 case pkgmgr_common::ReqType::GET_CERT_INFO:
116 handler.reset(new pkgmgr_server::request_handler::GetCertRequestHandler());
118 case pkgmgr_common::ReqType::QUERY:
119 handler.reset(new pkgmgr_server::request_handler::QueryRequestHandler());
122 handler.reset(nullptr);
126 if (handler == nullptr) {
127 LOGE("Can't reset handler with type[%d]", req_type_);
131 tizen_base::Parcel p;
132 p.WriteParcelable(*parcel_.get());
133 std::vector<uint8_t> raw = p.GetRaw();
134 int len = raw.size();
136 handler->HandleRequest(&raw[0], raw.size(), vconf_get_str(VCONFKEY_LANGSET));
137 auto result = handler->GetResult();
138 if (result.size() == 0)
141 result_parcel_.reset(pkgmgr_common::parcel::ParcelableFactory::GetInst().CreateParcel(&result[0], result.size()).release());
146 } // namespace pkgmgr_client