X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8d43638db10823193952af62215f4c9e900f312a..6f34921d9369a31de14e4b07e4824e2d701710f0:/src/common/objstrm.cpp diff --git a/src/common/objstrm.cpp b/src/common/objstrm.cpp index 0b7fa3503b..824cd28fa6 100644 --- a/src/common/objstrm.cpp +++ b/src/common/objstrm.cpp @@ -56,6 +56,7 @@ void wxObjectOutputStream::WriteObjectDef(wxObjectStreamInfo& info) data_s.WriteString(info.object->GetClassInfo()->GetClassName()); } else { data_s.WriteString(TAG_EMPTY_OBJECT); + return; } data_s.WriteString(GetObjectName(info.object)); @@ -80,6 +81,9 @@ void wxObjectOutputStream::AddChild(wxObject *obj) info->duplicate = FALSE; m_saved_objs.Append(obj); } + if (!obj) + info->duplicate = FALSE; + info->n_children = 0; info->object = obj; info->parent = m_current_info; // Not useful here. @@ -135,6 +139,7 @@ bool wxObjectOutputStream::SaveObject(wxObject& obj) m_stage = 0; info.object = &obj; info.n_children = 0; + info.duplicate = FALSE; ProcessObjectDef(&info); m_stage = 1; @@ -169,25 +174,39 @@ wxObject *wxObjectInputStream::SolveName(const wxString& name) const node = node->Next(); } - return NULL; + return (wxObject *) NULL; } wxObject *wxObjectInputStream::GetParent() const { if (!m_current_info->parent) - return NULL; + return (wxObject *) NULL; return m_current_info->parent->object; } +wxObject *wxObjectInputStream::GetChild() +{ + wxObject *obj = GetChild(0); + + m_current_info->children_removed++; + + return obj; +} + wxObject *wxObjectInputStream::GetChild(int no) const { - wxNode *node = m_current_info->children.Nth(m_current_info->children_removed+no); + wxNode *node; wxObjectStreamInfo *info; - if (!node) + if (m_current_info->children_removed >= m_current_info->n_children) return NULL; + node = m_current_info->children.Nth(m_current_info->children_removed+no); + + if (!node) + return (wxObject *) NULL; + info = (wxObjectStreamInfo *)node->Data(); return info->object; @@ -210,17 +229,18 @@ bool wxObjectInputStream::ReadObjectDef(wxObjectStreamInfo *info) return FALSE; class_name = data_s.ReadString(); - info->object_name = data_s.ReadString(); info->children_removed = 0; if (class_name == TAG_EMPTY_OBJECT) - info->object = NULL; + info->object = (wxObject *) NULL; else if (class_name == TAG_DUPLICATE_OBJECT) { + info->object_name = data_s.ReadString(); info->object = SolveName(info->object_name); info->n_children = 0; } else { + info->object_name = data_s.ReadString(); info->object = wxCreateDynamicObject( WXSTRINGCAST class_name); - info->n_children = data_s.Read8(); + info->n_children = data_s.Read32(); } return TRUE; } @@ -237,12 +257,12 @@ wxObjectStreamInfo *wxObjectInputStream::ProcessObjectDef(wxObjectStreamInfo *pa m_solver.Append(info); if (!ReadObjectDef(info)) - return NULL; + return (wxObjectStreamInfo *) NULL; for (c=0;cn_children;c++) { c_info = ProcessObjectDef(info); if (!c_info) - return NULL; + return (wxObjectStreamInfo *) NULL; info->children.Append(c_info); } @@ -261,6 +281,14 @@ void wxObjectInputStream::ProcessObjectData(wxObjectStreamInfo *info) ProcessObjectData((wxObjectStreamInfo *)node->Data()); node = node->Next(); } + + m_current_info = info; + + if (info->recall) { + m_secondcall = TRUE; + info->object->LoadObject(*this); + m_secondcall = FALSE; + } } wxObject *wxObjectInputStream::LoadObject() @@ -268,9 +296,9 @@ wxObject *wxObjectInputStream::LoadObject() wxObjectStreamInfo *info; wxObject *object; - info = ProcessObjectDef(NULL); + info = ProcessObjectDef((wxObjectStreamInfo *) NULL); if (!info) - return NULL; + return (wxObject *) NULL; ProcessObjectData(info); object = info->object;