summaryrefslogtreecommitdiffstats
path: root/o3d/utils/cross/dataurl.cc
diff options
context:
space:
mode:
authormstrydom@google.com <mstrydom@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-02 22:21:31 +0000
committermstrydom@google.com <mstrydom@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-02 22:21:31 +0000
commit8607f6dae7f80f494d55cb6701234ca7be18738b (patch)
tree2121ef79ee8402d5ada98b5c634c76c30263af1a /o3d/utils/cross/dataurl.cc
parent74d7f63a55085f2d7badff916b08ebe459184b9b (diff)
downloadchromium_src-8607f6dae7f80f494d55cb6701234ca7be18738b.zip
chromium_src-8607f6dae7f80f494d55cb6701234ca7be18738b.tar.gz
chromium_src-8607f6dae7f80f494d55cb6701234ca7be18738b.tar.bz2
This CL adds the createRawDataFromDataURL function to o3d.Pack. The function
takes as input a data URL, decodes the data, and returns the raw data in a RawData object. If the data URL has an invalid format, an error message is displayed. Currently only data URL's encoded in base64 are supported. The mime type is ignored. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25252 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/utils/cross/dataurl.cc')
-rw-r--r--o3d/utils/cross/dataurl.cc60
1 files changed, 60 insertions, 0 deletions
diff --git a/o3d/utils/cross/dataurl.cc b/o3d/utils/cross/dataurl.cc
index 8334b8d..f796719 100644
--- a/o3d/utils/cross/dataurl.cc
+++ b/o3d/utils/cross/dataurl.cc
@@ -48,6 +48,66 @@ String ToDataURL(const String& mime_type, const void* data, size_t length) {
return result;
}
+// Decodes the data URL and stores a pointer to the data in dst_buffer
+bool FromDataURL(const String& data_url,
+ scoped_array<uint8>* dst_buffer,
+ size_t* output_length,
+ String* error_string) {
+ // First parse the data_url
+ const String kDataHeader("data:");
+ const String kBase64Header(";base64,");
+ // The string has to be long enough.
+ if (data_url.size() <= kDataHeader.size() + kBase64Header.size()) {
+ *error_string = "Invalid formatting: The data URL is not long enough.";
+ return false;
+ }
+ // it must start with "data:"
+ if (data_url.compare(0, kDataHeader.size(), kDataHeader) != 0) {
+ *error_string
+ = "Invalid formatting: The data URL must start with 'data:'";
+ return false;
+ }
+ // we only support base64 data URL's
+ String::size_type data_index = data_url.find(kBase64Header);
+ if (data_index == String::npos) {
+ *error_string
+ = "Invalid formatting: The data URL have ';base64,' in the header.";
+ return false;
+ }
+ // The start of the data.
+ data_index += kBase64Header.size();
+ if (data_index >= data_url.size()) {
+ *error_string
+ = "Invalid formatting: There must be data in the body of the data URL.";
+ return false;
+ }
+
+ // Get the length of the decoded data
+ size_t input_length = data_url.size() - data_index;
+ base64::DecodeStatus return_code = base64::GetDecodeLength(
+ &data_url[data_index],
+ input_length,
+ output_length);
+ if (return_code != base64::kSuccess) {
+ if (return_code == base64::kPadError) {
+ *error_string
+ = "Invalid formatting: Padding error in the data URL data.";
+ } else {
+ *error_string
+ = "Invalid formatting: Bad character error in the data URL data.";
+ }
+ return false;
+ }
+
+ dst_buffer->reset(new uint8[*output_length]);
+ base64::Decode(&data_url[data_index],
+ input_length,
+ dst_buffer->get(),
+ (*output_length));
+
+ return true;
+}
+
} // namespace dataurl
} // namespace o3d