swift
multiplayerpacketparser.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2014 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #ifndef SWIFT_SIMPLUGIN_FS9_MP_PACKET_PARSER_H
5 #define SWIFT_SIMPLUGIN_FS9_MP_PACKET_PARSER_H
6 
7 #include <tuple>
8 
9 #include <QByteArray>
10 #include <QDebug>
11 #include <QString>
12 #include <QtGlobal>
13 
14 #include "fs9.h"
15 
17 
18 namespace swift::simplugin::fs9
19 {
20  namespace Private
21  {
22  // Inhibit doxygen warnings about missing documentation
24 
25  // overload the following two for types that need special treatment
26  template <typename Value>
27  QByteArray readValue(const QByteArray &data, Value &val)
28  {
29  static_assert(std::is_arithmetic<Value>::value || std::is_same<CFs9Sdk::EngineType, Value>::value,
30  "Unsupported type");
31 
32  val = *reinterpret_cast<const Value *>(data.constData());
33  return data.mid(sizeof(Value));
34  }
35 
36  template <typename Value>
37  QByteArray writeValue(QByteArray data, const Value &value)
38  {
39  static_assert(std::is_arithmetic<Value>::value || std::is_same<CFs9Sdk::EngineType, Value>::value,
40  "Unsupported type");
41 
42  data.append(reinterpret_cast<const char *>(&value), sizeof(Value));
43  return data;
44  }
45 
46  QByteArray readValue(const QByteArray &data, QString &val);
47 
48  QByteArray writeValue(QByteArray data, const QString &value);
49 
50  template <typename MessageTuple, quint32 Size = std::tuple_size<MessageTuple>::value>
51  struct Serializer;
52 
53  template <typename MsgTuple>
54  struct Serializer<MsgTuple, 0>
55  {
56  static const QByteArray &read(const QByteArray &data, MsgTuple &) { return data; }
57  static QByteArray write(const QByteArray &data, const MsgTuple &) { return data; }
58  };
59 
60  template <typename MessageTuple, quint32 Size>
61  struct Serializer
62  {
63  static QByteArray read(const QByteArray &data, MessageTuple &messageTuple)
64  {
65  return readValue(Serializer<MessageTuple, Size - 1>::read(data, messageTuple),
66  std::get<Size - 1>(messageTuple));
67  }
68  static QByteArray write(QByteArray &data, const MessageTuple &messageTuple)
69  {
70  return writeValue(Serializer<MessageTuple, Size - 1>::write(data, messageTuple),
71  std::get<Size - 1>(messageTuple));
72  }
73  };
74 
75  template <class MessageTuple>
76  inline QByteArray doReadMessage(const QByteArray &data, MessageTuple messageTuple)
77  {
78  return Serializer<MessageTuple>::read(data, messageTuple);
79  }
80 
81  template <class MessageTuple>
82  inline QByteArray doWriteMessage(QByteArray &data, const MessageTuple &messageTuple)
83  {
84  return Serializer<MessageTuple>::write(data, messageTuple);
85  }
86 
88  } // namespace Private
89 
92  {
93  public:
95  template <class Message>
96  static QByteArray readMessage(const QByteArray &data, Message &message)
97  {
98  return Private::doReadMessage(data.mid(2 * sizeof(qint32)), message.getTuple());
99  }
100 
102  template <class Message>
103  static QByteArray writeMessage(QByteArray &data, const Message &message)
104  {
105  return Private::doWriteMessage(data, message.getTuple());
106  }
107 
109  static CFs9Sdk::MULTIPLAYER_PACKET_ID readType(const QByteArray &data)
110  {
111  QByteArray type = data.left(sizeof(CFs9Sdk::MULTIPLAYER_PACKET_ID));
112  const quint32 *val = reinterpret_cast<const quint32 *>(type.constData());
113  return static_cast<CFs9Sdk::MULTIPLAYER_PACKET_ID>(*val);
114  }
115 
117  static qint32 readSize(const QByteArray &data)
118  {
119  return *reinterpret_cast<const qint32 *>(data.mid(sizeof(qint32), sizeof(qint32)).constData());
120  }
121 
123  static void writeType(QByteArray &data, CFs9Sdk::MULTIPLAYER_PACKET_ID type)
124  {
125  data.append(reinterpret_cast<const char *>(&type), sizeof(CFs9Sdk::MULTIPLAYER_PACKET_ID));
126  }
127 
129  static void writeSize(QByteArray &data, qint32 size)
130  {
131  data.append(reinterpret_cast<const char *>(&size), sizeof(qint32));
132  }
133  };
134 } // namespace swift::simplugin::fs9
135 
136 #endif // SWIFT_SIMPLUGIN_FS9_MP_PACKET_PARSER_H
MULTIPLAYER_PACKET_ID
Multiplayer packet id.
Definition: fs9.h:37
FS9 multiplayer protocol packet parser.
static qint32 readSize(const QByteArray &data)
Read the multiplayer packet size.
static void writeSize(QByteArray &data, qint32 size)
Write the multiplayer packet size.
static QByteArray writeMessage(QByteArray &data, const Message &message)
Write message to byte stream.
static CFs9Sdk::MULTIPLAYER_PACKET_ID readType(const QByteArray &data)
Read the multiplayer packet type.
static void writeType(QByteArray &data, CFs9Sdk::MULTIPLAYER_PACKET_ID type)
Write the multiplayer packet type.
static QByteArray readMessage(const QByteArray &data, Message &message)
Read message from byte stream.