Browse Source

Added a binary data type to the var class.

tags/2021-05-28
jules 12 years ago
parent
commit
dde56bab6a
3 changed files with 79 additions and 20 deletions
  1. +63
    -12
      modules/juce_core/containers/juce_Variant.cpp
  2. +7
    -0
      modules/juce_core/containers/juce_Variant.h
  3. +9
    -8
      modules/juce_core/json/juce_JSON.cpp

+ 63
- 12
modules/juce_core/containers/juce_Variant.cpp View File

@@ -31,7 +31,8 @@ enum VariantStreamMarkers
varMarker_Double = 4, varMarker_Double = 4,
varMarker_String = 5, varMarker_String = 5,
varMarker_Int64 = 6, varMarker_Int64 = 6,
varMarker_Array = 7
varMarker_Array = 7,
varMarker_Binary = 8
}; };
//============================================================================== //==============================================================================
@@ -47,7 +48,8 @@ public:
virtual String toString (const ValueUnion&) const { return String::empty; } virtual String toString (const ValueUnion&) const { return String::empty; }
virtual bool toBool (const ValueUnion&) const noexcept { return false; } virtual bool toBool (const ValueUnion&) const noexcept { return false; }
virtual ReferenceCountedObject* toObject (const ValueUnion&) const noexcept { return nullptr; } virtual ReferenceCountedObject* toObject (const ValueUnion&) const noexcept { return nullptr; }
virtual Array<var>* toArray (const ValueUnion&) const noexcept { return 0; }
virtual Array<var>* toArray (const ValueUnion&) const noexcept { return nullptr; }
virtual MemoryBlock* toBinary (const ValueUnion&) const noexcept { return nullptr; }
virtual bool isVoid() const noexcept { return false; } virtual bool isVoid() const noexcept { return false; }
virtual bool isInt() const noexcept { return false; } virtual bool isInt() const noexcept { return false; }
@@ -57,6 +59,7 @@ public:
virtual bool isString() const noexcept { return false; } virtual bool isString() const noexcept { return false; }
virtual bool isObject() const noexcept { return false; } virtual bool isObject() const noexcept { return false; }
virtual bool isArray() const noexcept { return false; } virtual bool isArray() const noexcept { return false; }
virtual bool isBinary() const noexcept { return false; }
virtual bool isMethod() const noexcept { return false; } virtual bool isMethod() const noexcept { return false; }
virtual void cleanUp (ValueUnion&) const noexcept {} virtual void cleanUp (ValueUnion&) const noexcept {}
@@ -292,6 +295,35 @@ public:
} }
}; };
//==============================================================================
class var::VariantType_Binary : public var::VariantType
{
public:
VariantType_Binary() noexcept {}
static const VariantType_Binary instance;
void cleanUp (ValueUnion& data) const noexcept { delete data.binaryValue; }
void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest.binaryValue = new MemoryBlock (*source.binaryValue); }
String toString (const ValueUnion& data) const { return data.binaryValue->toBase64Encoding(); }
bool isBinary() const noexcept { return true; }
MemoryBlock* toBinary (const ValueUnion& data) const noexcept { return data.binaryValue; }
bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept
{
const MemoryBlock* const otherBlock = otherType.toBinary (otherData);
return otherBlock != nullptr && *otherBlock == *data.binaryValue;
}
void writeToStream (const ValueUnion& data, OutputStream& output) const
{
output.writeCompressedInt (1 + data.binaryValue->getSize());
output.writeByte (varMarker_Binary);
output << *data.binaryValue;
}
};
//============================================================================== //==============================================================================
class var::VariantType_Method : public var::VariantType class var::VariantType_Method : public var::VariantType
{ {
@@ -300,7 +332,7 @@ public:
static const VariantType_Method instance; static const VariantType_Method instance;
String toString (const ValueUnion&) const { return "Method"; } String toString (const ValueUnion&) const { return "Method"; }
bool toBool (const ValueUnion& data) const noexcept { return data.methodValue != 0; }
bool toBool (const ValueUnion& data) const noexcept { return data.methodValue != nullptr; }
bool isMethod() const noexcept { return true; } bool isMethod() const noexcept { return true; }
bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept
@@ -324,6 +356,7 @@ const var::VariantType_Double var::VariantType_Double::instance;
const var::VariantType_String var::VariantType_String::instance; const var::VariantType_String var::VariantType_String::instance;
const var::VariantType_Object var::VariantType_Object::instance; const var::VariantType_Object var::VariantType_Object::instance;
const var::VariantType_Array var::VariantType_Array::instance; const var::VariantType_Array var::VariantType_Array::instance;
const var::VariantType_Binary var::VariantType_Binary::instance;
const var::VariantType_Method var::VariantType_Method::instance; const var::VariantType_Method var::VariantType_Method::instance;
@@ -354,6 +387,8 @@ var::var (const Array<var>& v) : type (&VariantType_Array::instance) { v
var::var (const String& v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } var::var (const String& v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); }
var::var (const char* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } var::var (const char* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); }
var::var (const wchar_t* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } var::var (const wchar_t* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); }
var::var (const void* v, size_t sz) : type (&VariantType_Binary::instance) { value.binaryValue = new MemoryBlock (v, sz); }
var::var (const MemoryBlock& v) : type (&VariantType_Binary::instance) { value.binaryValue = new MemoryBlock (v); }
var::var (ReferenceCountedObject* const object) : type (&VariantType_Object::instance) var::var (ReferenceCountedObject* const object) : type (&VariantType_Object::instance)
{ {
@@ -363,16 +398,18 @@ var::var (ReferenceCountedObject* const object) : type (&VariantType_Object::in
object->incReferenceCount(); object->incReferenceCount();
} }
//============================================================================== //==============================================================================
bool var::isVoid() const noexcept { return type->isVoid(); }
bool var::isInt() const noexcept { return type->isInt(); }
bool var::isInt64() const noexcept { return type->isInt64(); }
bool var::isBool() const noexcept { return type->isBool(); }
bool var::isDouble() const noexcept { return type->isDouble(); }
bool var::isString() const noexcept { return type->isString(); }
bool var::isObject() const noexcept { return type->isObject(); }
bool var::isArray() const noexcept { return type->isArray(); }
bool var::isMethod() const noexcept { return type->isMethod(); }
bool var::isVoid() const noexcept { return type->isVoid(); }
bool var::isInt() const noexcept { return type->isInt(); }
bool var::isInt64() const noexcept { return type->isInt64(); }
bool var::isBool() const noexcept { return type->isBool(); }
bool var::isDouble() const noexcept { return type->isDouble(); }
bool var::isString() const noexcept { return type->isString(); }
bool var::isObject() const noexcept { return type->isObject(); }
bool var::isArray() const noexcept { return type->isArray(); }
bool var::isBinaryData() const noexcept { return type->isBinary(); }
bool var::isMethod() const noexcept { return type->isMethod(); }
var::operator int() const noexcept { return type->toInt (value); } var::operator int() const noexcept { return type->toInt (value); }
var::operator int64() const noexcept { return type->toInt64 (value); } var::operator int64() const noexcept { return type->toInt64 (value); }
@@ -383,6 +420,7 @@ String var::toString() const { return type->toString
var::operator String() const { return type->toString (value); } var::operator String() const { return type->toString (value); }
ReferenceCountedObject* var::getObject() const noexcept { return type->toObject (value); } ReferenceCountedObject* var::getObject() const noexcept { return type->toObject (value); }
Array<var>* var::getArray() const noexcept { return type->toArray (value); } Array<var>* var::getArray() const noexcept { return type->toArray (value); }
MemoryBlock* var::getBinaryData() const noexcept { return type->toBinary (value); }
DynamicObject* var::getDynamicObject() const noexcept { return dynamic_cast <DynamicObject*> (getObject()); } DynamicObject* var::getDynamicObject() const noexcept { return dynamic_cast <DynamicObject*> (getObject()); }
//============================================================================== //==============================================================================
@@ -423,6 +461,11 @@ var::var (String&& v) : type (&VariantType_String::instance)
new (value.stringValue) String (static_cast<String&&> (v)); new (value.stringValue) String (static_cast<String&&> (v));
} }
var::var (MemoryBlock&& v) : type (&VariantType_Binary::instance)
{
value.binaryValue = new MemoryBlock (static_cast<MemoryBlock&&> (v));
}
var& var::operator= (String&& v) var& var::operator= (String&& v)
{ {
type->cleanUp (value); type->cleanUp (value);
@@ -630,6 +673,14 @@ var var::readFromStream (InputStream& input)
return var (mo.toUTF8()); return var (mo.toUTF8());
} }
case varMarker_Binary:
{
MemoryBlock mb (numBytes - 1);
const int numRead = input.read (mb.getData(), numBytes - 1);
mb.setSize (numRead);
return var (mb);
}
case varMarker_Array: case varMarker_Array:
{ {
var v; var v;


+ 7
- 0
modules/juce_core/containers/juce_Variant.h View File

@@ -77,6 +77,8 @@ public:
var (const Array<var>& value); var (const Array<var>& value);
var (ReferenceCountedObject* object); var (ReferenceCountedObject* object);
var (MethodFunction method) noexcept; var (MethodFunction method) noexcept;
var (const void* binaryData, size_t dataSize);
var (const MemoryBlock& binaryData);
var& operator= (const var& valueToCopy); var& operator= (const var& valueToCopy);
var& operator= (int value); var& operator= (int value);
@@ -93,6 +95,7 @@ public:
#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
var (var&& other) noexcept; var (var&& other) noexcept;
var (String&& value); var (String&& value);
var (MemoryBlock&& binaryData);
var& operator= (var&& other) noexcept; var& operator= (var&& other) noexcept;
var& operator= (String&& value); var& operator= (String&& value);
#endif #endif
@@ -107,6 +110,7 @@ public:
operator String() const; operator String() const;
String toString() const; String toString() const;
Array<var>* getArray() const noexcept; Array<var>* getArray() const noexcept;
MemoryBlock* getBinaryData() const noexcept;
ReferenceCountedObject* getObject() const noexcept; ReferenceCountedObject* getObject() const noexcept;
DynamicObject* getDynamicObject() const noexcept; DynamicObject* getDynamicObject() const noexcept;
@@ -118,6 +122,7 @@ public:
bool isString() const noexcept; bool isString() const noexcept;
bool isObject() const noexcept; bool isObject() const noexcept;
bool isArray() const noexcept; bool isArray() const noexcept;
bool isBinaryData() const noexcept;
bool isMethod() const noexcept; bool isMethod() const noexcept;
/** Returns true if this var has the same value as the one supplied. /** Returns true if this var has the same value as the one supplied.
@@ -245,6 +250,7 @@ private:
class VariantType_String; friend class VariantType_String; class VariantType_String; friend class VariantType_String;
class VariantType_Object; friend class VariantType_Object; class VariantType_Object; friend class VariantType_Object;
class VariantType_Array; friend class VariantType_Array; class VariantType_Array; friend class VariantType_Array;
class VariantType_Binary; friend class VariantType_Binary;
class VariantType_Method; friend class VariantType_Method; class VariantType_Method; friend class VariantType_Method;
union ValueUnion union ValueUnion
@@ -256,6 +262,7 @@ private:
char stringValue [sizeof (String)]; char stringValue [sizeof (String)];
ReferenceCountedObject* objectValue; ReferenceCountedObject* objectValue;
Array<var>* arrayValue; Array<var>* arrayValue;
MemoryBlock* binaryValue;
MethodFunction methodValue; MethodFunction methodValue;
}; };


+ 9
- 8
modules/juce_core/json/juce_JSON.cpp View File

@@ -194,7 +194,8 @@ private:
if (nextChar == ',') if (nextChar == ',')
continue; continue;
else if (nextChar == '}')
if (nextChar == '}')
break; break;
} }
} }
@@ -237,7 +238,8 @@ private:
if (nextChar == ',') if (nextChar == ',')
continue; continue;
else if (nextChar == ']')
if (nextChar == ']')
break; break;
return createFail ("Expected object array item, but found", &oldT); return createFail ("Expected object array item, but found", &oldT);
@@ -248,8 +250,7 @@ private:
static Result parseString (String::CharPointerType& t, var& result) static Result parseString (String::CharPointerType& t, var& result)
{ {
Array<juce_wchar> buffer;
buffer.ensureStorageAllocated (256);
MemoryOutputStream buffer (256);
for (;;) for (;;)
{ {
@@ -295,11 +296,10 @@ private:
if (c == 0) if (c == 0)
return createFail ("Unexpected end-of-input in string constant"); return createFail ("Unexpected end-of-input in string constant");
buffer.add (c);
buffer.appendUTF8Char (c);
} }
buffer.add (0);
result = String (CharPointer_UTF32 (buffer.getRawDataPointer()));
result = buffer.toString();
return Result::ok(); return Result::ok();
} }
}; };
@@ -336,7 +336,8 @@ public:
} }
else else
{ {
jassert (! v.isMethod()); // Can't convert an object with methods to JSON!
// Can't convert these other types of object to JSON!
jassert (! (v.isMethod() || v.isBinaryData()));
out << v.toString(); out << v.toString();
} }


Loading…
Cancel
Save