X-Git-Url: http://deadsoftware.ru/gitweb?p=odcread.git;a=blobdiff_plain;f=store.cc;h=c2fd5b4d8696e62da10f8b04b6d4e08488a2a003;hp=ba0842508d6bf15218d54ce4f6c54a84748c529d;hb=9b0fce2b8ea23e4eb23485421e1d80a774c912b3;hpb=252b7a3f5d7ea1205ea360cb2bc59853f60df070 diff --git a/store.cc b/store.cc index ba08425..c2fd5b4 100644 --- a/store.cc +++ b/store.cc @@ -26,7 +26,6 @@ std::string TypePath::toString() const { const std::string Store::TYPENAME("Stores.Store^"); const TypeProxy Store::PROXY; -TypePath *Store::s_typePath = 0; Store::Store(INTEGER id): d_id(id) {} @@ -46,23 +45,16 @@ const std::string &Store::getTypeName() const { return Store::getType(); } -const TypePath &Store::getTypePath() const { - if (s_typePath == 0) { - s_typePath = calcTypePath(getTypeName()); - } - return *s_typePath; +void Store::getTypePath(TypePath *out) const { + return calcTypePath(out, getTypeName()); } -TypePath *Store::calcTypePath(const std::string &name) const { +void Store::calcTypePath(TypePath *path, const std::string &name) const { const std::string *super = TypeRegister::getInstance().get(name)->getSuper(); - TypePath *path; if (super != 0) { - path = calcTypePath(*super); - } else { - path = new TypePath(); + calcTypePath(path, *super); } path->push_back(name); - return path; } void Store::internalize(Reader &reader) { @@ -91,7 +83,9 @@ const std::string &Elem::getTypeName() const { } void Elem::internalize(Reader &reader) { - Store::internalize(reader); // just being explicit + Store::internalize(reader); + if (reader.isCancelled()) return; + reader.readVersion(0, 0); } const std::string Model::TYPENAME("Models.Model^"); @@ -113,6 +107,7 @@ const std::string &Model::getTypeName() const { void Model::internalize(Reader &reader) { Elem::internalize(reader); + if (reader.isCancelled()) return; reader.readVersion(0, 0); } @@ -135,97 +130,8 @@ const std::string &ContainerModel::getTypeName() const { void ContainerModel::internalize(Reader &reader) { Model::internalize(reader); + if (reader.isCancelled()) return; reader.readVersion(0, 0); } -const std::string TextModel::TYPENAME("TextModels.Model^"); -const TypeProxy TextModel::PROXY; - -TextModel::TextModel(INTEGER id) : ContainerModel(id) {} - -const std::string &TextModel::getType() { - return TYPENAME; -} - -const std::string *TextModel::getSuper() { - return &ContainerModel::getType(); -} - -const std::string &TextModel::getTypeName() const { - return getType(); -} - -void TextModel::internalize(Reader &reader) { - ContainerModel::internalize(reader); - reader.readVersion(0, 0); -} - -const std::string StdTextModel::TYPENAME("TextModels.StdModel^"); -const TypeProxy StdTextModel::PROXY; - -StdTextModel::StdTextModel(INTEGER id) : TextModel(id) {} - -const std::string &StdTextModel::getType() { - return TYPENAME; -} - -const std::string *StdTextModel::getSuper() { - return &TextModel::getType(); -} - -const std::string &StdTextModel::getTypeName() const { - return getType(); -} - -void StdTextModel::internalize(Reader &reader) { - TextModel::internalize(reader); - reader.readVersion(0, 1); - -// PROCEDURE (t: StdModel) Internalize (VAR rd: Stores.Reader); -// VAR u, un: Run; sp: Piece; lp: LPiece; v: ViewRef; -// org, len: INTEGER; ano: BYTE; thisVersion: INTEGER; -// attr: Attributes; dict: AttrDict; -// BEGIN -// ASSERT(t.Domain() = NIL, 20); ASSERT(t.len = 0, 21); -// t.Internalize^(rd); IF rd.cancelled THEN RETURN END; -// rd.ReadVersion(minVersion, maxStdModelVersion, thisVersion); -// IF rd.cancelled THEN RETURN END; -// StdInit(t); -// dict.len := 0; u := t.trailer; -// rd.ReadInt(len); org := rd.Pos() + len; -// rd.ReadByte(ano); -// WHILE ano # -1 DO -// IF ano = dict.len THEN -// ReadAttr(rd, attr); Stores.Join(t, attr); -// IF dict.len < dictSize THEN dict.attr[dict.len] := attr; INC(dict.len) END -// ELSE -// attr := dict.attr[ano] -// END; -// rd.ReadInt(len); -// IF len > 0 THEN (* piece *) -// NEW(sp); sp.len := len; sp.attr := attr; -// sp.file := rd.rider.Base(); sp.org := org; un := sp; -// INC(org, len) -// ELSIF len < 0 THEN (* longchar piece *) -// len := -len; ASSERT(~ODD(len), 100); -// NEW(lp); lp.len := len DIV 2; lp.attr := attr; -// lp.file := rd.rider.Base(); lp.org := org; un := lp; -// INC(org, len) -// ELSE (* len = 0 => embedded view *) -// NEW(v); v.len := 1; v.attr := attr; -// rd.ReadInt(v.w); rd.ReadInt(v.h); Views.ReadView(rd, v.view); -// v.view.InitContext(NewContext(v, t)); -// un := v; INC(org) -// END; -// INC(t.len, un.len); u.next := un; un.prev := u; u := un; -// rd.ReadByte(ano) -// END; -// rd.SetPos(org); -// u.next := t.trailer; t.trailer.prev := u -// END Internalize; -// -} - - - } // namespace odc