Merge branch 'master' of github.sec.samsung.net:appfw/pkgmgr-info into tizen
[platform/core/appfw/pkgmgr-info.git] / src / client / pkginfo_client.cc
index 8763c91..bd94e9c 100644 (file)
@@ -4,22 +4,20 @@
 
 #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 {
 
@@ -41,6 +39,13 @@ bool PkgInfoClient::SendRequest() {
     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;
@@ -105,46 +110,6 @@ PkgInfoClient::GetResultParcel() {
 }
 
 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();
@@ -153,14 +118,28 @@ bool PkgInfoClient::RequestHandlerDirectAccess() {
   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;
 }