| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #ifndef RUNTIME_VM_JSON_WRITER_H_ |
| #define RUNTIME_VM_JSON_WRITER_H_ |
| |
| #include "platform/allocation.h" |
| #include "platform/text_buffer.h" |
| |
| namespace dart { |
| |
| class String; |
| |
| class JSONWriter : ValueObject { |
| public: |
| explicit JSONWriter(intptr_t buf_size = 256); |
| |
| TextBuffer* buffer() { return &buffer_; } |
| const char* ToCString() { return buffer_.buffer(); } |
| |
| void Steal(char** buffer, intptr_t* buffer_length); |
| |
| void PrintCommaIfNeeded(); |
| |
| // Append |buffer| to the stream. |
| void AppendBytes(const uint8_t* buffer, intptr_t buffer_length); |
| |
| // Append the Base64 encoding of |bytes| to the stream. |
| // |
| // Beware that padding characters are added when |length| is not a multiple of |
| // three. Padding is only valid at the end of Base64 strings, so you must be |
| // careful when trying to populate a single Base64 string with multiple calls |
| // to this method. |JSONBase64String| should be used for that use-case, |
| // because it handles padding management. |
| void AppendBytesInBase64(const uint8_t* bytes, intptr_t length); |
| |
| // Append |serialized_object| to the stream. |
| void AppendSerializedObject(const char* serialized_object); |
| |
| // Append |serialized_object| to the stream with |property_name|. |
| void AppendSerializedObject(const char* property_name, |
| const char* serialized_object); |
| |
| void OpenObject(const char* property_name = nullptr); |
| void CloseObject(); |
| void UncloseObject(); |
| |
| void OpenArray(const char* property_name = nullptr); |
| void CloseArray(); |
| |
| void Clear(); |
| |
| void PrintValueNull(); |
| void PrintValueBool(bool b); |
| void PrintValue(intptr_t i); |
| void PrintValue64(int64_t i); |
| void PrintValue(double d); |
| void PrintValueBase64(const uint8_t* bytes, intptr_t length); |
| void PrintValue(const char* s); |
| void PrintValue(const char* s, intptr_t len); |
| void PrintValueNoEscape(const char* s); |
| void PrintfValue(const char* format, ...) PRINTF_ATTRIBUTE(2, 3); |
| void VPrintfValue(const char* format, va_list args); |
| bool PrintValueStr(const String& s, intptr_t offset, intptr_t count); |
| |
| void PrintPropertyBool(const char* name, bool b); |
| void PrintProperty(const char* name, intptr_t i); |
| void PrintProperty64(const char* name, int64_t i); |
| void PrintProperty(const char* name, double d); |
| void PrintPropertyBase64(const char* name, |
| const uint8_t* bytes, |
| intptr_t length); |
| void PrintProperty(const char* name, const char* s); |
| bool PrintPropertyStr(const char* name, |
| const String& s, |
| intptr_t offset = 0, |
| intptr_t count = -1); |
| void PrintPropertyNoEscape(const char* name, const char* s); |
| void PrintfProperty(const char* name, const char* format, ...) |
| PRINTF_ATTRIBUTE(3, 4); |
| void VPrintfProperty(const char* name, const char* format, va_list args); |
| |
| void PrintPropertyName(const char* name); |
| |
| void PrintNewline(); |
| |
| void AddEscapedUTF8String(const char* s); |
| void AddEscapedUTF8String(const char* s, intptr_t len); |
| |
| private: |
| bool NeedComma(); |
| bool AddDartString(const String& s, intptr_t offset, intptr_t count); |
| |
| // Debug only fatal assertion. |
| static void EnsureIntegerIsRepresentableInJavaScript(int64_t i); |
| |
| intptr_t open_objects_; |
| TextBuffer buffer_; |
| }; |
| |
| } // namespace dart |
| |
| #endif // RUNTIME_VM_JSON_WRITER_H_ |