Add ParcelableFactory
authorIlho Kim <ilho159.kim@samsung.com>
Wed, 17 Feb 2021 11:24:09 +0000 (20:24 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Thu, 18 Feb 2021 03:16:52 +0000 (12:16 +0900)
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
15 files changed:
src/common/parcel/abstract_parcelable.cc
src/common/parcel/abstract_parcelable.hh
src/common/parcel/appinfo_parcelable.cc
src/common/parcel/appinfo_parcelable.hh
src/common/parcel/certinfo_parcelable.cc
src/common/parcel/certinfo_parcelable.hh
src/common/parcel/filter_parcelable.cc
src/common/parcel/filter_parcelable.hh
src/common/parcel/parcelable_factory.cc
src/common/parcel/parcelable_factory.hh
src/common/parcel/pkginfo_parcelable.cc
src/common/parcel/pkginfo_parcelable.hh
src/common/parcel/query_parcelable.cc
src/common/parcel/query_parcelable.hh
test/unit_tests/test_parcel.cc

index 756e4e9..b7b3f09 100644 (file)
@@ -17,8 +17,6 @@
 
 #include <cstring>
 
-#include <iostream>
-
 namespace pkgmgr_common {
 namespace parcel {
 
@@ -54,6 +52,20 @@ void AbstractParcelable::WriteString(tizen_base::Parcel* parcel, const char* str
   parcel->WriteCString(str);
 }
 
+void AbstractParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+  WriteInt(parcel, type_);
+  WriteInt(parcel, uid_);
+}
+
+void AbstractParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+  int uid, type;
+  ReadInt(parcel, &type);
+  ReadInt(parcel, &uid);
+
+  uid_ = uid;
+  type_ = static_cast<ParcelableType>(type);
+}
+
 uid_t AbstractParcelable::GetUid() { return uid_; }
 
 void AbstractParcelable::SetUid(uid_t uid) { uid_ = uid; }
index 3ae4a70..8e42163 100644 (file)
@@ -17,13 +17,12 @@ namespace parcel {
 
 enum ParcelableType {
   Unknown = -1,
-  AppCtrlPrivInfo,
   AppInfo,
   CertInfo,
-  DataCtrlInfo,
   Filter,
   PkgInfo,
   Query,
+  Result,
 };
 
 class EXPORT_API AbstractParcelable : public tizen_base::Parcelable {
@@ -41,6 +40,9 @@ class EXPORT_API AbstractParcelable : public tizen_base::Parcelable {
   void SetUid(uid_t uid);
   ParcelableType GetType();
 
+  void WriteToParcel(tizen_base::Parcel* parcel) const override;
+  void ReadFromParcel(tizen_base::Parcel* parcel) override;
+
  protected:
   bool ReadString(tizen_base::Parcel* parcel, char **val);
   bool ReadInt(tizen_base::Parcel* parcel, int *val);
index eb169ed..da23712 100644 (file)
@@ -377,6 +377,9 @@ void AppInfoParcelable::ReadSplashscreens(tizen_base::Parcel* parcel, GList** li
   }
 }
 
+AppInfoParcelable::AppInfoParcelable()
+    : AbstractParcelable(0, ParcelableType::AppInfo) {}
+
 AppInfoParcelable::AppInfoParcelable(std::vector<application_x *>&& app_list)
     : app_list_(std::move(app_list)) {}
 
@@ -529,6 +532,7 @@ bool AppInfoParcelable::WriteApplication(tizen_base::Parcel* parcel, application
 }
 
 void AppInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+  AbstractParcelable::WriteToParcel(parcel);
   WriteInt(parcel, app_list_.size());
 
   for (const auto app : app_list_) {
@@ -537,7 +541,9 @@ void AppInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
 }
 
 void AppInfoParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+  AbstractParcelable::ReadFromParcel(parcel);
   int len = 0;
+
   ReadInt(parcel, &len);
 
   for (int i = 0; i < len ; ++i) {
index 4346154..43bcead 100644 (file)
@@ -21,7 +21,7 @@ class EXPORT_API AppInfoParcelable : public AbstractParcelable {
     std::unique_ptr<AbstractParcelable> CreateParcel();
   };
 
-  AppInfoParcelable() = default;
+  AppInfoParcelable();
   AppInfoParcelable(std::vector<application_x *>&& app_list);
   ~AppInfoParcelable();
   const std::vector<application_x *>& GetAppInfo();
index 776f664..3d7e3d0 100644 (file)
@@ -23,6 +23,9 @@
 namespace pkgmgr_common {
 namespace parcel {
 
+CertInfoParcelable::CertInfoParcelable()
+    : AbstractParcelable(0, ParcelableType::CertInfo), cert_info_(nullptr) {}
+
 CertInfoParcelable::CertInfoParcelable(uid_t uid, pkgmgr_certinfo_x *cert_info)
     : AbstractParcelable(uid, ParcelableType::CertInfo),
         cert_info_(cert_info) {}
@@ -36,14 +39,21 @@ const pkgmgr_certinfo_x *CertInfoParcelable::GetCertInfo() {
 }
 
 void CertInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+  AbstractParcelable::WriteToParcel(parcel);
   WriteCertInfo(parcel, cert_info_);
 }
 
 void CertInfoParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+  AbstractParcelable::ReadFromParcel(parcel);
   ReadCertInfo(parcel);
 }
 
 bool CertInfoParcelable::WriteCertInfo(tizen_base::Parcel* parcel, pkgmgr_certinfo_x *cert_info) const {
+  if (cert_info == nullptr) {
+    parcel->WriteBool(true);
+    return true;
+  }
+  parcel->WriteBool(false);
   WriteInt(parcel, cert_info->for_all_users);
   WriteString(parcel, cert_info->pkgid);
   WriteString(parcel, cert_info->cert_value);
@@ -56,6 +66,13 @@ bool CertInfoParcelable::WriteCertInfo(tizen_base::Parcel* parcel, pkgmgr_certin
 }
 
 void CertInfoParcelable::ReadCertInfo(tizen_base::Parcel* parcel) {
+  bool is_null = false;
+  if (parcel->ReadBool(&is_null) != TIZEN_ERROR_NONE)
+    return;
+
+  if (is_null)
+    return;
+
   cert_info_ = reinterpret_cast<pkgmgr_certinfo_x *>(calloc(1, sizeof(pkgmgr_certinfo_x)));
   ReadInt(parcel, &cert_info_->for_all_users);
   ReadString(parcel, &cert_info_->pkgid);
index b456099..674e3f5 100644 (file)
@@ -21,7 +21,7 @@ class EXPORT_API CertInfoParcelable : public AbstractParcelable {
     std::unique_ptr<AbstractParcelable> CreateParcel();
   };
 
-  CertInfoParcelable() : cert_info_(nullptr) {}
+  CertInfoParcelable();
   CertInfoParcelable(uid_t uid, pkgmgr_certinfo_x *cert_info);
   ~CertInfoParcelable();
   const pkgmgr_certinfo_x *GetCertInfo();
index c2965c8..e745f67 100644 (file)
 namespace pkgmgr_common {
 namespace parcel {
 
+FilterParcelable::FilterParcelable() :
+    AbstractParcelable(0, ParcelableType::Filter),
+        uid_(0), filter_(nullptr), flag_(0) {}
+
 FilterParcelable::FilterParcelable(uid_t uid, pkgmgrinfo_filter_x *filter,
     int flag) : AbstractParcelable(uid, ParcelableType::Filter),
         filter_(filter), flag_(flag) {}
@@ -42,17 +46,24 @@ int FilterParcelable::GetFlag() {
 }
 
 void FilterParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+  AbstractParcelable::WriteToParcel(parcel);
   WriteInt(parcel, flag_);
   WriteFilter(parcel, filter_);
 }
 
 void FilterParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+  AbstractParcelable::ReadFromParcel(parcel);
   ReadInt(parcel, &flag_);
   ReadFilter(parcel);
 }
 
 bool FilterParcelable::WriteFilter(
     tizen_base::Parcel* parcel, pkgmgrinfo_filter_x *filter) const {
+  if (filter == nullptr) {
+    parcel->WriteBool(true);
+    return true;
+  }
+  parcel->WriteBool(false);
   WriteInt(parcel, filter->uid);
 
   WriteInt(parcel, g_slist_length(filter->list));
@@ -68,7 +79,14 @@ bool FilterParcelable::WriteFilter(
 }
 
 void FilterParcelable::ReadFilter(tizen_base::Parcel* parcel) {
+  bool is_null = false;
   int val = 0;
+  if (parcel->ReadBool(&is_null) != TIZEN_ERROR_NONE)
+    return;
+
+  if (is_null)
+    return;
+
   filter_ = reinterpret_cast<pkgmgrinfo_filter_x *>(
       calloc(1, sizeof(pkgmgrinfo_filter_x)));
   ReadInt(parcel, &val);
index 277153d..8c25b47 100644 (file)
@@ -21,7 +21,7 @@ class EXPORT_API FilterParcelable : public AbstractParcelable {
     std::unique_ptr<AbstractParcelable> CreateParcel();
   };
 
-  FilterParcelable() : uid_(0), filter_(nullptr), flag_(0) {}
+  FilterParcelable();
   FilterParcelable(uid_t uid, pkgmgrinfo_filter_x *filter, int flag);
   ~FilterParcelable();
   const pkgmgrinfo_filter_x* GetFilter();
index 0916f68..0ee7ab6 100644 (file)
@@ -15,7 +15,8 @@
  */
 
 #include "parcelable_factory.hh"
-#include "pkgmgrinfo_debug.h"
+
+#include <parcel.hh>
 
 #include "abstract_parcelable.hh"
 #include "appinfo_parcelable.hh"
@@ -24,6 +25,8 @@
 #include "pkginfo_parcelable.hh"
 #include "query_parcelable.hh"
 
+#include <iostream>
+
 namespace pkgmgr_common {
 namespace parcel {
 
@@ -35,9 +38,47 @@ ParcelableFactory& ParcelableFactory::GetInst() {
   return instance;
 }
 
-std::unique_ptr<AbstractParcelable> ParcelableFactory::CreateParcel(unsigned char* data,
-    int size) {
-  return nullptr;
+std::unique_ptr<AbstractParcelable> ParcelableFactory::CreateParcel(
+    const unsigned char* data, int size) {
+  int tmp;
+  std::unique_ptr<AbstractParcelable> res = nullptr;
+  tizen_base::Parcel parcel(data, size);
+
+  parcel.ReadInt32(&tmp);
+  if (tmp != 1)
+    return nullptr;
+  parcel.ReadInt32(&tmp);
+  parcel.ResetReader();
+  ParcelableType type = static_cast<ParcelableType>(tmp);
+
+  switch (type) {
+    case ParcelableType::AppInfo:
+      res = std::make_unique<AppInfoParcelable>();
+      parcel.ReadParcelable(res.get());
+      break;
+    case ParcelableType::CertInfo:
+      std::cout << "make certinfo parcelable" << std::endl;
+      res = std::make_unique<CertInfoParcelable>();
+      parcel.ReadParcelable(res.get());
+      break;
+    case ParcelableType::Filter:
+      res = std::make_unique<FilterParcelable>();
+      parcel.ReadParcelable(res.get());
+      break;
+    case ParcelableType::PkgInfo:
+      res = std::make_unique<PkgInfoParcelable>();
+      parcel.ReadParcelable(res.get());
+      break;
+    case ParcelableType::Query:
+      res = std::make_unique<QueryParcelable>();
+      parcel.ReadParcelable(res.get());
+      break;
+    case ParcelableType::Unknown:
+      break;
+    default:
+      break;
+  }
+  return res;
 }
 
 }  // namespace parcel
index 8194be6..129af7d 100644 (file)
@@ -31,7 +31,7 @@ namespace parcel {
 class EXPORT_API ParcelableFactory {
  public:
   static ParcelableFactory& GetInst();
-  std::unique_ptr<AbstractParcelable> CreateParcel(unsigned char* data, int size);
+  std::unique_ptr<AbstractParcelable> CreateParcel(const unsigned char* data, int size);
 
  private:
   ParcelableFactory();
index 464c1a4..e674bcf 100644 (file)
@@ -434,6 +434,9 @@ package_x *PkgInfoParcelable::ReadPackage(tizen_base::Parcel* parcel) {
   return package;
 }
 
+PkgInfoParcelable::PkgInfoParcelable()
+    : AbstractParcelable(0, ParcelableType::PkgInfo) {}
+
 PkgInfoParcelable::PkgInfoParcelable(std::vector<package_x *>&& pkg_list)
     : pkg_list_(std::move(pkg_list)) {}
 
@@ -448,6 +451,7 @@ const std::vector<package_x *>& PkgInfoParcelable::GetPkgInfo() {
 }
 
 void PkgInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+  AbstractParcelable::WriteToParcel(parcel);
   WriteInt(parcel, pkg_list_.size());
 
   for (auto pkg : pkg_list_) {
@@ -457,6 +461,8 @@ void PkgInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
 
 void PkgInfoParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
   int len = 0;
+
+  AbstractParcelable::ReadFromParcel(parcel);
   ReadInt(parcel, &len);
 
   for (int i = 0; i < len ; ++i) {
index a30a31f..db2afc5 100644 (file)
@@ -21,7 +21,7 @@ class EXPORT_API PkgInfoParcelable : public AbstractParcelable {
     std::unique_ptr<AbstractParcelable> CreateParcel();
   };
 
-  PkgInfoParcelable() = default;
+  PkgInfoParcelable();
   PkgInfoParcelable(std::vector<package_x *>&& pkg_list);
   ~PkgInfoParcelable();
   const std::vector<package_x *>& GetPkgInfo();
index 8e0fdc1..65a599c 100644 (file)
 namespace pkgmgr_common {
 namespace parcel {
 
+QueryParcelable::QueryParcelable()
+    : AbstractParcelable(0, ParcelableType::Query) {}
+
 QueryParcelable::QueryParcelable(uid_t uid, std::string query)
     : AbstractParcelable(uid, ParcelableType::Query), query_(query) {}
 
 void QueryParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+  AbstractParcelable::WriteToParcel(parcel);
   WriteString(parcel, query_.c_str());
 }
 
 void QueryParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
   char *query = nullptr;
+
+  AbstractParcelable::ReadFromParcel(parcel);
   ReadString(parcel, &query);
   query_ = query;
   free(query);
index 8f6be24..afeca63 100644 (file)
@@ -21,7 +21,7 @@ class EXPORT_API QueryParcelable : public AbstractParcelable {
     std::unique_ptr<AbstractParcelable> CreateParcel();
   };
 
-  QueryParcelable() = default;
+  QueryParcelable();
   QueryParcelable(uid_t uid, std::string query);
   const std::string& GetQuery();
 
index 62b918f..ba8f58e 100644 (file)
@@ -24,6 +24,7 @@
 #include "common/parcel/appinfo_parcelable.hh"
 #include "common/parcel/certinfo_parcelable.hh"
 #include "common/parcel/filter_parcelable.hh"
+#include "common/parcel/parcelable_factory.hh"
 #include "common/parcel/pkginfo_parcelable.hh"
 #include "common/parcel/query_parcelable.hh"
 
@@ -180,3 +181,43 @@ TEST_F(ParcelTest, QueryParcelable) {
 
   EXPECT_EQ(origin_parcelable.GetQuery(), new_parcelable.GetQuery());
 }
+
+TEST_F(ParcelTest, ParcelableFactory) {
+  tizen_base::Parcel parcel;
+  std::unique_ptr<pp::AbstractParcelable> ptr;
+  pp::AppInfoParcelable appinfo_parcelable;
+  pp::CertInfoParcelable certinfo_parcelable;
+  pp::FilterParcelable filter_parcelable;
+  pp::PkgInfoParcelable pkginfo_parcelable;
+  pp::QueryParcelable query_parcelable;
+
+  parcel.WriteParcelable(appinfo_parcelable);
+  ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+  EXPECT_NE(ptr, nullptr);
+  EXPECT_EQ(ptr->GetType(), pp::ParcelableType::AppInfo);
+  parcel.Clear();
+
+  parcel.WriteParcelable(certinfo_parcelable);
+  ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+  EXPECT_NE(ptr, nullptr);
+  EXPECT_EQ(ptr->GetType(), pp::ParcelableType::CertInfo);
+  parcel.Clear();
+
+  parcel.WriteParcelable(filter_parcelable);
+  ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+  EXPECT_NE(ptr, nullptr);
+  EXPECT_EQ(ptr->GetType(), pp::ParcelableType::Filter);
+  parcel.Clear();
+
+  parcel.WriteParcelable(pkginfo_parcelable);
+  ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+  EXPECT_NE(ptr, nullptr);
+  EXPECT_EQ(ptr->GetType(), pp::ParcelableType::PkgInfo);
+  parcel.Clear();
+
+  parcel.WriteParcelable(query_parcelable);
+  ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+  EXPECT_NE(ptr, nullptr);
+  EXPECT_EQ(ptr->GetType(), pp::ParcelableType::Query);
+  parcel.Clear();
+}