Parse metadata of rpk package 36/286636/3
authorSangyoon Jang <jeremy.jang@samsung.com>
Wed, 11 Jan 2023 01:49:45 +0000 (10:49 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Fri, 13 Jan 2023 01:54:08 +0000 (10:54 +0900)
Change-Id: I796961408073e1cafd52a7ee202333fca2ba227f
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
manifest.xsd
src/rpk/step/configuration/step_parse_rpk_manifest.cc
src/rpk_manifest_handlers/package_handler.cc
src/rpk_manifest_handlers/package_handler.h

index 3b95527..dfda206 100644 (file)
@@ -8,6 +8,7 @@
         <xs:element ref="packages:description"/>
         <xs:element ref="packages:label"/>
         <xs:element ref="packages:icon"/>
+        <xs:element ref="packages:metadata"/>
         <xs:element ref="packages:allowed-package"/>
         <xs:element ref="packages:dependencies"/>
       </xs:choice>
       <xs:attribute name="dpi" type="xs:string"/>
     </xs:complexType>
   </xs:element>
+  <xs:element name="metadata">
+    <xs:complexType>
+      <xs:attribute name="key" use="required" type="xs:string"/>
+      <xs:attribute name="value" type="xs:string"/>
+      <xs:anyAttribute processContents="lax"/>
+    </xs:complexType>
+  </xs:element>
   <xs:element name="allowed-package">
     <xs:complexType>
       <xs:choice maxOccurs="unbounded" minOccurs="0">
index 5459dcb..65f6d1e 100644 (file)
@@ -269,6 +269,19 @@ bool StepParseRpkManifest::FillPackageInfo(manifest_x* manifest) {
     manifest->icon = g_list_append(manifest->icon, icon);
   }
 
+  for (auto& meta_data : pkg_info->meta_data()) {
+    metadata_x* md = reinterpret_cast<metadata_x*>(
+        calloc(1, sizeof(metadata_x)));
+    if (!md) {
+      LOG(ERROR) << "Out of memory";
+      return false;
+    }
+    md->key = strdup(meta_data.key().c_str());
+    if (!meta_data.val().empty())
+      md->value = strdup(meta_data.val().c_str());
+    manifest->metadata = g_list_append(manifest->metadata, md);
+  }
+
   return true;
 }
 
index 46d2e3b..c71c1b6 100755 (executable)
@@ -30,6 +30,9 @@ constexpr const char kManifestKey[] = "manifest";
 constexpr const char kLabelKey[] = "label";
 constexpr const char kLabelLangKey[] = "@lang";
 constexpr const char kLabelTextKey[] = "#text";
+constexpr const char kMetaDataKey[] = "metadata";
+constexpr const char kMetaDataKeyKey[] = "@key";
+constexpr const char kMetaDataValueKey[] = "@value";
 const char kIconKey[] = "icon";
 const char kIconLangKey[] = "@lang";
 const char kIconTextKey[] = "#text";
@@ -75,6 +78,15 @@ bool ParsePackageAndStore(
     pkg_info->AddIcon(lang, text);
   }
 
+  for (auto manifest_dict : parser::GetOneOrMany(&manifest_dict, kMetaDataKey,
+      "")) {
+    std::string key;
+    std::string value;
+    manifest_dict->GetString(kMetaDataKeyKey, &key);
+    manifest_dict->GetString(kMetaDataValueKey, &value);
+    pkg_info->AddMetadata(std::move(key), std::move(value));
+  }
+
   return true;
 }
 
index 6e89dc7..47727f8 100755 (executable)
@@ -18,6 +18,24 @@ namespace parse {
 
 using LangTextPair = std::pair<std::string, std::string>;
 
+// MetaData
+class MetaDataInfo : public parser::ManifestData {
+ public:
+  MetaDataInfo(std::string key, std::string val)
+      : key_(std::move(key)), value_(std::move(val)) {}
+
+  const std::string& key() const {
+    return key_;
+  }
+  const std::string& val() const {
+    return value_;
+  }
+
+ private:
+  std::string key_;
+  std::string value_;
+};
+
 class PackageInfo : public parser::ManifestData {
  public:
   /**
@@ -73,6 +91,10 @@ class PackageInfo : public parser::ManifestData {
     icons_.emplace_back(lang, text);
   }
 
+  void AddMetadata(std::string key, std::string value) {
+    meta_data_.emplace_back(key, value);
+  }
+
   /**
    * @brief xmlns
    * @return xmlns string
@@ -116,6 +138,11 @@ class PackageInfo : public parser::ManifestData {
     return icons_;
   }
 
+  // naming consistency with metadata of tpk_manifest_handlers
+  const std::vector<MetaDataInfo>& meta_data() const {
+    return meta_data_;
+  }
+
  private:
   std::string xmlns_;
   std::string package_;
@@ -126,6 +153,7 @@ class PackageInfo : public parser::ManifestData {
 
   std::vector<LangTextPair> labels_;
   std::vector<LangTextPair> icons_;
+  std::vector<MetaDataInfo> meta_data_;
 };
 
 /**