From 868bee86d01abfe6a0558c4a80e53baec7a882de Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 9 Apr 2013 14:46:54 +0100 Subject: [PATCH] Support for storing binary vars in XML via NamedValueSet/ValueTree. --- .../containers/juce_NamedValueSet.cpp | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/modules/juce_core/containers/juce_NamedValueSet.cpp b/modules/juce_core/containers/juce_NamedValueSet.cpp index 91567f607a..1ee00b57cb 100644 --- a/modules/juce_core/containers/juce_NamedValueSet.cpp +++ b/modules/juce_core/containers/juce_NamedValueSet.cpp @@ -27,8 +27,8 @@ NamedValueSet::NamedValue::NamedValue() noexcept { } -inline NamedValueSet::NamedValue::NamedValue (const Identifier& name_, const var& value_) - : name (name_), value (value_) +inline NamedValueSet::NamedValue::NamedValue (const Identifier& n, const var& v) + : name (n), value (v) { } @@ -52,8 +52,8 @@ NamedValueSet::NamedValue::NamedValue (NamedValue&& other) noexcept { } -inline NamedValueSet::NamedValue::NamedValue (const Identifier& name_, var&& value_) - : name (name_), value (static_cast (value_)) +inline NamedValueSet::NamedValue::NamedValue (const Identifier& n, var&& v) + : name (n), value (static_cast (v)) { } @@ -264,16 +264,43 @@ void NamedValueSet::setFromXmlAttributes (const XmlElement& xml) const int numAtts = xml.getNumAttributes(); // xxx inefficient - should write an att iterator.. for (int i = 0; i < numAtts; ++i) - appender.append (new NamedValue (xml.getAttributeName (i), var (xml.getAttributeValue (i)))); + { + const String& name = xml.getAttributeName (i); + const String& value = xml.getAttributeValue (i); + + if (name.startsWith ("base64:")) + { + MemoryBlock mb; + + if (mb.fromBase64Encoding (value)) + { + appender.append (new NamedValue (name.substring (7), var (mb))); + continue; + } + } + + appender.append (new NamedValue (name, var (value))); + } } void NamedValueSet::copyToXmlAttributes (XmlElement& xml) const { for (NamedValue* i = values; i != nullptr; i = i->nextListItem) { - jassert (! i->value.isObject()); // DynamicObjects can't be stored as XML! + if (const MemoryBlock* mb = i->value.getBinaryData()) + { + xml.setAttribute ("base64:" + i->name.toString(), + mb->toBase64Encoding()); + } + else + { + // These types can't be stored as XML! + jassert (! i->value.isObject()); + jassert (! i->value.isMethod()); + jassert (! i->value.isArray()); - xml.setAttribute (i->name.toString(), - i->value.toString()); + xml.setAttribute (i->name.toString(), + i->value.toString()); + } } }