Fix wrong implementation about encoding & decoding bundle raw
[platform/core/base/bundle.git] / src / bundle-internal.cc
index 9c7b2ee..2298412 100644 (file)
@@ -142,27 +142,18 @@ int Bundle::GetType(const std::string& key) {
 }
 
 unsigned char* Bundle::Encode() {
-  std::vector<unsigned char> bytes;
-  for (const auto& key_info : list_) {
-    auto encoded_bytes = key_info->Encode();
-    bytes.insert(bytes.end(), encoded_bytes.begin(), encoded_bytes.end());
+  int size = 0;
+  unsigned char* raw;
+  try {
+    raw = EncodeRaw(&size);
+  } catch (Exception& e) {
+    THROW(e.GetErrorCode());
   }
 
-  char* checksum = static_cast<char*>(
-      g_compute_checksum_for_string(G_CHECKSUM_MD5,
-        reinterpret_cast<gchar*>(&bytes[0]),
-        static_cast<gssize>(bytes.size())));
-  if (checksum == nullptr)
-    THROW(BUNDLE_ERROR_OUT_OF_MEMORY);
-
-  std::unique_ptr<char, decltype(std::free)*> ptr(checksum, std::free);
-  unsigned char* p = reinterpret_cast<unsigned char*>(checksum);
-  bytes.insert(bytes.begin(), p, p + CHECKSUM_LENGTH);
-
+  std::unique_ptr<unsigned char, decltype(std::free)*> raw_ptr(raw, std::free);
   char* encoded_data = reinterpret_cast<char*>(
-      g_base64_encode(
-        reinterpret_cast<guchar*>(&bytes[0]),
-        reinterpret_cast<gsize>(bytes.size())));
+      g_base64_encode(reinterpret_cast<guchar*>(raw),
+        static_cast<gsize>(size)));
   if (encoded_data == nullptr)
     THROW(BUNDLE_ERROR_OUT_OF_MEMORY);
 
@@ -182,11 +173,44 @@ int Bundle::Decode(unsigned char* raw, int size) {
   if (d_len_raw < CHECKSUM_LENGTH)
     return BUNDLE_ERROR_OUT_OF_MEMORY;
 
+  return DecodeRaw(d_str, d_len_raw);
+}
+
+unsigned char* Bundle::EncodeRaw(int* size) {
+  std::vector<unsigned char> bytes;
+  for (const auto& key_info : list_) {
+    auto encoded_bytes = key_info->Encode();
+    bytes.insert(bytes.end(), encoded_bytes.begin(), encoded_bytes.end());
+  }
+
+  char* checksum = static_cast<char*>(
+      g_compute_checksum_for_string(G_CHECKSUM_MD5,
+        reinterpret_cast<gchar*>(&bytes[0]),
+        static_cast<gssize>(bytes.size())));
+  if (checksum == nullptr)
+    THROW(BUNDLE_ERROR_OUT_OF_MEMORY);
+
+  std::unique_ptr<char, decltype(std::free)*> ptr(checksum, std::free);
+  unsigned char* p = reinterpret_cast<unsigned char*>(checksum);
+  bytes.insert(bytes.begin(), p, p + CHECKSUM_LENGTH);
+
+  unsigned char* raw = static_cast<unsigned char*>(malloc(bytes.size()));
+  if (raw == nullptr)
+    THROW(BUNDLE_ERROR_OUT_OF_MEMORY);
+
+  std::copy(bytes.begin(), bytes.end(), raw);
+  *size = static_cast<int>(bytes.size());
+  return raw;
+}
+
+int Bundle::DecodeRaw(unsigned char* raw, int size) {
   char* extract_checksum = new (std::nothrow) char[CHECKSUM_LENGTH + 1];
   if (extract_checksum == nullptr)
     return BUNDLE_ERROR_OUT_OF_MEMORY;
 
   std::unique_ptr<char[]> extract_ptr(extract_checksum);
+  unsigned char* d_str = raw;
+  unsigned int d_len_raw = size;
   strncpy(extract_checksum, reinterpret_cast<char*>(d_str), CHECKSUM_LENGTH);
   extract_checksum[CHECKSUM_LENGTH] = '\0';