# HG changeset patch # User Teemu Piippo # Date 1469265743 -10800 # Node ID 5948441a1951ccc95b1bf760516991fd185ab89c # Parent c9c0f1b62e42234cf32eecb9159abf08c7de7a25 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. diff -r c9c0f1b62e42 -r 5948441a1951 CMakeLists.txt --- 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 diff -r c9c0f1b62e42 -r 5948441a1951 sources/list.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 initializerList) : + Vector(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 diff -r c9c0f1b62e42 -r 5948441a1951 sources/list.h --- 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 ByteArray; +class ByteArray : public Vector +{ +public: + ByteArray(std::initializer_list initializerList); + + template + ByteArray(Args&& ...args); + + class String quote() const; +}; + +/*! + * \brief Constructs a byte array by passing all arguments to Vector's constructor. + * \param args Arguments to pass. + */ +template +ByteArray::ByteArray(Args&& ...args) : + Vector(args...) {} END_ZFC_NAMESPACE diff -r c9c0f1b62e42 -r 5948441a1951 sources/network/rconsession.cpp --- 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()); } }