summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorrubidium42 <rubidium@openttd.org>2021-05-02 08:43:11 +0200
committerrubidium42 <rubidium42@users.noreply.github.com>2021-05-03 17:56:05 +0200
commit7bcc472f73c774163285f71c235852ba0911e88e (patch)
treed0ffec49379c66766cb84b1b1e769a878617894f /src/network
parentba409e8c4502cc435d0d3f4bec7ba5f5fe28b658 (diff)
downloadopenttd-7bcc472f73c774163285f71c235852ba0911e88e.tar.xz
Add: [Network] Reading std::string from a packet
Diffstat (limited to 'src/network')
-rw-r--r--src/network/core/packet.cpp29
-rw-r--r--src/network/core/packet.h1
2 files changed, 30 insertions, 0 deletions
diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp
index 6f56e4a56..736970791 100644
--- a/src/network/core/packet.cpp
+++ b/src/network/core/packet.cpp
@@ -397,6 +397,35 @@ void Packet::Recv_string(char *buffer, size_t size, StringValidationSettings set
}
/**
+ * Reads characters (bytes) from the packet until it finds a '\0', or reaches a
+ * maximum of \c length characters.
+ * When the '\0' has not been reached in the first \c length read characters,
+ * more characters are read from the packet until '\0' has been reached. However,
+ * these characters will not end up in the returned string.
+ * The length of the returned string will be at most \c length - 1 characters.
+ * @param length The maximum length of the string including '\0'.
+ * @param settings The string validation settings.
+ * @return The validated string.
+ */
+std::string Packet::Recv_string(size_t length, StringValidationSettings settings)
+{
+ assert(length > 1);
+
+ /* Both loops with Recv_uint8 terminate when reading past the end of the
+ * packet as Recv_uint8 then closes the connection and returns 0. */
+ std::string str;
+ char character;
+ while (--length > 0 && (character = this->Recv_uint8()) != '\0') str.push_back(character);
+
+ if (length == 0) {
+ /* The string in the packet was longer. Read until the termination. */
+ while (this->Recv_uint8() != '\0') {}
+ }
+
+ return str_validate(str, settings);
+}
+
+/**
* Get the amount of bytes that are still available for the Transfer functions.
* @return The number of bytes that still have to be transfered.
*/
diff --git a/src/network/core/packet.h b/src/network/core/packet.h
index 0f58d3be8..21a88e3ea 100644
--- a/src/network/core/packet.h
+++ b/src/network/core/packet.h
@@ -88,6 +88,7 @@ public:
uint32 Recv_uint32();
uint64 Recv_uint64();
void Recv_string(char *buffer, size_t size, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK);
+ std::string Recv_string(size_t length, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK);
size_t RemainingBytesToTransfer() const;