X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=textmodel.cc;h=cfd7730256ff2d0045cfd1ed63e83e1b497a8575;hb=a3724718862ea28a70f2c6c330cdc729451d6510;hp=977bd447e35ecca8efd0b71617597f709577771b;hpb=cf035fa1849a5e65c0d636ce2718bc2c85994680;p=odcread.git diff --git a/textmodel.cc b/textmodel.cc index 977bd44..cfd7730 100644 --- a/textmodel.cc +++ b/textmodel.cc @@ -10,20 +10,12 @@ namespace odc { const std::string TextModel::TYPENAME("TextModels.Model^"); -const TypeProxy TextModel::PROXY; +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(); + return TYPENAME; } void TextModel::internalize(Reader &reader) { @@ -33,20 +25,12 @@ void TextModel::internalize(Reader &reader) { } const std::string StdTextModel::TYPENAME("TextModels.StdModel^"); -const TypeProxy StdTextModel::PROXY; +const TypeProxy StdTextModel::PROXY; StdTextModel::StdTextModel(INTEGER id) : TextModel(id), d_pieces() {} -const std::string &StdTextModel::getType() { - return TYPENAME; -} - -const std::string *StdTextModel::getSuper() { - return &TextModel::getType(); -} - const std::string &StdTextModel::getTypeName() const { - return getType(); + return TYPENAME; } /* @@ -157,33 +141,38 @@ std::string StdTextModel::toString() { return sofar + "}"; } -std::string StdTextModel::toPlainText() { - std::string sofar = ""; +void StdTextModel::accept(Visitor &visitor) const { + visitor.partStart(); for (int i = 0; i < d_pieces.size(); ++i) { - sofar += d_pieces[i]->toPlainText(); + d_pieces[i]->accept(visitor); } - return sofar; + visitor.partEnd(); } TextPiece::TextPiece(size_t len): d_len(len) {} -LongPiece::LongPiece(size_t len): TextPiece(len) {} +LongPiece::LongPiece(size_t len): TextPiece(len * 2) {} LongPiece::~LongPiece() { delete d_buf; } void LongPiece::read(Reader &reader) { - d_buf = new CHAR[d_len]; - reader.readLChar(d_buf, d_len); + d_buf = new CHAR[d_len / 2 + 1]; + reader.readLChar(d_buf, d_len / 2); + d_buf[d_len / 2] = 0; } -std::string LongPiece::toString() { +std::string LongPiece::toString() const { return std::string("LongPiece(FIXME)");// + std::wstring((wchar_t*)d_buf) + std::string(")"); } -std::string LongPiece::toPlainText() { - return std::string("FIXME");// + std::wstring((wchar_t*)d_buf) + std::string(")"); +std::wstring LongPiece::getText() const { + return std::wstring((wchar_t*)d_buf); +} + +void LongPiece::accept(Visitor &visitor) const { + visitor.textLongPiece(this); } ShortPiece::ShortPiece(size_t len): TextPiece(len) {} @@ -193,38 +182,43 @@ ShortPiece::~ShortPiece() { } void ShortPiece::read(Reader &reader) { -// static char piece[] = "pieceA"; d_buf = new SHORTCHAR[d_len + 1]; reader.readSChar(d_buf, d_len); d_buf[d_len] = 0; -// std::cout.write(buf, d_len); -// std::ofstream ofs(piece, std::ios::out); -// ofs.write(buf, d_len); -// ofs.close(); -// ++piece[5]; -// delete buf; } -std::string ShortPiece::toString() { +std::string ShortPiece::toString() const { return std::string("ShortPiece(") + std::string(d_buf) + std::string(")"); } -std::string ShortPiece::toPlainText() { - return std::string(d_buf); +std::string ShortPiece::getText() const { + std::string str(d_buf); + for (std::string::iterator it = str.begin(); it < str.end(); ++it) { + if (*it == '\r') *it = '\n'; + } + return str; } -ViewPiece::ViewPiece(Store *view): TextPiece(0), d_view(view) {} +void ShortPiece::accept(Visitor &visitor) const { + visitor.textShortPiece(this); +} + +ViewPiece::ViewPiece(Store *view): TextPiece(1), d_view(view) {} + +ViewPiece::~ViewPiece() { + delete d_view; +} void ViewPiece::read(Reader &reader) { reader.readByte(); } -std::string ViewPiece::toString() { +std::string ViewPiece::toString() const { return std::string("ViewPiece { ") + d_view->toString() + " }"; } -std::string ViewPiece::toPlainText() { - return d_view->toPlainText(); +void ViewPiece::accept(Visitor &visitor) const { + return d_view->accept(visitor); } } // namespace odc