9 const std::string
TextModel::TYPENAME("TextModels.Model^");
10 const TypeProxy
<TextModel
, ContainerModel
> TextModel::PROXY
;
12 TextModel::TextModel(INTEGER id
) : ContainerModel(id
) {}
14 const std::string
&TextModel::getTypeName() const {
18 void TextModel::internalize(Reader
&reader
) {
19 ContainerModel::internalize(reader
);
20 if (reader
.isCancelled()) return;
21 reader
.readVersion(0, 0);
24 const std::string
StdTextModel::TYPENAME("TextModels.StdModel^");
25 const TypeProxy
<StdTextModel
, TextModel
> StdTextModel::PROXY
;
27 StdTextModel::StdTextModel(INTEGER id
) : TextModel(id
), d_pieces() {}
29 const std::string
&StdTextModel::getTypeName() const {
34 * This is my current theory of how the StdTextModel storage format works:
36 * byte 1-5: len (length of piece descriptions)
37 * byte 6-5+len: piece descriptions
38 * byte 6+len-end: pieces (length of each defined in piece descriptions)
40 void StdTextModel::internalize(Reader
&reader
) {
41 TextModel::internalize(reader
);
42 if (reader
.isCancelled()) return;
43 reader
.readVersion(0, 1);
44 if (reader
.isCancelled()) return;
46 std::vector
<Store
*> dict
; // attribute dictionary
48 // reads the meta-data
49 INTEGER len
= reader
.readInt(); // lenght of meta-data section
50 BYTE ano
= reader
.readByte();
52 // This part reads the piece's attributes. These are ignored for now,
53 // but may be needed in the future.
54 if (ano
== dict
.size()) {
55 dict
.push_back(reader
.readStore());
57 Store
*attr
= dict
[ano
];
59 INTEGER pieceLen
= reader
.readInt();
60 if (pieceLen
> 0) { // shortchar piece
61 d_pieces
.push_back(new ShortPiece(pieceLen
));
62 } else if (pieceLen
< 0) { // longchar piece
63 assert(pieceLen
% 2 == 0);
64 d_pieces
.push_back(new LongPiece(-pieceLen
/ 2));
65 } else { // embedded view
66 reader
.readInt(); reader
.readInt(); // view width + height: ignore
67 Store
*view
= reader
.readStore();
68 d_pieces
.push_back(new ViewPiece(view
));
70 ano
= reader
.readByte();
73 // reads the pieces described in the meta-data
74 for (int i
= 0; i
< d_pieces
.size(); ++i
) {
75 d_pieces
[i
]->read(reader
);
78 // free memory from stores in the dictionary
79 for (int i
= 0; i
< dict
.size(); ++i
) {
84 std::string
StdTextModel::toString() {
85 std::string sofar
= "StdTextModel { ";
86 for (int i
= 0; i
< d_pieces
.size(); ++i
) {
87 sofar
+= d_pieces
[i
]->toString() + " ";
92 void StdTextModel::accept(Visitor
&visitor
) const {
94 for (int i
= 0; i
< d_pieces
.size(); ++i
) {
95 d_pieces
[i
]->accept(visitor
);
100 TextPiece::TextPiece(size_t len
): d_len(len
) {}
102 LongPiece::LongPiece(size_t len
): TextPiece(len
* 2) {}
104 LongPiece::~LongPiece() {
108 void LongPiece::read(Reader
&reader
) {
109 d_buf
= new CHAR
[d_len
/ 2 + 1];
110 reader
.readLChar(d_buf
, d_len
/ 2);
111 d_buf
[d_len
/ 2] = 0;
114 std::string
LongPiece::toString() const {
115 return std::string("LongPiece(FIXME)");
118 std::wstring
LongPiece::getText() const {
119 return std::wstring((wchar_t*)d_buf
);
122 void LongPiece::accept(Visitor
&visitor
) const {
123 visitor
.textLongPiece(this);
126 ShortPiece::ShortPiece(size_t len
): TextPiece(len
) {}
128 ShortPiece::~ShortPiece() {
132 void ShortPiece::read(Reader
&reader
) {
133 d_buf
= new SHORTCHAR
[d_len
+ 1];
134 reader
.readSChar(d_buf
, d_len
);
138 std::string
ShortPiece::toString() const {
139 return std::string("ShortPiece(") + std::string(d_buf
) + std::string(")");
142 std::string
ShortPiece::getText() const {
143 std::string
str(d_buf
);
144 for (std::string::iterator it
= str
.begin(); it
< str
.end(); ++it
) {
145 if (*it
== '\r') *it
= '\n';
150 void ShortPiece::accept(Visitor
&visitor
) const {
151 visitor
.textShortPiece(this);
154 ViewPiece::ViewPiece(Store
*view
): TextPiece(1), d_view(view
) {}
156 ViewPiece::~ViewPiece() {
160 void ViewPiece::read(Reader
&reader
) {
164 std::string
ViewPiece::toString() const {
165 return std::string("ViewPiece { ") + d_view
->toString() + " }";
168 void ViewPiece::accept(Visitor
&visitor
) const {
169 return d_view
->accept(visitor
);