#include "pkginfo_client.hh"
+#include <dlfcn.h>
+
#include <parcel.hh>
#include <vconf.h>
#include <string>
#include "parcelable_factory.hh"
-#include "get_appinfo_request_handler.hh"
-#include "get_cert_request_handler.hh"
-#include "get_depinfo_request_handler.hh"
-#include "get_pkginfo_request_handler.hh"
-#include "query_request_handler.hh"
-#include "set_cert_request_handler.hh"
-#include "set_pkginfo_request_handler.hh"
#include "pkgmgrinfo_debug.h"
+#include "pkgmgrinfo_private.h"
+#define LIBPKGMGR_INFO "/usr/lib/libpkgmgr-info-server.so.0"
+#define DIRECT_ACCESS_FUNC "_request_handler_direct_access"
namespace pkgmgr_client {
LOGE("Socket is not ready");
return false;
}
+
+ // CREATE_DB request type need to be executed directly by the caller
+ if (req_type_ == pkgmgr_common::ReqType::CREATE_DB) {
+ is_offline_ = true;
+ return RequestHandlerDirectAccess();
+ }
+
if (!socket_->Connect()) {
LOGE("Failed to connect client socket, try to direct access");
is_offline_ = true;
}
bool PkgInfoClient::RequestHandlerDirectAccess() {
- std::unique_ptr<pkgmgr_server::request_handler::AbstractRequestHandler>
- handler;
- switch (req_type_) {
- case pkgmgr_common::ReqType::GET_PKG_INFO:
- handler.reset(
- new pkgmgr_server::request_handler::GetPkginfoRequestHandler());
- break;
- case pkgmgr_common::ReqType::GET_APP_INFO:
- handler.reset(
- new pkgmgr_server::request_handler::GetAppinfoRequestHandler());
- break;
- case pkgmgr_common::ReqType::SET_PKG_INFO:
- handler.reset(
- new pkgmgr_server::request_handler::SetPkginfoRequestHandler());
- break;
- case pkgmgr_common::ReqType::SET_CERT_INFO:
- handler.reset(
- new pkgmgr_server::request_handler::SetCertRequestHandler());
- break;
- case pkgmgr_common::ReqType::GET_CERT_INFO:
- handler.reset(
- new pkgmgr_server::request_handler::GetCertRequestHandler());
- break;
- case pkgmgr_common::ReqType::GET_PKG_DEP_INFO:
- handler.reset(
- new pkgmgr_server::request_handler::GetDepinfoRequestHandler());
- break;
- case pkgmgr_common::ReqType::QUERY:
- handler.reset(new pkgmgr_server::request_handler::QueryRequestHandler());
- break;
- default:
- handler.reset(nullptr);
- break;
- }
-
- if (handler == nullptr) {
- LOGE("Can't reset handler with type[%d]", req_type_);
- return false;
- }
-
tizen_base::Parcel p;
p.WriteParcelable(*parcel_.get());
std::vector<uint8_t> raw = p.GetRaw();
if (locale.get() == nullptr)
return false;
- handler->HandleRequest(&raw[0], raw.size(), locale.get());
- auto result = handler->ExtractResult();
- if (result.size() == 0)
- return true;
+ static void* handle = nullptr;
+ static void* (*dl_func)(int, unsigned char*, int, const char *);
+
+ if (handle == nullptr) {
+ handle = dlopen(LIBPKGMGR_INFO, RTLD_LOCAL | RTLD_LAZY);
+ if (!handle) {
+ LOGE("Failed to open library: %s (%s)", LIBPKGMGR_INFO, dlerror());
+ return false;
+ }
+ dl_func = reinterpret_cast<void* (*)(int, unsigned char*, int, const char *)>(
+ dlsym(handle, DIRECT_ACCESS_FUNC));
+ if (dl_func == nullptr) {
+ LOGE("cannot find %s symbol in (%s)", DIRECT_ACCESS_FUNC, LIBPKGMGR_INFO);
+ dlclose(handle);
+ handle = nullptr;
+ return false;
+ }
+ }
- result_parcel_.reset(pkgmgr_common::parcel::ParcelableFactory::GetInst()
- .CreateParcel(&result[0], result.size())
- .release());
+ result_parcel_.reset(
+ reinterpret_cast<pkgmgr_common::parcel::AbstractParcelable *>(
+ dl_func(req_type_, &raw[0], raw.size(), locale.get())));
return true;
}