Added the ByteArray::quote() method to return a string representation of the byte array, and used it to print out the contents of unparseable packets.

Sat, 23 Jul 2016 12:22:23 +0300

author
Teemu Piippo <teemu@compsta2.com>
date
Sat, 23 Jul 2016 12:22:23 +0300
changeset 163
5948441a1951
parent 162
c9c0f1b62e42
child 164
e3794f48a589

Added the ByteArray::quote() method to return a string representation of the byte array, and used it to print out the contents of unparseable packets.

CMakeLists.txt file | annotate | diff | comparison | revisions
sources/list.cpp file | annotate | diff | comparison | revisions
sources/list.h file | annotate | diff | comparison | revisions
sources/network/rconsession.cpp file | annotate | diff | comparison | revisions
--- a/CMakeLists.txt	Sat Jul 23 12:15:52 2016 +0300
+++ b/CMakeLists.txt	Sat Jul 23 12:22:23 2016 +0300
@@ -13,6 +13,7 @@
 set (SOURCE_FILES
 	sources/coloredline.cpp
 	sources/interface.cpp
+	sources/list.cpp
 	sources/main.cpp
 	sources/md5.cpp
 	sources/mystring.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sources/list.cpp	Sat Jul 23 12:22:23 2016 +0300
@@ -0,0 +1,99 @@
+/*
+	Copyright 2016 Teemu Piippo
+	All rights reserved.
+
+	Redistribution and use in source and binary forms, with or without
+	modification, are permitted provided that the following conditions
+	are met:
+
+	1. Redistributions of source code must retain the above copyright
+	   notice, this list of conditions and the following disclaimer.
+	2. Redistributions in binary form must reproduce the above copyright
+	   notice, this list of conditions and the following disclaimer in the
+	   documentation and/or other materials provided with the distribution.
+	3. Neither the name of the copyright holder nor the names of its
+	   contributors may be used to endorse or promote products derived from
+	   this software without specific prior written permission.
+
+	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+	TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+	PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
+	OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+	EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+	PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+	PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+	LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+	NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "list.h"
+#include "mystring.h"
+
+BEGIN_ZFC_NAMESPACE
+
+/*!
+ * \brief Finds a suitable string representation for the provided byte.
+ * \param byte Byte to represent.
+ * \returns the string representation for the byte.
+ */
+const char* representByte(unsigned char byte)
+{
+	static char buffer[8];
+
+	if (byte < 8)
+	{
+		buffer[0] = '\\';
+		buffer[1] = byte + '0';
+		buffer[2] = '\0';
+		return buffer;
+	}
+	else switch(byte)
+	{
+	case '\a': return "\\a";
+	case '\b': return "\\b";
+	case '\t': return "\\t";
+	case '\n': return "\\n";
+	case '\v': return "\\v";
+	case '\f': return "\\f";
+	case '\r': return "\\r";
+	case '\e': return "\\e";
+	case '"': return "\\\"";
+	case '\\': return "\\\\";
+	default:
+		if (isprint(byte))
+		{
+			buffer[0] = byte;
+			buffer[1] = '\0';
+			return buffer;
+		}
+		else
+		{
+			snprintf(buffer, sizeof buffer, "\\x%2x", byte);
+			return buffer;
+		}
+	}
+}
+
+/*!
+ * \brief Constructs a byte array from an initializer list containing bytes.
+ * \param initializerList List of bytes.
+ */
+ByteArray::ByteArray(std::initializer_list<unsigned char> initializerList) :
+	Vector<unsigned char>(initializerList) {}
+
+/*!
+ * \returns a quoted representation of the contents of the byte array.
+ */
+String ByteArray::quote() const
+{
+	String result;
+
+	for (unsigned char byte : *this)
+		result += representByte(byte);
+
+	return "\"" + result + "\"";
+}
+
+END_ZFC_NAMESPACE
--- a/sources/list.h	Sat Jul 23 12:15:52 2016 +0300
+++ b/sources/list.h	Sat Jul 23 12:22:23 2016 +0300
@@ -399,6 +399,23 @@
 	}
 };
 
-typedef Vector<unsigned char> ByteArray;
+class ByteArray : public Vector<unsigned char>
+{
+public:
+	ByteArray(std::initializer_list<unsigned char> initializerList);
+
+	template<typename ...Args>
+	ByteArray(Args&& ...args);
+
+	class String quote() const;
+};
+
+/*!
+ * \brief Constructs a byte array by passing all arguments to Vector<unsigned char>'s constructor.
+ * \param args Arguments to pass.
+ */
+template<typename ...Args>
+ByteArray::ByteArray(Args&& ...args) :
+    Vector<unsigned char>(args...) {}
 
 END_ZFC_NAMESPACE
--- a/sources/network/rconsession.cpp	Sat Jul 23 12:15:52 2016 +0300
+++ b/sources/network/rconsession.cpp	Sat Jul 23 12:22:23 2016 +0300
@@ -226,6 +226,8 @@
 	catch (std::exception& e)
 	{
 		m_interface->printWarning("Couldn't process packet: %s\n", e.what());
+		m_interface->printWarning("Packet contents was: %s\n", message.quote().chars());
+		m_interface->printWarning("Stream position in payload was: %d\n", stream.position());
 	}
 }
 

mercurial