Add metadata to pkginfo
[platform/core/appfw/pkgmgr-info.git] / src / common / parcel / filter_parcelable.cc
index f314eea..9804eb8 100644 (file)
 namespace pkgmgr_common {
 namespace parcel {
 
-FilterParcelable::FilterParcelable() :
-    AbstractParcelable(0, ParcelableType::Filter), filter_(nullptr), flag_(0) {}
+FilterParcelable::FilterParcelable()
+    : AbstractParcelable(0, ParcelableType::Filter),
+      filter_(nullptr),
+      flag_(0), auto_release_(true) {}
 
-FilterParcelable::FilterParcelable(uid_t uid, pkgmgrinfo_filter_x *filter,
-    int flag) : AbstractParcelable(uid, ParcelableType::Filter),
-        filter_(filter), flag_(flag) {}
+FilterParcelable::FilterParcelable(uid_t uid, pkgmgrinfo_filter_x* filter,
+                                   int flag, bool auto_release)
+    : AbstractParcelable(uid, ParcelableType::Filter),
+      filter_(filter),
+      flag_(flag), auto_release_(auto_release) {}
 
 FilterParcelable::~FilterParcelable() {
-  pkgmgrinfo_pkginfo_filter_destroy(filter_);
+  if (!auto_release_)
+    return;
+
+  if (filter_ != nullptr)
+    pkgmgrinfo_pkginfo_filter_destroy(filter_);
 }
 
-const pkgmgrinfo_filter_x *FilterParcelable::GetFilter() {
+const pkgmgrinfo_filter_xFilterParcelable::GetFilter() {
   return filter_;
 }
 
@@ -56,8 +64,8 @@ void FilterParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
   ReadFilter(parcel);
 }
 
-bool FilterParcelable::WriteFilter(
-    tizen_base::Parcel* parcel, pkgmgrinfo_filter_x *filter) const {
+bool FilterParcelable::WriteFilter(tizen_base::Parcel* parcel,
+                                   pkgmgrinfo_filter_x* filter) const {
   if (filter == nullptr) {
     parcel->WriteBool(true);
     return true;
@@ -66,13 +74,19 @@ bool FilterParcelable::WriteFilter(
   WriteInt(parcel, filter->uid);
 
   WriteInt(parcel, g_slist_length(filter->list));
-  for (GSList *list = filter->list; list; list = list->next)
-    WritePkgmgrInfoNode(parcel, reinterpret_cast<pkgmgrinfo_node_x *>(list->data));
+  for (GSList* list = filter->list; list; list = list->next)
+    WritePkgmgrInfoNode(parcel,
+                        reinterpret_cast<pkgmgrinfo_node_x*>(list->data));
 
   WriteInt(parcel, g_slist_length(filter->list_metadata));
-  for (GSList *list = filter->list_metadata; list; list = list->next)
-    WritePkgmgrInfoMetadataNode(parcel,
-        reinterpret_cast<pkgmgrinfo_metadata_node_x *>(list->data));
+  for (GSList* list = filter->list_metadata; list; list = list->next)
+    WritePkgmgrInfoMetadataNode(
+        parcel, reinterpret_cast<pkgmgrinfo_metadata_node_x*>(list->data));
+
+  WriteInt(parcel, g_slist_length(filter->list_pkg_metadata));
+  for (GSList* list = filter->list_pkg_metadata; list; list = list->next)
+    WritePkgmgrInfoMetadataNode(
+        parcel, reinterpret_cast<pkgmgrinfo_metadata_node_x*>(list->data));
 
   return true;
 }
@@ -80,14 +94,13 @@ 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)
+  if (parcel->ReadBool(&is_null) != TIZEN_ERROR_NONE || is_null)
     return;
 
-  filter_ = reinterpret_cast<pkgmgrinfo_filter_x *>(
+  filter_ = reinterpret_cast<pkgmgrinfo_filter_x*>(
       calloc(1, sizeof(pkgmgrinfo_filter_x)));
+
   ReadInt(parcel, &val);
   filter_->uid = val;
 
@@ -97,10 +110,17 @@ void FilterParcelable::ReadFilter(tizen_base::Parcel* parcel) {
 
   ReadInt(parcel, &val);
   for (int i = 0; i < val; ++i)
-    filter_->list_metadata = g_slist_append(filter_->list_metadata, ReadPkgmgrInfoMetadataNode(parcel));
+    filter_->list_metadata = g_slist_append(filter_->list_metadata,
+                                            ReadPkgmgrInfoMetadataNode(parcel));
+
+  ReadInt(parcel, &val);
+  for (int i = 0; i < val; ++i)
+    filter_->list_pkg_metadata = g_slist_append(filter_->list_pkg_metadata,
+                                            ReadPkgmgrInfoMetadataNode(parcel));
 }
 
-bool FilterParcelable::WritePkgmgrInfoNode(tizen_base::Parcel* parcel, pkgmgrinfo_node_x *node) const {
+bool FilterParcelable::WritePkgmgrInfoNode(tizen_base::Parcel* parcel,
+                                           pkgmgrinfo_node_x* node) const {
   WriteInt(parcel, node->prop);
   WriteString(parcel, node->key);
   WriteString(parcel, node->value);
@@ -108,8 +128,10 @@ bool FilterParcelable::WritePkgmgrInfoNode(tizen_base::Parcel* parcel, pkgmgrinf
   return true;
 }
 
-pkgmgrinfo_node_x *FilterParcelable::ReadPkgmgrInfoNode(tizen_base::Parcel *parcel) {
-  pkgmgrinfo_node_x *node = reinterpret_cast<pkgmgrinfo_node_x *>(calloc(1, sizeof(pkgmgrinfo_node_x)));
+pkgmgrinfo_node_x* FilterParcelable::ReadPkgmgrInfoNode(
+    tizen_base::Parcel* parcel) {
+  pkgmgrinfo_node_x* node = reinterpret_cast<pkgmgrinfo_node_x*>(
+      calloc(1, sizeof(pkgmgrinfo_node_x)));
   ReadInt(parcel, &node->prop);
   ReadString(parcel, &node->key);
   ReadString(parcel, &node->value);
@@ -117,24 +139,24 @@ pkgmgrinfo_node_x *FilterParcelable::ReadPkgmgrInfoNode(tizen_base::Parcel *parc
   return node;
 }
 
-bool FilterParcelable::WritePkgmgrInfoMetadataNode(tizen_base::Parcel* parcel, pkgmgrinfo_metadata_node_x *node) const {
+bool FilterParcelable::WritePkgmgrInfoMetadataNode(
+    tizen_base::Parcel* parcel, pkgmgrinfo_metadata_node_x* node) const {
   WriteString(parcel, node->key);
   WriteString(parcel, node->value);
 
   return true;
 }
 
-pkgmgrinfo_metadata_node_x *FilterParcelable::ReadPkgmgrInfoMetadataNode(tizen_base::Parcel* parcel) {
-  pkgmgrinfo_metadata_node_x *node = reinterpret_cast<pkgmgrinfo_metadata_node_x *>(calloc(1, sizeof(pkgmgrinfo_metadata_node_x)));
+pkgmgrinfo_metadata_node_x* FilterParcelable::ReadPkgmgrInfoMetadataNode(
+    tizen_base::Parcel* parcel) {
+  pkgmgrinfo_metadata_node_x* node =
+      reinterpret_cast<pkgmgrinfo_metadata_node_x*>(
+          calloc(1, sizeof(pkgmgrinfo_metadata_node_x)));
   ReadString(parcel, &node->key);
   ReadString(parcel, &node->value);
 
   return node;
 }
 
-std::unique_ptr<AbstractParcelable> FilterParcelable::Factory::CreateParcel() {
-  return nullptr;
-}
-
 }  // namespace parcel
 }  // namespace pkgmgr_common