109 writeCurrentTag(current); |
109 writeCurrentTag(current); |
110 current = parentOrSelf(current); |
110 current = parentOrSelf(current); |
111 mode.pop_back(); |
111 mode.pop_back(); |
112 } else if (mode.back() == Mode::ROOT) { |
112 } else if (mode.back() == Mode::ROOT) { |
113 current->add_child_text(value); |
113 current->add_child_text(value); |
|
114 current->set_attribute("value-type", cborType); |
114 writeCurrentTag(current); |
115 writeCurrentTag(current); |
115 } else if (mode.back() == Mode::BYTE_STRING || mode.back() == Mode::CHAR_STRING) { |
116 } else if (mode.back() == Mode::BYTE_STRING || mode.back() == Mode::CHAR_STRING) { |
116 currentIndefiniteString << value; |
117 currentIndefiniteString << value; |
117 } else { |
118 } else { |
118 // TODO: throw exception? |
119 // TODO: throw exception? |
120 |
121 |
121 checkRemainingItems(); |
122 checkRemainingItems(); |
122 } |
123 } |
123 |
124 |
124 void arrayStart(ssize_t size) { |
125 void arrayStart(ssize_t size) { |
125 xmlpp::Element* parent = current->get_parent(); |
126 if (mode.back() == Mode::ROOT) { |
126 if (parent) { |
127 current->set_attribute("value-type", "array"); |
|
128 itemName = "item"; |
|
129 } else if (mode.back() == Mode::ARRAY) { |
|
130 current = current->add_child(nameCodec.encode(itemName)); |
|
131 itemName = "item"; |
|
132 } else if (mode.back() == Mode::MAP_VALUE) { |
|
133 xmlpp::Element* parent = current->get_parent(); |
127 itemName = current->get_name(); |
134 itemName = current->get_name(); |
128 parent->remove_child(current); |
135 parent->remove_child(current); |
129 current = parent; |
136 current = parent; |
|
137 mode.pop_back(); |
130 } else { |
138 } else { |
131 itemName = "item"; |
139 // Mode::BYTE_STRING and Mode::CHAR_STRING – make no sense |
132 } |
140 // Mode::MAP_KEY – currently not supported |
133 |
141 throw relpipe::writer::RelpipeWriterException(L"Unsupported mode in arrayStart(): " + std::to_wstring((int) mode.back())); |
134 if (mode.back() == Mode::MAP_KEY) mode.pop_back(); |
142 } |
|
143 |
|
144 |
135 mode.push_back(Mode::ARRAY); |
145 mode.push_back(Mode::ARRAY); |
136 remainingItems.push_back(size); |
146 remainingItems.push_back(size); |
137 writeCurrentTag(current); |
147 writeCurrentTag(current); |
|
148 |
|
149 if (size == 0) containerEnd(); |
138 } |
150 } |
139 |
151 |
140 void mapStart(ssize_t size) { |
152 void mapStart(ssize_t size) { |
141 if (mode.back() == Mode::ROOT) { |
153 if (mode.back() == Mode::ROOT) { |
|
154 current->set_attribute("value-type", "map"); |
142 } else if (mode.back() == Mode::ARRAY) { |
155 } else if (mode.back() == Mode::ARRAY) { |
143 current = current->add_child(nameCodec.encode(itemName)); |
156 current = current->add_child(nameCodec.encode(itemName)); |
144 current->set_attribute("value-type", "map"); |
157 current->set_attribute("value-type", "map"); |
145 } else if (mode.back() == Mode::MAP_VALUE) { |
158 } else if (mode.back() == Mode::MAP_VALUE) { |
146 mode.pop_back(); |
159 mode.pop_back(); |
151 } |
164 } |
152 |
165 |
153 mode.push_back(Mode::MAP_KEY); |
166 mode.push_back(Mode::MAP_KEY); |
154 remainingItems.push_back(size); |
167 remainingItems.push_back(size); |
155 writeCurrentTag(current); |
168 writeCurrentTag(current); |
|
169 |
|
170 if (size == 0) containerEnd(); |
156 } |
171 } |
157 |
172 |
158 void flushCurrentIndefiniteString(Glib::ustring cborType) { |
173 void flushCurrentIndefiniteString(Glib::ustring cborType) { |
159 appendScalarValue(currentIndefiniteString.str(), cborType); |
174 appendScalarValue(currentIndefiniteString.str(), cborType); |
160 currentIndefiniteString = std::stringstream(); |
175 currentIndefiniteString = std::stringstream(); |
162 |
177 |
163 void containerEnd() { |
178 void containerEnd() { |
164 Mode m = mode.back(); |
179 Mode m = mode.back(); |
165 mode.pop_back(); |
180 mode.pop_back(); |
166 remainingItems.pop_back(); |
181 remainingItems.pop_back(); |
167 |
182 |
168 if (m == Mode::MAP_KEY || m == Mode::MAP_VALUE) current = parentOrSelf(current); |
183 if (m == Mode::MAP_KEY || m == Mode::MAP_VALUE) current = parentOrSelf(current); |
169 else if (m == Mode::BYTE_STRING) flushCurrentIndefiniteString("byte-string"); |
184 else if (m == Mode::BYTE_STRING) flushCurrentIndefiniteString("byte-string"); |
170 else if (m == Mode::CHAR_STRING) flushCurrentIndefiniteString("string"); |
185 else if (m == Mode::CHAR_STRING) flushCurrentIndefiniteString("string"); |
171 } |
186 } |
172 |
187 |