|
|
@@ -1,166 +1,166 @@
|
|
|
-#include "ArduinoJson/Internals/JsonNode.h"
|
|
|
-
|
|
|
-#include "ArduinoJson/Internals/JsonWriter.h"
|
|
|
-#include "ArduinoJson/JsonArray.h"
|
|
|
-#include "ArduinoJson/JsonObject.h"
|
|
|
-#include "ArduinoJson/JsonBuffer.h"
|
|
|
-
|
|
|
-void JsonNode::writeTo(JsonWriter& writer)
|
|
|
-{
|
|
|
- switch (type)
|
|
|
- {
|
|
|
- case JSON_PROXY:
|
|
|
- content.asProxy.target->writeTo(writer);
|
|
|
- break;
|
|
|
-
|
|
|
- case JSON_ARRAY:
|
|
|
- writeArrayTo(writer);
|
|
|
- break;
|
|
|
-
|
|
|
- case JSON_OBJECT:
|
|
|
- writeObjectTo(writer);
|
|
|
- break;
|
|
|
-
|
|
|
- case JSON_STRING:
|
|
|
- writer.writeString(content.asString);
|
|
|
- break;
|
|
|
-
|
|
|
- case JSON_LONG:
|
|
|
- writer.writeInteger(content.asInteger);
|
|
|
- break;
|
|
|
-
|
|
|
- case JSON_BOOLEAN:
|
|
|
- writer.writeBoolean(content.asBoolean);
|
|
|
- break;
|
|
|
-
|
|
|
- default: // >= JSON_DOUBLE_0_DECIMALS
|
|
|
- writer.writeDouble(content.asDouble, type - JSON_DOUBLE_0_DECIMALS);
|
|
|
- break;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonNode::addChild(JsonNode* childToAdd)
|
|
|
-{
|
|
|
- if (type == JSON_PROXY)
|
|
|
- return content.asProxy.target->addChild(childToAdd);
|
|
|
-
|
|
|
- if (type != JSON_ARRAY && type != JSON_OBJECT)
|
|
|
- return;
|
|
|
-
|
|
|
- JsonNode* lastChild = content.asContainer.child;
|
|
|
-
|
|
|
- if (!lastChild)
|
|
|
- {
|
|
|
- content.asContainer.child = childToAdd;
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- while (lastChild->next)
|
|
|
- lastChild = lastChild->next;
|
|
|
-
|
|
|
- lastChild->next = childToAdd;
|
|
|
-}
|
|
|
-
|
|
|
-void JsonNode::removeChild(JsonNode* childToRemove)
|
|
|
-{
|
|
|
- if (type == JSON_PROXY)
|
|
|
- return content.asProxy.target->removeChild(childToRemove);
|
|
|
-
|
|
|
- if (type != JSON_ARRAY && type != JSON_OBJECT) return;
|
|
|
-
|
|
|
- if (content.asContainer.child == childToRemove)
|
|
|
- {
|
|
|
- content.asContainer.child = childToRemove->next;
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- for (JsonNode* child = content.asContainer.child; child; child = child->next)
|
|
|
- {
|
|
|
- if (child->next == childToRemove)
|
|
|
- child->next = childToRemove->next;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonNode::writeArrayTo(JsonWriter& writer)
|
|
|
-{
|
|
|
- JsonNode* child = content.asContainer.child;
|
|
|
-
|
|
|
- if (child)
|
|
|
- {
|
|
|
- writer.beginArray();
|
|
|
-
|
|
|
- for (;;)
|
|
|
- {
|
|
|
- child->writeTo(writer);
|
|
|
-
|
|
|
- child = child->next;
|
|
|
- if (!child) break;
|
|
|
-
|
|
|
- writer.writeComma();
|
|
|
- }
|
|
|
-
|
|
|
- writer.endArray();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- writer.writeEmptyArray();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonNode::writeObjectTo(JsonWriter& writer)
|
|
|
-{
|
|
|
- JsonNode* child = content.asContainer.child;
|
|
|
-
|
|
|
- if (child)
|
|
|
- {
|
|
|
- writer.beginObject();
|
|
|
-
|
|
|
- for (;;)
|
|
|
- {
|
|
|
- writer.writeString(child->content.asKey.key);
|
|
|
- writer.writeColon();
|
|
|
- child->content.asKey.value->writeTo(writer);
|
|
|
-
|
|
|
- child = child->next;
|
|
|
- if (!child) break;
|
|
|
-
|
|
|
- writer.writeComma();
|
|
|
- }
|
|
|
-
|
|
|
- writer.endObject();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- writer.writeEmptyObject();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void JsonNode::setAsProxyOfSelf()
|
|
|
-{
|
|
|
- JsonBuffer* buffer = content.asContainer.buffer;
|
|
|
- if (!buffer) return;
|
|
|
-
|
|
|
- JsonNode* newNode = buffer->createNode();
|
|
|
- if (!newNode) return;
|
|
|
-
|
|
|
- *newNode = *this;
|
|
|
-
|
|
|
- setAsProxyOf(newNode);
|
|
|
-}
|
|
|
-
|
|
|
-void JsonNode::duplicate(JsonNode* other)
|
|
|
-{
|
|
|
- if (!other)
|
|
|
- {
|
|
|
- type = JSON_UNDEFINED;
|
|
|
- }
|
|
|
- else if (other->type == JSON_ARRAY || other->type==JSON_OBJECT)
|
|
|
- {
|
|
|
- other->setAsProxyOfSelf();
|
|
|
- setAsProxyOf(other->content.asProxy.target);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- *this = *other;
|
|
|
- }
|
|
|
+#include "ArduinoJson/Internals/JsonNode.h"
|
|
|
+
|
|
|
+#include "ArduinoJson/Internals/JsonWriter.h"
|
|
|
+#include "ArduinoJson/JsonArray.h"
|
|
|
+#include "ArduinoJson/JsonObject.h"
|
|
|
+#include "ArduinoJson/JsonBuffer.h"
|
|
|
+
|
|
|
+void JsonNode::writeTo(JsonWriter& writer)
|
|
|
+{
|
|
|
+ switch (type)
|
|
|
+ {
|
|
|
+ case JSON_PROXY:
|
|
|
+ content.asProxy.target->writeTo(writer);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case JSON_ARRAY:
|
|
|
+ writeArrayTo(writer);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case JSON_OBJECT:
|
|
|
+ writeObjectTo(writer);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case JSON_STRING:
|
|
|
+ writer.writeString(content.asString);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case JSON_LONG:
|
|
|
+ writer.writeInteger(content.asInteger);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case JSON_BOOLEAN:
|
|
|
+ writer.writeBoolean(content.asBoolean);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default: // >= JSON_DOUBLE_0_DECIMALS
|
|
|
+ writer.writeDouble(content.asDouble, type - JSON_DOUBLE_0_DECIMALS);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void JsonNode::addChild(JsonNode* childToAdd)
|
|
|
+{
|
|
|
+ if (type == JSON_PROXY)
|
|
|
+ return content.asProxy.target->addChild(childToAdd);
|
|
|
+
|
|
|
+ if (type != JSON_ARRAY && type != JSON_OBJECT)
|
|
|
+ return;
|
|
|
+
|
|
|
+ JsonNode* lastChild = content.asContainer.child;
|
|
|
+
|
|
|
+ if (!lastChild)
|
|
|
+ {
|
|
|
+ content.asContainer.child = childToAdd;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ while (lastChild->next)
|
|
|
+ lastChild = lastChild->next;
|
|
|
+
|
|
|
+ lastChild->next = childToAdd;
|
|
|
+}
|
|
|
+
|
|
|
+void JsonNode::removeChild(JsonNode* childToRemove)
|
|
|
+{
|
|
|
+ if (type == JSON_PROXY)
|
|
|
+ return content.asProxy.target->removeChild(childToRemove);
|
|
|
+
|
|
|
+ if (type != JSON_ARRAY && type != JSON_OBJECT) return;
|
|
|
+
|
|
|
+ if (content.asContainer.child == childToRemove)
|
|
|
+ {
|
|
|
+ content.asContainer.child = childToRemove->next;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (JsonNode* child = content.asContainer.child; child; child = child->next)
|
|
|
+ {
|
|
|
+ if (child->next == childToRemove)
|
|
|
+ child->next = childToRemove->next;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void JsonNode::writeArrayTo(JsonWriter& writer)
|
|
|
+{
|
|
|
+ JsonNode* child = content.asContainer.child;
|
|
|
+
|
|
|
+ if (child)
|
|
|
+ {
|
|
|
+ writer.beginArray();
|
|
|
+
|
|
|
+ for (;;)
|
|
|
+ {
|
|
|
+ child->writeTo(writer);
|
|
|
+
|
|
|
+ child = child->next;
|
|
|
+ if (!child) break;
|
|
|
+
|
|
|
+ writer.writeComma();
|
|
|
+ }
|
|
|
+
|
|
|
+ writer.endArray();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ writer.writeEmptyArray();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void JsonNode::writeObjectTo(JsonWriter& writer)
|
|
|
+{
|
|
|
+ JsonNode* child = content.asContainer.child;
|
|
|
+
|
|
|
+ if (child)
|
|
|
+ {
|
|
|
+ writer.beginObject();
|
|
|
+
|
|
|
+ for (;;)
|
|
|
+ {
|
|
|
+ writer.writeString(child->content.asKey.key);
|
|
|
+ writer.writeColon();
|
|
|
+ child->content.asKey.value->writeTo(writer);
|
|
|
+
|
|
|
+ child = child->next;
|
|
|
+ if (!child) break;
|
|
|
+
|
|
|
+ writer.writeComma();
|
|
|
+ }
|
|
|
+
|
|
|
+ writer.endObject();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ writer.writeEmptyObject();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void JsonNode::setAsProxyOfSelf()
|
|
|
+{
|
|
|
+ JsonBuffer* buffer = content.asContainer.buffer;
|
|
|
+ if (!buffer) return;
|
|
|
+
|
|
|
+ JsonNode* newNode = buffer->createNode();
|
|
|
+ if (!newNode) return;
|
|
|
+
|
|
|
+ *newNode = *this;
|
|
|
+
|
|
|
+ setAsProxyOf(newNode);
|
|
|
+}
|
|
|
+
|
|
|
+void JsonNode::duplicate(JsonNode* other)
|
|
|
+{
|
|
|
+ if (!other)
|
|
|
+ {
|
|
|
+ type = JSON_UNDEFINED;
|
|
|
+ }
|
|
|
+ else if (other->type == JSON_ARRAY || other->type==JSON_OBJECT)
|
|
|
+ {
|
|
|
+ other->setAsProxyOfSelf();
|
|
|
+ setAsProxyOf(other->content.asProxy.target);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ *this = *other;
|
|
|
+ }
|
|
|
}
|