DEADSOFTWARE

Add some error handling, close to understanding StdTextModel
[odcread.git] / store.cc
index ba0842508d6bf15218d54ce4f6c54a84748c529d..c2fd5b4d8696e62da10f8b04b6d4e08488a2a003 100644 (file)
--- 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> 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> 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> 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