diff options
Diffstat (limited to 'Swiften/Entity')
| -rw-r--r-- | Swiften/Entity/Entity.cpp | 29 | ||||
| -rw-r--r-- | Swiften/Entity/Entity.h | 24 | ||||
| -rw-r--r-- | Swiften/Entity/GenericPayloadPersister.h | 36 | ||||
| -rw-r--r-- | Swiften/Entity/PayloadPersister.cpp | 53 | ||||
| -rw-r--r-- | Swiften/Entity/PayloadPersister.h | 30 | 
5 files changed, 152 insertions, 20 deletions
| diff --git a/Swiften/Entity/Entity.cpp b/Swiften/Entity/Entity.cpp index da2ecaf..44f9fbf 100644 --- a/Swiften/Entity/Entity.cpp +++ b/Swiften/Entity/Entity.cpp @@ -4,28 +4,47 @@   * See Documentation/Licenses/GPLv3.txt for more information.   */ -#include "Swiften/Entity/Entity.h" +#include <Swiften/Entity/Entity.h> + +#include <Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h> +#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> +  namespace Swift { +Entity::Entity() { +	payloadParserFactories = new FullPayloadParserFactoryCollection(); +	payloadSerializers = new FullPayloadSerializerCollection(); +} +  Entity::~Entity() { +	delete payloadSerializers; +	delete payloadParserFactories;  }  void Entity::addPayloadParserFactory(PayloadParserFactory* payloadParserFactory) { -	payloadParserFactories.addFactory(payloadParserFactory); +	payloadParserFactories->addFactory(payloadParserFactory);  }  void Entity::removePayloadParserFactory(PayloadParserFactory* payloadParserFactory) { -	payloadParserFactories.removeFactory(payloadParserFactory); +	payloadParserFactories->removeFactory(payloadParserFactory);  }  void Entity::addPayloadSerializer(PayloadSerializer* payloadSerializer) { -	payloadSerializers.addSerializer(payloadSerializer); +	payloadSerializers->addSerializer(payloadSerializer);  }  void Entity::removePayloadSerializer(PayloadSerializer* payloadSerializer) { -	payloadSerializers.removeSerializer(payloadSerializer); +	payloadSerializers->removeSerializer(payloadSerializer); +} + +PayloadParserFactoryCollection* Entity::getPayloadParserFactories() { +	return payloadParserFactories; +} + +PayloadSerializerCollection* Entity::getPayloadSerializers() { +	return payloadSerializers;  }  } diff --git a/Swiften/Entity/Entity.h b/Swiften/Entity/Entity.h index 20d02ba..65480d0 100644 --- a/Swiften/Entity/Entity.h +++ b/Swiften/Entity/Entity.h @@ -6,21 +6,20 @@  #pragma once -#include <Swiften/Base/boost_bsignals.h> -#include <boost/shared_ptr.hpp> - -#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h" -#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h" -  namespace Swift {  	class PayloadParserFactory;  	class PayloadSerializer; +	class FullPayloadParserFactoryCollection; +	class FullPayloadSerializerCollection; +	class PayloadParserFactoryCollection; +	class PayloadSerializerCollection;  	/**   	 * The base class for XMPP entities (Clients, Components).  	 */  	class Entity  {  		public:  +			Entity();  			virtual ~Entity();  			void addPayloadParserFactory(PayloadParserFactory* payloadParserFactory); @@ -30,16 +29,11 @@ namespace Swift {  			void removePayloadSerializer(PayloadSerializer* payloadSerializer);  		protected: -			PayloadParserFactoryCollection* getPayloadParserFactories() { -				return &payloadParserFactories; -			} - -			PayloadSerializerCollection* getPayloadSerializers() { -				return &payloadSerializers; -			} +			PayloadParserFactoryCollection* getPayloadParserFactories(); +			PayloadSerializerCollection* getPayloadSerializers();  		private: -			FullPayloadParserFactoryCollection payloadParserFactories; -			FullPayloadSerializerCollection payloadSerializers; +			FullPayloadParserFactoryCollection* payloadParserFactories; +			FullPayloadSerializerCollection* payloadSerializers;  	};  } diff --git a/Swiften/Entity/GenericPayloadPersister.h b/Swiften/Entity/GenericPayloadPersister.h new file mode 100644 index 0000000..63553de --- /dev/null +++ b/Swiften/Entity/GenericPayloadPersister.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <Swiften/Entity/PayloadPersister.h> +#include <Swiften/Parser/GenericPayloadParserFactory.h> + +namespace Swift { +	template<typename PAYLOAD, typename PARSER, typename SERIALIZER> +	class GenericPayloadPersister : public PayloadPersister { +		public: +			GenericPayloadPersister() { +			} + +		public: +			boost::shared_ptr<PAYLOAD> loadPayloadGeneric(const boost::filesystem::path& path) { +				return boost::dynamic_pointer_cast<PAYLOAD>(loadPayload(path)); +			} + +		protected: +			virtual const PayloadSerializer* getSerializer() const { +				return &serializer; +			} + +			virtual PayloadParser* createParser() const { +				return new PARSER(); +			} + +		private: +			SERIALIZER serializer; +	}; +} diff --git a/Swiften/Entity/PayloadPersister.cpp b/Swiften/Entity/PayloadPersister.cpp new file mode 100644 index 0000000..955135b --- /dev/null +++ b/Swiften/Entity/PayloadPersister.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2011 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/Entity/PayloadPersister.h> + +#include <boost/filesystem/fstream.hpp> +#include <boost/filesystem.hpp> +#include <iostream> + +#include <Swiften/Parser/PayloadParsers/UnitTest/PayloadParserTester.h> +#include <Swiften/Base/ByteArray.h> +#include <Swiften/Parser/PayloadParser.h> +#include <Swiften/Parser/PayloadParserFactory.h> +#include <Swiften/Serializer/PayloadSerializer.h> + +using namespace Swift; + +PayloadPersister::PayloadPersister() { +} + +PayloadPersister::~PayloadPersister() { +} + +void PayloadPersister::savePayload(boost::shared_ptr<Payload> payload, const boost::filesystem::path& path) { +	if (!boost::filesystem::exists(path.parent_path())) { +		try { +			boost::filesystem::create_directories(path.parent_path()); +		} +		catch (const boost::filesystem::filesystem_error& e) { +			std::cerr << "ERROR: " << e.what() << std::endl; +		} +	} +	boost::filesystem::ofstream file(path); +	file << getSerializer()->serialize(payload); +	file.close(); +} + +boost::shared_ptr<Payload> PayloadPersister::loadPayload(const boost::filesystem::path& path) { +	if (boost::filesystem::exists(path)) { +		ByteArray data; +		readByteArrayFromFile(data, path.string()); +		boost::shared_ptr<PayloadParser> parser(createParser()); +		PayloadParserTester tester(parser.get()); +		tester.parse(byteArrayToString(data)); +		return parser->getPayload(); +	} +	else { +		return boost::shared_ptr<Payload>(); +	} +} diff --git a/Swiften/Entity/PayloadPersister.h b/Swiften/Entity/PayloadPersister.h new file mode 100644 index 0000000..ea7c74c --- /dev/null +++ b/Swiften/Entity/PayloadPersister.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2011 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <boost/shared_ptr.hpp> +#include <boost/filesystem/path.hpp> + +namespace Swift { +	class Payload; +	class PayloadSerializer; +	class PayloadParser; + +	class PayloadPersister { +		public:  +			PayloadPersister(); +			virtual ~PayloadPersister(); + +			void savePayload(boost::shared_ptr<Payload>, const boost::filesystem::path&); +			boost::shared_ptr<Payload> loadPayload(const boost::filesystem::path&); + +		protected: + +			virtual const PayloadSerializer* getSerializer() const = 0; +			virtual PayloadParser* createParser() const = 0; +	}; +} | 
 Swift
 Swift