Sascha
From Guiliani
eC_Bool CMyGUI::DoClick(const eC_Value& vAbsX, const eC_Value& vAbsY) {
CGUICompositeObject* pkComp = new CGUICompositeObject(NULL, 0, 0, 100, 100); CGUIObject* pkObj = new CGUIObject(pkComp, 0, 0, 50, 50);
CGUIStreamWriterJSON kWriter; eC_PlatformFile* pkFile = new eC_PlatformFile("C:\\temp\\blabla.json", eC_PlatformFile::FS_WRITEACCESS);
pkFile->Write8i('{'); pkFile->Write8i('\n');
kWriter.SetStreamingFile(pkFile); GETGUI.WriteToStream(true);
pkFile->Write8i('\n'); pkFile->Write8i('}');
delete pkComp; delete pkFile;
return false;
}
- include "GUIStreamWriter.h"
- include "eC_TList_doubleLinked.h"
class CGUIStreamWriterJSON : public CGUIStreamWriter { public:
CGUIStreamWriterJSON(); ~CGUIStreamWriterJSON();
virtual void WriteUByte(const eC_UByte ubByte, const eC_Char* const pcTag); virtual void WriteByte(const eC_Byte bByte, const eC_Char* const pcTag); virtual void WriteUInt(const eC_UInt uiInt, const eC_Char* const pcTag); virtual void WriteUShort(const eC_UShort usShort, const eC_Char* const pcTag); virtual void WriteInt(const eC_Int iInt, const eC_Char* const pcTag); virtual void WriteHex(const eC_UInt uiInt, const eC_Char* const pcTag); virtual void WriteColor(const ColorValue_t eColor, const eC_Char* const pcTag); virtual void WriteFloat(const eC_Float fFloat, const eC_Char* const pcTag); virtual void WriteString(const eC_String &pkString, const eC_Char* const pcTag); virtual void WriteShort(const eC_Short iShort, const eC_Char* const pcTag); virtual void WriteBool(const eC_Bool bBool, const eC_Char* const pcTag); virtual void WriteBinary(const eC_TArray<eC_UByte>& aData, const eC_Char* const pcTag);
virtual void WriteCommentTag(const eC_Char* const pcTag); virtual void WriteCommentTag(const eC_String& kTag);
virtual void WriteStreamingFileHeader(const eC_Int iFileVersion); virtual eC_Bool SetFileEndianess(FileEndianess_t eFileEndianess); virtual eC_Bool SetFileAlignment(FileAlignment_t eFileAlignment);
void WriteNode(const eC_String& kName, const eC_String& kValue, const eC_Bool& bAddDoubleQuotes); void WriteNodeName(const eC_String& kName); void WriteNodeValue(const eC_String& kValue, const eC_Bool& bAddDoubleQuotes);
void BeginObject(const eC_String& kName); void EndObject(); void BeginArray(const eC_String& kName); void EndArray();
void WriteIndentation(); void WriteLineEnding();
private:
enum TokenType_t { TT_OBJECT, TT_ARRAY, TT_NODE };
private:
CGUIStreamWriterJSON(const CGUIStreamWriterJSON& kSource); CGUIStreamWriterJSON& operator=(const CGUIStreamWriterJSON& kSource);
void WriteUnterminatedString(const eC_String& kString);
private:
eC_TListDoubleLinked<TokenType_t> m_kTokenStack; eC_UInt m_uiIdentation; eC_UInt m_uiCurrentNumberOfElements;
};
- include "GUIStreamWriterJSON.h"
- include "GUICompositeObject.h"
CGUIStreamWriterJSON::CGUIStreamWriterJSON() :
CGUIStreamWriter(FileType_t::FILE_TYPE_CUSTOM, FileEndianess_t::FILE_ENDIANESS_LITTLE, FileAlignment_t::FILE_ALIGNMENT_8BIT), m_uiIdentation(1), m_uiCurrentNumberOfElements(0)
{ }
CGUIStreamWriterJSON::~CGUIStreamWriterJSON() {
//WriteUnterminatedString("}");
}
void CGUIStreamWriterJSON::WriteUByte(const eC_UByte ubByte, const eC_Char* const pcTag) {
eC_String kValue(ubByte); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteByte(const eC_Byte bByte, const eC_Char* const pcTag) {
eC_String kValue(bByte); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteUInt(const eC_UInt uiInt, const eC_Char* const pcTag) {
eC_String kValue(uiInt); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteUShort(const eC_UShort usShort, const eC_Char* const pcTag) {
eC_String kValue(usShort); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteInt(const eC_Int iInt, const eC_Char* const pcTag) {
eC_String kValue(iInt); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteHex(const eC_UInt uiInt, const eC_Char* const pcTag) {
eC_String kValue(uiInt); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteColor(const ColorValue_t eColor, const eC_Char* const pcTag) {
WriteHex(eColor.uiColor, pcTag);
}
void CGUIStreamWriterJSON::WriteFloat(const eC_Float fFloat, const eC_Char* const pcTag) {
eC_String kValue(fFloat); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteString(const eC_String &pkString, const eC_Char* const pcTag) {
WriteNode(pcTag, pkString, true);
}
void CGUIStreamWriterJSON::WriteShort(const eC_Short iShort, const eC_Char* const pcTag) {
eC_String kValue(iShort); WriteNode(pcTag, kValue, false);
}
void CGUIStreamWriterJSON::WriteBool(const eC_Bool bBool, const eC_Char* const pcTag) {
WriteNode(pcTag, (bBool) ? "true" : "false", false);
}
void CGUIStreamWriterJSON::WriteBinary(const eC_TArray<eC_UByte>& aData, const eC_Char* const pcTag) { }
void CGUIStreamWriterJSON::WriteCommentTag(const eC_Char* const pcTag) {
WriteCommentTag(eC_String(pcTag));
}
void CGUIStreamWriterJSON::WriteCommentTag(const eC_String& kTag) {
if (kTag.IsEmpty()) return;
if (kTag == CGUICompositeObject::XMLTAG_CHILDREN) { BeginArray(kTag); } else if (kTag == CGUICompositeObject::XMLTAG_ENDCHILDREN) { EndArray(); } else if (kTag == CGUIObject::XMLTAG_CLASSVERSION) { } else { if (kTag.GetArray()[0] != '/') BeginObject(kTag); else EndObject(); }
}
void CGUIStreamWriterJSON::WriteStreamingFileHeader(const eC_Int iFileVersion) { }
eC_Bool CGUIStreamWriterJSON::SetFileEndianess(FileEndianess_t eFileEndianess) {
m_eFileEndianess = eFileEndianess;
return true;
}
eC_Bool CGUIStreamWriterJSON::SetFileAlignment(FileAlignment_t eFileAlignment) {
m_eFileAlignment = eFileAlignment;
return true;
}
void CGUIStreamWriterJSON::WriteNode(const eC_String& kName, const eC_String& kValue, const eC_Bool& bAddDoubleQuotes) {
if (kName == "ChildCount") return;
if (!kName.IsEmpty()) { WriteLineEnding(); WriteNodeName(kName); WriteNodeValue(kValue, bAddDoubleQuotes);
++m_uiCurrentNumberOfElements; }
}
void CGUIStreamWriterJSON::WriteNodeName(const eC_String& kName) {
WriteIndentation(); WriteUnterminatedString("\"" + kName + "\": ");
}
void CGUIStreamWriterJSON::WriteNodeValue(const eC_String& kValue, const eC_Bool& bAddDoubleQuotes) {
//if (m_kTokenStack.GetQuantity() == 0)
eC_String kText; if (bAddDoubleQuotes) kText += "\""; kText += kValue; if (bAddDoubleQuotes) kText += "\"";
WriteUnterminatedString(kText);
}
void CGUIStreamWriterJSON::BeginObject(const eC_String& kName) {
WriteLineEnding();
eC_Bool bWriteName = true;
if ((m_kTokenStack.GetQuantity() > 0) && (*m_kTokenStack.GetAt(m_kTokenStack.GetQuantity() - 1) == TT_ARRAY) ) bWriteName = false;
if (bWriteName) { if (!kName.IsEmpty()) WriteNodeName(kName); } else WriteIndentation();
WriteUnterminatedString("{\n");
m_uiCurrentNumberOfElements = 0; ++m_uiIdentation;
m_kTokenStack.AddAtEnd(TT_OBJECT);
}
void CGUIStreamWriterJSON::EndObject() {
WriteUnterminatedString("\n");
--m_uiIdentation;
WriteIndentation(); WriteUnterminatedString("}");
TokenType_t eTokenType; m_kTokenStack.RemoveEnd(eTokenType);
}
void CGUIStreamWriterJSON::BeginArray(const eC_String& kName) {
WriteLineEnding();
if (!kName.IsEmpty()) WriteNodeName(kName); WriteUnterminatedString("[\n");
m_uiCurrentNumberOfElements = 0; ++m_uiIdentation;
m_kTokenStack.AddAtEnd(TT_ARRAY);
}
void CGUIStreamWriterJSON::EndArray() {
WriteUnterminatedString("\n"); --m_uiIdentation;
WriteIndentation(); WriteUnterminatedString("]");
TokenType_t eTokenType; m_kTokenStack.RemoveEnd(eTokenType);
}
void CGUIStreamWriterJSON::WriteUnterminatedString(const eC_String& kString) {
if (kString.IsEmpty()) return;
eC_Char* pkString = kString.ToASCII_Alloc(); m_pkStreamingFile->Write8((eC_UByte*)pkString, kString.GetLength());
delete pkString;
}
void CGUIStreamWriterJSON::WriteIndentation() {
eC_String kText;
for (eC_UInt uiIndent = 0; uiIndent < m_uiIdentation; ++uiIndent) kText += " ";
WriteUnterminatedString(kText);
}
void CGUIStreamWriterJSON::WriteLineEnding() {
eC_String kText;
if (m_uiCurrentNumberOfElements > 0) kText += ",\n"; WriteUnterminatedString(kText);
}