#pragma once #include "dtcore/inc/dtstream.h" namespace dt { struct _json_value; class JsonValue; class StreamJsonInput : public Stream { public: DT_CORE_DLL_ENTRY StreamJsonInput(const String& document); DT_CORE_DLL_ENTRY StreamJsonInput(const JsonValue& jsonVal); DT_CORE_DLL_ENTRY ~StreamJsonInput(); DT_CORE_DLL_ENTRY virtual void SerializeBinary(const ByteBuffer& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeBinary(ByteBuffer& data) override; DT_CORE_DLL_ENTRY virtual void SerializeString(const String& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeString(String& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const S8& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(S8& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const S16& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(S16& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const S32& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(S32& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const S64& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(S64& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const U8& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(U8& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const U16& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(U16& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const U32& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(U32& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const U64& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(U64& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const float& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(float& data) override; DT_CORE_DLL_ENTRY virtual void SerializeNumeral(const double& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeNumeral(double& data) override; DT_CORE_DLL_ENTRY virtual void SerializeBool(const bool& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeBool(bool& data) override; DT_CORE_DLL_ENTRY virtual void SerializeSize(const SizeT& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeSize(SizeT& data) override; DT_CORE_DLL_ENTRY virtual bool SerializeMember(const char* name) override; DT_CORE_DLL_ENTRY virtual void SerializeKey(const String& name) override; DT_CORE_DLL_ENTRY virtual bool SerializeKey(String& name) override; DT_CORE_DLL_ENTRY virtual void SerializeVersion(U8& data) override; DT_CORE_DLL_ENTRY virtual void ObjectStart(const void* pointer) override; DT_CORE_DLL_ENTRY virtual void ObjectEnd(const void* pointer) override; DT_CORE_DLL_ENTRY virtual void ListStart(const void* pointer) override; DT_CORE_DLL_ENTRY virtual void ListEnd(const void* pointer) override; DT_CORE_DLL_ENTRY virtual bool IsInput() const override; DT_CORE_DLL_ENTRY bool HasSucceeded() const; private: friend class HttpServerImpl; StreamJsonInput(_json_value* document); private: struct Scope { Scope(const void* pointer, _json_value* value) : m_Pointer(pointer) , m_LastMemberIndex(0) , m_Value(value) {} const void* m_Pointer; int m_LastMemberIndex; _json_value* m_Value; }; Vector m_ScopeStack; _json_value* m_Document; bool m_Success; bool m_Owner; Scope& GetTopScope(); bool GetCurrentValue(_json_value** value); void Fail(); template bool SerializeIntegerOrDouble(T& data); }; }