2014-09-27 14:43:19 +02:00
|
|
|
#pragma once
|
|
|
|
|
2014-09-27 15:34:34 +02:00
|
|
|
class JsonBuffer;
|
|
|
|
|
2014-09-27 14:43:19 +02:00
|
|
|
enum JsonNodeType
|
|
|
|
{
|
|
|
|
JSON_UNDEFINED,
|
|
|
|
JSON_NULL,
|
|
|
|
JSON_ARRAY,
|
|
|
|
JSON_OBJECT,
|
2014-10-09 12:14:10 +02:00
|
|
|
JSON_KEY_VALUE,
|
2014-09-27 15:04:06 +02:00
|
|
|
JSON_BOOLEAN,
|
2014-09-27 14:43:19 +02:00
|
|
|
JSON_STRING,
|
2014-10-09 12:14:10 +02:00
|
|
|
JSON_LONG,
|
2014-09-27 14:43:19 +02:00
|
|
|
JSON_DOUBLE_0_DECIMALS,
|
|
|
|
JSON_DOUBLE_1_DECIMAL,
|
|
|
|
JSON_DOUBLE_2_DECIMALS,
|
|
|
|
// etc.
|
|
|
|
};
|
|
|
|
|
2014-10-05 16:25:49 +02:00
|
|
|
class JsonWriter;
|
|
|
|
|
2014-09-27 14:43:19 +02:00
|
|
|
struct JsonNode
|
|
|
|
{
|
2014-10-09 14:17:09 +02:00
|
|
|
JsonNode()
|
|
|
|
: type(JSON_UNDEFINED), next(0)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
2014-10-09 12:14:10 +02:00
|
|
|
|
2014-10-09 14:17:09 +02:00
|
|
|
JsonNode* next;
|
2014-10-09 12:14:10 +02:00
|
|
|
void writeTo(JsonWriter&); // TODO: <- move in JsonNodeSerializer
|
|
|
|
|
|
|
|
void setAsArray(JsonBuffer* buffer)
|
|
|
|
{
|
|
|
|
type = JSON_ARRAY;
|
|
|
|
content.asContainer.child = 0;
|
|
|
|
content.asContainer.buffer = buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setAsBoolean(bool value)
|
|
|
|
{
|
|
|
|
type = JSON_BOOLEAN;
|
|
|
|
content.asBoolean = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setAsLong(int value)
|
|
|
|
{
|
|
|
|
type = JSON_LONG;
|
|
|
|
content.asInteger = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setAsString(char const* value)
|
|
|
|
{
|
|
|
|
type = JSON_STRING;
|
|
|
|
content.asString = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setAsDouble(double value, int decimals)
|
|
|
|
{
|
|
|
|
type = (JsonNodeType) (JSON_DOUBLE_0_DECIMALS + decimals);
|
|
|
|
content.asDouble = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setAsObject(JsonBuffer* buffer)
|
|
|
|
{
|
|
|
|
type = JSON_OBJECT;
|
|
|
|
content.asContainer.child = 0;
|
|
|
|
content.asContainer.buffer = buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
void setAsObjectKeyValue(const char* key, JsonNode* value)
|
|
|
|
{
|
|
|
|
type = JSON_KEY_VALUE;
|
|
|
|
content.asKey.key = key;
|
|
|
|
content.asKey.value = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool getAsBoolean()
|
|
|
|
{
|
|
|
|
return type == JSON_BOOLEAN ? content.asBoolean : false;
|
|
|
|
}
|
|
|
|
|
|
|
|
double getAsDouble()
|
|
|
|
{
|
|
|
|
return type > JSON_DOUBLE_0_DECIMALS ? content.asDouble : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
long getAsInteger()
|
|
|
|
{
|
|
|
|
return type == JSON_LONG ? content.asInteger : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* getAsString()
|
|
|
|
{
|
|
|
|
return type == JSON_STRING ? content.asString : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
JsonBuffer* getContainerBuffer()
|
|
|
|
{
|
|
|
|
return type == JSON_ARRAY || type == JSON_OBJECT ? content.asContainer.buffer : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
JsonNode* getContainerChild()
|
|
|
|
{
|
|
|
|
return type == JSON_ARRAY || type == JSON_OBJECT ? content.asContainer.child : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* getAsObjectKey()
|
|
|
|
{
|
|
|
|
return type == JSON_KEY_VALUE ? content.asKey.key : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
JsonNode* getAsObjectValue()
|
|
|
|
{
|
|
|
|
return type == JSON_KEY_VALUE ? content.asKey.value : 0;
|
|
|
|
}
|
|
|
|
|
2014-10-09 14:17:09 +02:00
|
|
|
void addChildToContainer(JsonNode* childToAdd);
|
2014-10-09 12:14:10 +02:00
|
|
|
|
2014-10-09 14:17:09 +02:00
|
|
|
void removeChildFromContainer(JsonNode* childToRemove);
|
2014-10-09 12:14:10 +02:00
|
|
|
|
|
|
|
private:
|
2014-10-09 14:17:09 +02:00
|
|
|
JsonNodeType type; // <- TODO: hide
|
|
|
|
|
2014-10-09 12:14:10 +02:00
|
|
|
inline void writeArrayTo(JsonWriter&);// TODO: <- move in JsonNodeSerializer
|
|
|
|
inline void writeObjectTo(JsonWriter&);// TODO: <- move in JsonNodeSerializer
|
2014-09-27 14:43:19 +02:00
|
|
|
|
|
|
|
union
|
|
|
|
{
|
2014-09-27 15:04:06 +02:00
|
|
|
bool asBoolean;
|
2014-09-27 14:59:02 +02:00
|
|
|
double asDouble;
|
2014-09-30 17:24:14 +02:00
|
|
|
long asInteger;
|
2014-09-27 15:24:16 +02:00
|
|
|
const char* asString;
|
2014-09-27 14:43:19 +02:00
|
|
|
|
2014-10-09 12:14:10 +02:00
|
|
|
struct
|
2014-09-27 14:43:19 +02:00
|
|
|
{
|
|
|
|
const char* key;
|
|
|
|
JsonNode* value;
|
|
|
|
} asKey;
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
JsonNode* child;
|
2014-09-27 15:34:34 +02:00
|
|
|
JsonBuffer* buffer;
|
2014-10-01 16:13:36 +02:00
|
|
|
} asContainer;
|
2014-09-27 14:43:19 +02:00
|
|
|
|
2014-09-28 21:04:59 +02:00
|
|
|
struct
|
|
|
|
{
|
|
|
|
JsonNode* target;
|
|
|
|
} asProxy;
|
|
|
|
|
2014-09-27 14:43:19 +02:00
|
|
|
} content;
|
|
|
|
};
|