Implement request handler
authorjusung <jusung07.son@samsung.com>
Fri, 19 Feb 2021 04:29:34 +0000 (13:29 +0900)
committerjusung <jusung07.son@samsung.com>
Fri, 19 Feb 2021 04:29:34 +0000 (13:29 +0900)
Signed-off-by: jusung <jusung07.son@samsung.com>
20 files changed:
src/appinfo_internal.c
src/common/database/abstract_db_handler.hh
src/common/database/appinfo_db_handler.cc
src/common/database/appinfo_db_handler.hh
src/common/database/pkg_get_db_handler.cc
src/common/database/pkg_get_db_handler.hh
src/server/abstract_request_handler.hh
src/server/get_appinfo_request_handler.cc
src/server/get_appinfo_request_handler.hh
src/server/get_cert_request_handler.cc
src/server/get_cert_request_handler.hh
src/server/get_pkginfo_request_handler.cc
src/server/get_pkginfo_request_handler.hh
src/server/query_request_handler.cc
src/server/query_request_handler.hh
src/server/set_cert_request_handler.cc
src/server/set_cert_request_handler.hh
src/server/set_pkginfo_request_handler.cc
src/server/set_pkginfo_request_handler.hh
src/server/worker_thread.cc

index 1d14f41..d9cd221 100644 (file)
 #include "pkgmgrinfo_internal.h"
 
 
-static void __free_applications(gpointer data)
+static int __free_applications(gpointer key,
+               gpointer value, gpointer user_data)
 {
-       pkgmgrinfo_basic_free_application((application_x *)data);
+       pkgmgrinfo_basic_free_application((application_x *)value);
 }
 
 static void __parse_appcontrol(GList **appcontrol, char *appcontrol_str,
@@ -681,8 +682,7 @@ API int appinfo_internal_filter_get_list(
                        return PMINFO_R_EINVAL;
        }
 
-       list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
-                       __free_applications);
+       list = g_hash_table_new(g_str_hash, g_str_equal);
        if (list == NULL)
                return PMINFO_R_ERROR;
 
@@ -693,6 +693,7 @@ API int appinfo_internal_filter_get_list(
                                PMINFO_APPINFO_GET_ALL, list);
 
        if (ret != PMINFO_R_OK) {
+               g_hash_table_foreach_remove(list, __free_applications, NULL);
                g_hash_table_destroy(list);
                return ret;
        }
index 5063dd8..dab9c3f 100644 (file)
@@ -46,6 +46,7 @@ class EXPORT_API AbstractDBHandler {
   AbstractDBHandler(uid_t uid);
   virtual ~AbstractDBHandler();
   virtual bool Execute() = 0;
+  void SetLocale(const std::string& locale);
 
  protected:
   bool Connect();
@@ -53,7 +54,6 @@ class EXPORT_API AbstractDBHandler {
   std::string GetLocale();
   void SetOpType(OperationType type);
   void SetDBType(DBType type);
-  void SetLocale(const std::string& locale);
 
  private:
   std::string GetDBPath();
index d7db0d0..5103b6b 100644 (file)
 
 #include "pkgmgrinfo_internal.h"
 
-#include <list>
-
 namespace {
 
 void _move(gpointer key, gpointer value, gpointer user_data) {
   application_x* appinfo = static_cast<application_x*>(value);
-  std::list<application_x*>* app_list = static_cast<std::list<application_x*>*>(user_data);
+  std::vector<application_x*>* app_list = static_cast<std::vector<application_x*>*>(user_data);
   app_list->emplace_back(appinfo);
 }
 
@@ -38,8 +36,8 @@ AppInfoDBHandler::AppInfoDBHandler(uid_t uid)
 
 AppInfoDBHandler::~AppInfoDBHandler() {}
 
-std::list<application_x*> AppInfoDBHandler::GetAppHandle() {
-  return handle_list_;
+std::vector<application_x*> AppInfoDBHandler::GetAppHandle() {
+  return std::move(handle_list_);
 }
 
 void AppInfoDBHandler::SetFilter(pkgmgrinfo_filter_x* filter) {
@@ -61,6 +59,7 @@ bool AppInfoDBHandler::Execute() {
   }
 
   g_hash_table_foreach(list, _move, &handle_list_);
+  g_hash_table_destroy(list);
   return true;
 }
 
index 871e9ec..7b4cab1 100644 (file)
@@ -17,7 +17,7 @@
 #ifndef APPINFO_DB_HANDLER_HH_
 #define APPINFO_DB_HANDLER_HH_
 
-#include <list>
+#include <vector>
 
 #include <sys/types.h>
 
@@ -36,13 +36,13 @@ class EXPORT_API AppInfoDBHandler : public AbstractDBHandler{
  public:
   AppInfoDBHandler(uid_t uid);
   ~AppInfoDBHandler();
-  std::list<application_x*> GetAppHandle();
+  std::vector<application_x*> GetAppHandle();
   void SetFilter(pkgmgrinfo_filter_x* filter);
   bool Execute() override;
 
  private:
   pkgmgrinfo_filter_x* filter_ = nullptr;
-  std::list<application_x*> handle_list_;
+  std::vector<application_x*> handle_list_;
   uid_t uid_;
 };
 
index 688b1df..f01ef31 100644 (file)
@@ -22,7 +22,7 @@ namespace {
 
 void _move(gpointer key, gpointer value, gpointer user_data) {
   package_x* appinfo = static_cast<package_x*>(value);
-  std::list<package_x*>* app_list = static_cast<std::list<package_x*>*>(user_data);
+  std::vector<package_x*>* app_list = static_cast<std::vector<package_x*>*>(user_data);
   app_list->emplace_back(appinfo);
 }
 
@@ -36,7 +36,9 @@ PkgGetDBHandler::PkgGetDBHandler(uid_t uid)
 
 PkgGetDBHandler::~PkgGetDBHandler() {}
 
-std::list<package_x*> PkgGetDBHandler::GetPkgHandle() { return handle_list_; }
+std::vector<package_x*> PkgGetDBHandler::GetPkgHandle() {
+  return std::move(handle_list_);
+}
 
 void PkgGetDBHandler::SetFilter(pkgmgrinfo_filter_x* filter) {
   filter_ = filter;
@@ -58,6 +60,8 @@ bool PkgGetDBHandler::Execute() {
   }
 
   g_hash_table_foreach(list, _move, &handle_list_);
+  g_hash_table_destroy(list);
+
   return true;
 }
 
index 1a85e5b..275e880 100644 (file)
@@ -17,7 +17,7 @@
 #ifndef PKG_GET_DB_HANDLER_HH_
 #define PKG_GET_DB_HANDLER_HH_
 
-#include <list>
+#include <vector>
 
 #include <sys/types.h>
 
@@ -36,13 +36,13 @@ class EXPORT_API PkgGetDBHandler : public AbstractDBHandler{
  public:
   PkgGetDBHandler(uid_t uid);
   ~PkgGetDBHandler();
-  std::list<package_x*> GetPkgHandle();
+  std::vector<package_x*> GetPkgHandle();
   void SetFilter(pkgmgrinfo_filter_x* filter);
   bool Execute() override;
 
  private:
   pkgmgrinfo_filter_x* filter_ = nullptr;
-  std::list<package_x*> handle_list_;
+  std::vector<package_x*> handle_list_;
   uid_t uid_;
 };
 
index ec86054..49f0c98 100644 (file)
@@ -6,6 +6,7 @@
 #define SERVER_ABSTRACT_REQUEST_HANDLER_HH_
 
 #include <string>
+#include <parcel.hh>
 
 namespace pkgmgr_server {
 namespace request_handler {
@@ -17,9 +18,9 @@ namespace request_handler {
 class EXPORT_API AbstractRequestHandler {
  public:
   virtual ~AbstractRequestHandler() = default;
-  virtual bool HandleRequest(std::string data, std::string locale) = 0;
+  virtual bool HandleRequest(unsigned char* data, int size, std::string locale) = 0;
 
-  virtual std::string GetResult() = 0;
+  virtual std::vector<uint8_t> GetResult() = 0;
 };
 
 }  // namespace request_handler
index a2f43e7..fb42da8 100644 (file)
@@ -2,22 +2,45 @@
 // Use of this source code is governed by an apache-2.0 license that can be
 // found in the LICENSE file.
 
+#include "../common/parcel/parcelable_factory.hh"
+#include "../common/parcel/filter_parcelable.hh"
+#include "../common/database/appinfo_db_handler.hh"
 #include "get_appinfo_request_handler.hh"
 
 #include <string>
 
+using namespace pkgmgr_common::parcel;
+using namespace pkgmgr_common::database;
+
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool GetAppinfoRequestHandler::HandleRequest(std::string data,
-                                             std::string locale) {
+bool GetAppinfoRequestHandler::HandleRequest(unsigned char* data, int size, std::string locale) {
+  auto abstract_parcel = ParcelableFactory::GetInst().CreateParcel(data, size);
+
+  if (abstract_parcel->GetType() != ParcelableType::Filter)
+    return false;
+
+  auto* parcel = dynamic_cast<FilterParcelable*>(abstract_parcel.get());
+
+  AppInfoDBHandler db(parcel->GetUid());
+  db.SetLocale(locale);
+  db.SetFilter(const_cast<pkgmgrinfo_filter_x*>(parcel->GetFilter()));
+  if (db.Execute() == false)
+    return false;
+
+  result_ = std::make_shared<AppInfoParcelable>(db.GetAppHandle());
+
   return true;
 }
 
-std::string GetAppinfoRequestHandler::GetResult() {
-  std::string tmp_result("tmp_result");
+std::vector<uint8_t> GetAppinfoRequestHandler::GetResult() {
+  tizen_base::Parcel parcel;
+
+  result_->WriteToParcel(&parcel);
+  std::vector<uint8_t> raw = parcel.GetRaw();
 
-  return tmp_result;
+  return raw;
 }
 
 }  // namespace request_handler
index 8a32317..d84d508 100644 (file)
@@ -6,6 +6,7 @@
 #define SERVER_GET_APPINFO_REQUEST_HANDLER_HH_
 
 #include "abstract_request_handler.hh"
+#include "../common/parcel/appinfo_parcelable.hh"
 
 #include <string>
 
@@ -18,9 +19,12 @@ namespace request_handler {
 
 class EXPORT_API GetAppinfoRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(std::string data, std::string locale) override;
+  bool HandleRequest(unsigned char* data, int size, std::string locale) override;
 
-  std::string GetResult() override;
+  std::vector<uint8_t> GetResult() override;
+
+ private:
+  std::shared_ptr<pkgmgr_common::parcel::AppInfoParcelable> result_;
 };
 
 }  // namespace request_handler
index a54f8e1..61c886e 100644 (file)
@@ -3,21 +3,45 @@
 // found in the LICENSE file.
 
 #include "get_cert_request_handler.hh"
+#include "../common/parcel/parcelable_factory.hh"
+#include "../common/database/cert_get_db_handler.hh"
 
 #include <string>
 
+using namespace pkgmgr_common::parcel;
+using namespace pkgmgr_common::database;
+
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool GetCertRequestHandler::HandleRequest(std::string data,
-                                          std::string locale) {
+bool GetCertRequestHandler::HandleRequest(unsigned char* data, int size, std::string locale) {
+  auto abstract_parcel = ParcelableFactory::GetInst().CreateParcel(data, size);
+
+  if (abstract_parcel->GetType() != ParcelableType::CertInfo)
+    return false;
+
+  auto* parcel = dynamic_cast<CertInfoParcelable*>(abstract_parcel.get());
+
+  CertGetDBHandler db(parcel->GetUid());
+  db.SetLocale(locale);
+
+// TODO:       db.SetPkgID();
+
+  if (db.Execute() == false)
+    return false;
+
+  result_ = std::make_shared<CertInfoParcelable>(parcel->GetUid(), db.GetCertHandle());
+
   return true;
 }
 
-std::string GetCertRequestHandler::GetResult() {
-  std::string tmp_result("tmp_result");
+std::vector<uint8_t> GetCertRequestHandler::GetResult() {
+  tizen_base::Parcel parcel;
+
+  result_->WriteToParcel(&parcel);
+  std::vector<uint8_t> raw = parcel.GetRaw();
 
-  return tmp_result;
+  return raw;
 }
 
 }  // namespace request_handler
index 9f51fa1..96d3e47 100644 (file)
@@ -6,6 +6,7 @@
 #define SERVER_GET_CERT_REQUEST_HANDLER_HH_
 
 #include "abstract_request_handler.hh"
+#include "../common/parcel/certinfo_parcelable.hh"
 
 #include <string>
 
@@ -18,9 +19,12 @@ namespace request_handler {
 
 class EXPORT_API GetCertRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(std::string data, std::string locale) override;
+  bool HandleRequest(unsigned char* data, int size, std::string locale) override;
 
-  std::string GetResult() override;
+  std::vector<uint8_t> GetResult() override;
+
+ private:
+  std::shared_ptr<pkgmgr_common::parcel::CertInfoParcelable> result_;
 };
 
 }  // namespace request_handler
index 2b20139..c639874 100644 (file)
@@ -2,22 +2,45 @@
 // Use of this source code is governed by an apache-2.0 license that can be
 // found in the LICENSE file.
 
+#include "../common/parcel/parcelable_factory.hh"
+#include "../common/parcel/filter_parcelable.hh"
+#include "../common/database/pkg_get_db_handler.hh"
 #include "get_pkginfo_request_handler.hh"
 
 #include <string>
 
+using namespace pkgmgr_common::parcel;
+using namespace pkgmgr_common::database;
+
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool GetPkginfoRequestHandler::HandleRequest(std::string data,
-                                             std::string locale) {
+bool GetPkginfoRequestHandler::HandleRequest(unsigned char* data, int size, std::string locale) {
+  auto abstract_parcel = ParcelableFactory::GetInst().CreateParcel(data, size);
+
+  if (abstract_parcel->GetType() != ParcelableType::Filter)
+    return false;
+
+  auto* parcel = dynamic_cast<FilterParcelable*>(abstract_parcel.get());
+
+  PkgGetDBHandler db(parcel->GetUid());
+  db.SetLocale(locale);
+  db.SetFilter(const_cast<pkgmgrinfo_filter_x*>(parcel->GetFilter()));
+  if (db.Execute() == false)
+    return false;
+
+  result_ = std::make_shared<PkgInfoParcelable>(db.GetPkgHandle());
+
   return true;
 }
 
-std::string GetPkginfoRequestHandler::GetResult() {
-  std::string tmp_result("tmp_result");
+std::vector<uint8_t> GetPkginfoRequestHandler::GetResult() {
+  tizen_base::Parcel parcel;
+
+  result_->WriteToParcel(&parcel);
+  std::vector<uint8_t> raw = parcel.GetRaw();
 
-  return tmp_result;
+  return raw;
 }
 
 }  // namespace request_handler
index e30d1c9..d77ac0a 100644 (file)
@@ -6,6 +6,7 @@
 #define SERVER_GET_PKGINFO_REQUEST_HANDLER_HH_
 
 #include "abstract_request_handler.hh"
+#include "../common/parcel/pkginfo_parcelable.hh"
 
 #include <string>
 
@@ -18,9 +19,13 @@ namespace request_handler {
 
 class EXPORT_API GetPkginfoRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(std::string data, std::string locale) override;
+  bool HandleRequest(unsigned char* data, int size, std::string locale) override;
+
+  std::vector<uint8_t> GetResult() override;
+
+ private:
+  std::shared_ptr<pkgmgr_common::parcel::PkgInfoParcelable> result_;
 
-  std::string GetResult() override;
 };
 
 }  // namespace request_handler
index afd00e1..b34030e 100644 (file)
@@ -3,20 +3,44 @@
 // found in the LICENSE file.
 
 #include "query_request_handler.hh"
+#include "../common/parcel/parcelable_factory.hh"
+#include "../common/parcel/query_parcelable.hh"
+#include "../common/database/query_handler.hh"
 
 #include <string>
 
+using namespace pkgmgr_common::parcel;
+using namespace pkgmgr_common::database;
+
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool QueryRequestHandler::HandleRequest(std::string data, std::string locale) {
+bool QueryRequestHandler::HandleRequest(unsigned char* data, int size, std::string locale) {
+  auto abstract_parcel = ParcelableFactory::GetInst().CreateParcel(data, size);
+
+  if (abstract_parcel->GetType() != ParcelableType::Query)
+    return false;
+
+  auto* parcel = dynamic_cast<QueryParcelable*>(abstract_parcel.get());
+
+  QueryHandler db(parcel->GetUid());
+  db.SetLocale(locale);
+  db.SetQuery(parcel->GetQuery());
+  if (db.Execute() == false)
+    return false;
+
+  // TODO:  result_ = std::make_shared<ResultParcelable>(db.GetString());
+
   return true;
 }
 
-std::string QueryRequestHandler::GetResult() {
-  std::string tmp_result("tmp_result");
+std::vector<uint8_t> QueryRequestHandler::GetResult() {
+  tizen_base::Parcel parcel;
+
+  result_->WriteToParcel(&parcel);
+  std::vector<uint8_t> raw = parcel.GetRaw();
 
-  return tmp_result;
+  return raw;
 }
 
 }  // namespace request_handler
index 49bfeb7..c7b9679 100644 (file)
@@ -6,6 +6,8 @@
 #define SERVER_QUERY_REQUEST_HANDLER_HH_
 
 #include "abstract_request_handler.hh"
+#include "../common/parcel/result_parcelable.hh"
+
 
 #include <string>
 
@@ -18,9 +20,13 @@ namespace request_handler {
 
 class EXPORT_API QueryRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(std::string data, std::string locale) override;
+  bool HandleRequest(unsigned char* data, int size, std::string locale) override;
+
+  std::vector<uint8_t> GetResult() override;
+
+private:
+ std::shared_ptr<pkgmgr_common::parcel::ResultParcelable> result_;
 
-  std::string GetResult() override;
 };
 
 }  // namespace request_handler
index 6405d67..c13d85a 100644 (file)
@@ -3,21 +3,38 @@
 // found in the LICENSE file.
 
 #include "set_cert_request_handler.hh"
+#include "../common/parcel/parcelable_factory.hh"
+#include "../common/parcel/certinfo_parcelable.hh"
+#include "../common/database/cert_set_db_handler.hh"
 
 #include <string>
 
+using namespace pkgmgr_common::parcel;
+using namespace pkgmgr_common::database;
+
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool SetCertRequestHandler::HandleRequest(std::string data,
-                                          std::string locale) {
+bool SetCertRequestHandler::HandleRequest(unsigned char* data, int size, std::string locale) {
+  auto abstract_parcel = ParcelableFactory::GetInst().CreateParcel(data, size);
+
+  if (abstract_parcel->GetType() != ParcelableType::CertInfo)
+    return false;
+
+  auto* parcel = dynamic_cast<CertInfoParcelable*>(abstract_parcel.get());
+
+  CertSetDBHandler db(parcel->GetUid());
+  db.SetLocale(locale);
+  db.SetCertHandle(const_cast<pkgmgr_certinfo_x*>(parcel->GetCertInfo()));
+
+  if (db.Execute() == false)
+    return false;
+
   return true;
 }
 
-std::string SetCertRequestHandler::GetResult() {
-  std::string tmp_result("tmp_result");
-
-  return tmp_result;
+std::vector<uint8_t> SetCertRequestHandler::GetResult() {
+  return std::vector<uint8_t>('0');
 }
 
 }  // namespace request_handler
index dffe770..7229e61 100644 (file)
@@ -18,9 +18,9 @@ namespace request_handler {
 
 class EXPORT_API SetCertRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(std::string data, std::string locale) override;
+  bool HandleRequest(unsigned char* data, int size, std::string locale) override;
 
-  std::string GetResult() override;
+  std::vector<uint8_t> GetResult() override;
 };
 
 }  // namespace request_handler
index c713d86..305919b 100644 (file)
@@ -3,21 +3,39 @@
 // found in the LICENSE file.
 
 #include "set_pkginfo_request_handler.hh"
+#include "../common/parcel/parcelable_factory.hh"
+#include "../common/parcel/pkginfo_parcelable.hh"
+#include "../common/database/pkg_set_db_handler.hh"
 
 #include <string>
 
+using namespace pkgmgr_common::parcel;
+using namespace pkgmgr_common::database;
+
 namespace pkgmgr_server {
 namespace request_handler {
 
-bool SetPkginfoRequestHandler::HandleRequest(std::string data,
-                                             std::string locale) {
+bool SetPkginfoRequestHandler::HandleRequest(unsigned char* data, int size, std::string locale) {
+  auto abstract_parcel = ParcelableFactory::GetInst().CreateParcel(data, size);
+
+  if (abstract_parcel->GetType() != ParcelableType::PkgInfo)
+    return false;
+
+  auto* parcel = dynamic_cast<PkgInfoParcelable*>(abstract_parcel.get());
+
+  PkgSetDBHandler db(parcel->GetUid());
+  db.SetLocale(locale);
+
+  for (auto& i : parcel->GetPkgInfo()) {
+    db.SetPkgInfo(i);
+    if (db.Execute() == false)
+      return false;
+  }
   return true;
 }
 
-std::string SetPkginfoRequestHandler::GetResult() {
-  std::string tmp_result("tmp_result");
-
-  return tmp_result;
+std::vector<uint8_t> SetPkginfoRequestHandler::GetResult() {
+  return std::vector<uint8_t>('0');
 }
 
 }  // namespace request_handler
index 190b5b7..43b436a 100644 (file)
@@ -18,9 +18,9 @@ namespace request_handler {
 
 class EXPORT_API SetPkginfoRequestHandler : public AbstractRequestHandler {
  public:
-  bool HandleRequest(std::string data, std::string locale) override;
+  bool HandleRequest(unsigned char* data, int size, std::string locale) override;
 
-  std::string GetResult() override;
+  std::vector<uint8_t> GetResult() override;
 };
 
 }  // namespace request_handler
index a7aae62..6166aa9 100644 (file)
@@ -87,17 +87,13 @@ void WorkerThread::Run() {
     pkgmgr_common::ReqType type = req->GetRequestType();
     LOGD("Request type(%d)", static_cast<int>(type));
 
-    auto request_data_str =
-        std::string(reinterpret_cast<char*>(req->GetData()));
-    if (!handler[type]->HandleRequest(request_data_str, locale_.GetString())) {
+    if (!handler[type]->HandleRequest(req->GetData(), req->GetSize(), locale_.GetString())) {
       LOGE("Failed to handle request");
       continue;
     }
 
-    std::string result_data_str = handler[type]->GetResult();
-    req->SendData(reinterpret_cast<unsigned char*>(
-                      const_cast<char*>(result_data_str.c_str())),
-                  result_data_str.size());
+    std::vector<uint8_t> result_data = handler[type]->GetResult();
+    req->SendData(result_data.data(), result_data.size());
   }
 }