diff options
| author | Kevin Smith <git@kismith.co.uk> | 2011-09-28 16:45:00 (GMT) | 
|---|---|---|
| committer | Kevin Smith <git@kismith.co.uk> | 2011-09-28 16:45:00 (GMT) | 
| commit | 1daf22de85758cfd035f1fcf6a70007315db4f28 (patch) | |
| tree | ae822e3db619af06ec1b26fd342165b24fe89543 /Swiften/Parser/Tree/TreeReparser.cpp | |
| parent | 5c544f02222a3318b8581f68071b6a6b66b1d4c0 (diff) | |
| download | swift-contrib-1daf22de85758cfd035f1fcf6a70007315db4f28.zip swift-contrib-1daf22de85758cfd035f1fcf6a70007315db4f28.tar.bz2  | |
Destroy rooms.
Resolves: #990
Diffstat (limited to 'Swiften/Parser/Tree/TreeReparser.cpp')
| -rw-r--r-- | Swiften/Parser/Tree/TreeReparser.cpp | 48 | 
1 files changed, 48 insertions, 0 deletions
diff --git a/Swiften/Parser/Tree/TreeReparser.cpp b/Swiften/Parser/Tree/TreeReparser.cpp new file mode 100644 index 0000000..9d09831 --- /dev/null +++ b/Swiften/Parser/Tree/TreeReparser.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2011 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/Parser/Tree/TreeReparser.h> + +#include <boost/lexical_cast.hpp> +#include <utility> +#include <deque> + +#include <Swiften/Parser/PayloadParserFactoryCollection.h> +#include <Swiften/Parser/PayloadParserFactory.h> +#include <Swiften/Parser/PayloadParser.h> +#include <Swiften/Base/foreach.h> +#include <Swiften/Elements/MUCOccupant.h> + +namespace Swift { + +typedef std::pair<ParserElement::ref, bool> ElementState; + +boost::shared_ptr<Payload> TreeReparser::parseTree(ParserElement::ref root, PayloadParserFactoryCollection* collection) { +	PayloadParser* parser = collection->getPayloadParserFactory(root->getName(), root->getNamespace(), root->getAttributes())->createPayloadParser(); +	std::deque<ElementState > stack; +	stack.push_back(ElementState(root, true)); +	while (!stack.empty()) { +		ElementState current = stack.back(); +		stack.pop_back(); +		if (current.second) { +			stack.push_back(ElementState(current.first, false)); +			parser->handleStartElement(current.first->getName(), current.first->getNamespace(), current.first->getAttributes()); +			foreach(ParserElement::ref child, current.first->getAllChildren()) { +				stack.push_back(ElementState(child, true)); +			} +		} else { +			parser->handleCharacterData(current.first->getText()); +			parser->handleEndElement(current.first->getName(), current.first->getNamespace()); +		} + +	} + +	boost::shared_ptr<Payload> payload = parser->getPayload(); +	delete parser; +	return payload; +} + +}  | 
 Swift