diff options
Diffstat (limited to 'Swiften/Disco/CapsFileStorage.cpp')
-rw-r--r-- | Swiften/Disco/CapsFileStorage.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/Swiften/Disco/CapsFileStorage.cpp b/Swiften/Disco/CapsFileStorage.cpp new file mode 100644 index 0000000..c5326a7 --- /dev/null +++ b/Swiften/Disco/CapsFileStorage.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "Swiften/Disco/CapsFileStorage.h" + +#include <iostream> +#include <boost/filesystem/fstream.hpp> + +#include "Swiften/Base/ByteArray.h" +#include "Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.h" +#include "Swiften/Parser/PayloadParsers/UnitTest/PayloadParserTester.h" +#include "Swiften/Parser/PayloadParsers/DiscoInfoParser.h" +#include "Swiften/StringCodecs/Hexify.h" +#include "Swiften/StringCodecs/Base64.h" + +namespace Swift { + +CapsFileStorage::CapsFileStorage(const boost::filesystem::path& path) : path(path) { +} + +DiscoInfo::ref CapsFileStorage::getDiscoInfo(const String& hash) const { + boost::filesystem::path capsPath(getCapsPath(hash)); + if (boost::filesystem::exists(capsPath)) { + ByteArray data; + data.readFromFile(capsPath.string()); + + DiscoInfoParser parser; + PayloadParserTester tester(&parser); + tester.parse(String(data.getData(), data.getSize())); + return DiscoInfo::cast(parser.getPayload()); + } + else { + return DiscoInfo::ref(); + } +} + +void CapsFileStorage::setDiscoInfo(const String& hash, DiscoInfo::ref discoInfo) { + boost::filesystem::path capsPath(getCapsPath(hash)); + if (!boost::filesystem::exists(capsPath.parent_path())) { + try { + boost::filesystem::create_directories(capsPath.parent_path()); + } + catch (const boost::filesystem::filesystem_error& e) { + std::cerr << "ERROR: " << e.what() << std::endl; + } + } + DiscoInfo::ref bareDiscoInfo(new DiscoInfo(*discoInfo.get())); + bareDiscoInfo->setNode(""); + boost::filesystem::ofstream file(capsPath); + file << DiscoInfoSerializer().serializePayload(bareDiscoInfo); + file.close(); +} + +boost::filesystem::path CapsFileStorage::getCapsPath(const String& hash) const { + return path / (Hexify::hexify(Base64::decode(hash)) + ".xml").getUTF8String(); +} + +} |