diff --git a/DesktopEditor/doctrenderer/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index d0d5848372..78a31255a5 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.pro +++ b/DesktopEditor/doctrenderer/doctrenderer.pro @@ -70,7 +70,10 @@ SOURCES += \ embed/Default.cpp # Serialize objects to JS -HEADERS += json/json.h +HEADERS += \ + json/json.h \ + json/serialization.h + SOURCES += json/json.cpp include($$PWD/js_internal/js_base.pri) diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index 8537d6c94b..cf0c0a560a 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -112,38 +112,6 @@ namespace NSJSON m_type = vtNull; } - JSSmart CValue::toJS() const - { - JSSmart ret; - switch (m_type) { - case vtUndefined: - ret = NSJSBase::CJSContext::createUndefined(); - break; - case vtNull: - ret = NSJSBase::CJSContext::createNull(); - break; - case vtBoolean: - ret = NSJSBase::CJSContext::createBool(m_bool); - break; - case vtInteger: - ret = NSJSBase::CJSContext::createInt(m_int); - break; - case vtDouble: - ret = NSJSBase::CJSContext::createDouble(m_double); - break; - case vtStringA: - ret = NSJSBase::CJSContext::createString(m_string); - break; - case vtStringW: - ret = NSJSBase::CJSContext::createString(m_wstring); - break; - default: - // this will never happen - break; - } - return ret; - } - void CValue::clear() { switch (m_type) @@ -173,21 +141,4 @@ namespace NSJSON m_type = vtObject; m_values[name] = pValue; } - - JSSmart CObject::toJS() const - { - if (m_type == vtUndefined) - return NSJSBase::CJSContext::createUndefined(); - if (m_type == vtNull) - return NSJSBase::CJSContext::createNull(); - - JSSmart ret = NSJSBase::CJSContext::createObject(); - for (const auto& entry : m_values) - { - JSSmart jsValue = entry.second->toJS(); - ret->set(entry.first.c_str(), jsValue); - } - - return ret->toValue(); - } } diff --git a/DesktopEditor/doctrenderer/json/json.h b/DesktopEditor/doctrenderer/json/json.h index 8ab3e1cb01..ac58b59ce7 100644 --- a/DesktopEditor/doctrenderer/json/json.h +++ b/DesktopEditor/doctrenderer/json/json.h @@ -8,6 +8,10 @@ namespace NSJSON { + class IBaseValue; + // Transform C++ value to JS value + JSSmart toJS(const IBaseValue* pValue); + class JS_DECL IBaseValue { protected: @@ -27,15 +31,15 @@ namespace NSJSON IBaseValue(); virtual ~IBaseValue(); - protected: - ValueType m_type; - public: virtual void setNull(); virtual bool isUndefined() const; virtual bool isNull() const; - // Transform C++ value to JS value - virtual JSSmart toJS() const = 0; + + friend JSSmart toJS(const IBaseValue* pValue); + + protected: + ValueType m_type; }; class JS_DECL CValue : public IBaseValue @@ -60,12 +64,12 @@ namespace NSJSON public: virtual void setNull() override; - // Transform C++ value to JS value - virtual JSSmart toJS() const override; private: void clear(); + friend JSSmart toJS(const IBaseValue* pValue); + private: union { @@ -87,8 +91,8 @@ namespace NSJSON public: // Add member to JS object when it will be serialized void addMember(const IBaseValue* pValue, const std::string& name); - // Transform C++ object to JS object - virtual JSSmart toJS() const override; + + friend JSSmart toJS(const IBaseValue* pValue); private: std::unordered_map m_values; diff --git a/DesktopEditor/doctrenderer/json/serialization.h b/DesktopEditor/doctrenderer/json/serialization.h new file mode 100644 index 0000000000..c88d0aeea1 --- /dev/null +++ b/DesktopEditor/doctrenderer/json/serialization.h @@ -0,0 +1,57 @@ +#ifndef SERIALIZATION_H_ +#define SERIALIZATION_H_ + +#include "json.h" + +namespace NSJSON +{ + static JSSmart toJS(const IBaseValue* pValue) + { + IBaseValue::ValueType type = pValue->m_type; + if (type == IBaseValue::vtUndefined) + return NSJSBase::CJSContext::createUndefined(); + if (type == IBaseValue::vtNull) + return NSJSBase::CJSContext::createNull(); + + JSSmart ret; + if (type == IBaseValue::vtObject) + { + const CObject* pObject = static_cast(pValue); + JSSmart jsObj = NSJSBase::CJSContext::createObject(); + for (const auto& entry : pObject->m_values) + { + JSSmart jsValue = toJS(entry.second); + jsObj->set(entry.first.c_str(), jsValue); + } + ret = jsObj->toValue(); + } + else + { + // primitive type + const CValue* pPrimitiveValue = static_cast(pValue); + switch (type) { + case IBaseValue::vtBoolean: + ret = NSJSBase::CJSContext::createBool(pPrimitiveValue->m_bool); + break; + case IBaseValue::vtInteger: + ret = NSJSBase::CJSContext::createInt(pPrimitiveValue->m_int); + break; + case IBaseValue::vtDouble: + ret = NSJSBase::CJSContext::createDouble(pPrimitiveValue->m_double); + break; + case IBaseValue::vtStringA: + ret = NSJSBase::CJSContext::createString(pPrimitiveValue->m_string); + break; + case IBaseValue::vtStringW: + ret = NSJSBase::CJSContext::createString(pPrimitiveValue->m_wstring); + break; + default: + break; + } + } + + return ret; + } +} + +#endif // SERIALIZATION_H_ diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index 717915c668..266e34f134 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -1,6 +1,6 @@ //#include "gtest/gtest.h" #include "js_internal/js_base.h" -#include "json/json.h" +#include "json/serialization.h"" #include #include @@ -121,7 +121,7 @@ int main() // null member: oTextPr.m_oExtras.setNull(); - JSSmart jsObj = oTextPr.toJS()->toObject(); + JSSmart jsObj = toJS(&oTextPr)->toObject(); JSSmart global = pContext->GetGlobal(); global->set("textPr", jsObj); JSSmart ret = pContext->runScript("(function () { return JSON.stringify(textPr, null, 4); })();");