From 07152630c3a9d04dd86f7b370ee30b553665f5c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Wed, 13 Apr 2011 21:46:24 +0200
Subject: Chop off trailing \0 in ByteArray::toString().


diff --git a/Swiften/Base/ByteArray.cpp b/Swiften/Base/ByteArray.cpp
index c3869fc..323c866 100644
--- a/Swiften/Base/ByteArray.cpp
+++ b/Swiften/Base/ByteArray.cpp
@@ -72,4 +72,14 @@ std::vector<unsigned char> ByteArray::create(const unsigned char* c, size_t n) {
 	return data;
 }
 
+std::string ByteArray::toString() const {
+	size_t i;
+	for (i = data_.size(); i > 0; --i) {
+		if (data_[i - 1] != 0) {
+			break;
+		}
+	}
+	return i > 0 ? std::string(reinterpret_cast<const char*>(getData()), i) : "";
+}
+
 }
diff --git a/Swiften/Base/ByteArray.h b/Swiften/Base/ByteArray.h
index d55da1f..ebc22d8 100644
--- a/Swiften/Base/ByteArray.h
+++ b/Swiften/Base/ByteArray.h
@@ -120,9 +120,7 @@ namespace Swift {
 				return data_.end(); 
 			}
 
-			std::string toString() const {
-				return std::string(reinterpret_cast<const char*>(getData()), getSize());
-			}
+			std::string toString() const;
 
 			void readFromFile(const std::string& file);
 
diff --git a/Swiften/Base/UnitTest/ByteArrayTest.cpp b/Swiften/Base/UnitTest/ByteArrayTest.cpp
index b9797d2..069e68e 100644
--- a/Swiften/Base/UnitTest/ByteArrayTest.cpp
+++ b/Swiften/Base/UnitTest/ByteArrayTest.cpp
@@ -8,6 +8,7 @@
 #include <cppunit/extensions/TestFactoryRegistry.h>
 
 #include "Swiften/Base/ByteArray.h"
+#include <boost/lexical_cast.hpp>
 
 using namespace Swift;
 
@@ -17,6 +18,7 @@ class ByteArrayTest : public CppUnit::TestFixture {
 		CPPUNIT_TEST(testToString);
 		CPPUNIT_TEST(testToString_NullTerminated);
 		CPPUNIT_TEST(testToString_TwoNullTerminated);
+		CPPUNIT_TEST(testToString_AllNull);
 		CPPUNIT_TEST_SUITE_END();
 
 	public:
@@ -33,16 +35,22 @@ class ByteArrayTest : public CppUnit::TestFixture {
 		}
 
 		void testToString_NullTerminated() {
-			ByteArray testling(ByteArray::create("abcde\0"));
+			ByteArray testling(ByteArray::create("abcde\0", 6));
 
 			CPPUNIT_ASSERT_EQUAL(std::string("abcde"), testling.toString());
 		}
 
 		void testToString_TwoNullTerminated() {
-			ByteArray testling(ByteArray::create("abcde\0\0"));
+			ByteArray testling(ByteArray::create("abcde\0\0", 7));
 
 			CPPUNIT_ASSERT_EQUAL(std::string("abcde"), testling.toString());
 		}
+
+		void testToString_AllNull() {
+			ByteArray testling(ByteArray::create("\0\0", 2));
+
+			CPPUNIT_ASSERT_EQUAL(std::string(""), testling.toString());
+		}
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(ByteArrayTest);
-- 
cgit v0.10.2-6-g49f6