diff options
| -rw-r--r-- | Swiften/QA/StorageTest/VCardFileStorageTest.cpp | 37 | ||||
| -rw-r--r-- | Swiften/VCards/VCardFileStorage.cpp | 56 | 
2 files changed, 71 insertions, 22 deletions
| diff --git a/Swiften/QA/StorageTest/VCardFileStorageTest.cpp b/Swiften/QA/StorageTest/VCardFileStorageTest.cpp index 992ee50..fb51568 100644 --- a/Swiften/QA/StorageTest/VCardFileStorageTest.cpp +++ b/Swiften/QA/StorageTest/VCardFileStorageTest.cpp @@ -7,6 +7,7 @@  #include <cppunit/extensions/HelperMacros.h>  #include <cppunit/extensions/TestFactoryRegistry.h>  #include <boost/algorithm/string.hpp> +#include <sstream>  #include "Swiften/VCards/VCardFileStorage.h"  #include "Swiften/JID/JID.h" @@ -18,8 +19,12 @@ using namespace Swift;  class VCardFileStorageTest : public CppUnit::TestFixture {  		CPPUNIT_TEST_SUITE(VCardFileStorageTest);  		CPPUNIT_TEST(testSetVCard); +		// Temporarily disabling this, because it generates error messages on console. Need to figure +		// out something for not showing error messages during tests. +		//CPPUNIT_TEST(testSetVCard_LargeFilename);  		CPPUNIT_TEST(testGetVCard);  		CPPUNIT_TEST(testGetVCard_FileDoesNotExist); +		//CPPUNIT_TEST(testGetVCard_LargeFilename);  		CPPUNIT_TEST_SUITE_END();  	public: @@ -48,6 +53,22 @@ class VCardFileStorageTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT(boost::starts_with(data.toString(), "<vCard xmlns=\"vcard-temp\">"));  		} +		void testSetVCard_LargeFilename() { +			std::auto_ptr<VCardFileStorage> testling(createTestling()); +			VCard::ref vcard(new VCard()); +			vcard->setFullName("Alice In Wonderland"); + +			std::ostringstream s; +			for (int i = 0; i < 1000; ++i) { +				s << "_"; +			} + +			JID jid("alice@wonderland.lit/" + s.str()); +			testling->setVCard(jid, vcard); + +			// Just check whether we don't crash +		} +  		void testGetVCard() {  			std::auto_ptr<VCardFileStorage> testling(createTestling());  			VCard::ref vcard(new VCard()); @@ -58,6 +79,22 @@ class VCardFileStorageTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT_EQUAL(std::string("Alice In Wonderland"), result->getFullName());  		} +		void testGetVCard_LargeFilename() { +			std::auto_ptr<VCardFileStorage> testling(createTestling()); +			VCard::ref vcard(new VCard()); +			vcard->setFullName("Alice In Wonderland"); + +			std::ostringstream s; +			for (int i = 0; i < 1000; ++i) { +				s << "_"; +			} +			JID jid("alice@wonderland.lit/" + s.str()); + +			VCard::ref result = testling->getVCard(jid); + +			// Just check that we don't have an exception +		} +  		void testGetVCard_FileDoesNotExist() {  			std::auto_ptr<VCardFileStorage> testling(createTestling());  			VCard::ref result = testling->getVCard(JID("alice@wonderland.lit")); diff --git a/Swiften/VCards/VCardFileStorage.cpp b/Swiften/VCards/VCardFileStorage.cpp index a246838..cd5cc9c 100644 --- a/Swiften/VCards/VCardFileStorage.cpp +++ b/Swiften/VCards/VCardFileStorage.cpp @@ -48,41 +48,53 @@ VCardFileStorage::VCardFileStorage(boost::filesystem::path dir) : vcardsPath(dir  }  boost::shared_ptr<VCard> VCardFileStorage::getVCard(const JID& jid) const { -	boost::filesystem::path vcardPath(getVCardPath(jid)); -	if (boost::filesystem::exists(vcardPath)) { -		ByteArray data; -		data.readFromFile(vcardPath.string()); +	try { +		boost::filesystem::path vcardPath(getVCardPath(jid)); +		if (boost::filesystem::exists(vcardPath)) { +			ByteArray data; +			data.readFromFile(vcardPath.string()); -		VCardParser parser; -		PayloadParserTester tester(&parser); -		tester.parse(data.toString()); -		return boost::dynamic_pointer_cast<VCard>(parser.getPayload()); +			VCardParser parser; +			PayloadParserTester tester(&parser); +			tester.parse(data.toString()); +			return boost::dynamic_pointer_cast<VCard>(parser.getPayload()); +		} +		else { +			return boost::shared_ptr<VCard>(); +		}  	} -	else { +	catch (const boost::filesystem::filesystem_error& e) { +		std::cerr << "ERROR: " << e.what() << std::endl;  		return boost::shared_ptr<VCard>();  	}  }  void VCardFileStorage::setVCard(const JID& jid, VCard::ref v) { -	boost::filesystem::path vcardPath(getVCardPath(jid)); -	if (!boost::filesystem::exists(vcardPath.parent_path())) { -		try { +	try { +		boost::filesystem::path vcardPath(getVCardPath(jid)); +		if (!boost::filesystem::exists(vcardPath.parent_path())) {  			boost::filesystem::create_directories(vcardPath.parent_path());  		} -		catch (const boost::filesystem::filesystem_error& e) { -			std::cerr << "ERROR: " << e.what() << std::endl; -		} +		boost::filesystem::ofstream file(getVCardPath(jid)); +		file << VCardSerializer().serializePayload(v); +		file.close(); +		getAndUpdatePhotoHash(jid, v); +	} +	catch (const boost::filesystem::filesystem_error& e) { +		std::cerr << "ERROR: " << e.what() << std::endl;  	} -	boost::filesystem::ofstream file(getVCardPath(jid)); -	file << VCardSerializer().serializePayload(v); -	file.close(); -	getAndUpdatePhotoHash(jid, v);  }  boost::filesystem::path VCardFileStorage::getVCardPath(const JID& jid) const { -	std::string file(jid.toString()); -	String::replaceAll(file, '/', "%2f"); -	return boost::filesystem::path(vcardsPath / (file + ".xml")); +	try { +		std::string file(jid.toString()); +		String::replaceAll(file, '/', "%2f"); +		return boost::filesystem::path(vcardsPath / (file + ".xml")); +	} +	catch (const boost::filesystem::filesystem_error& e) { +		std::cerr << "ERROR: " << e.what() << std::endl; +		return boost::filesystem::path(); +	}  }  std::string VCardFileStorage::getPhotoHash(const JID& jid) const { | 
 Swift
 Swift