}
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);
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';