src/XMLDocumentConstructor.h
branchv_0
changeset 40 503b77beed57
parent 39 77d585a1b98c
child 41 b11458587f20
equal deleted inserted replaced
39:77d585a1b98c 40:503b77beed57
   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