summaryrefslogtreecommitdiff
path: root/src/net/messageout.h
blob: e158430d6610d1879863515e31c2fc37c6b846f0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 *  The ManaPlus Client
 *  Copyright (C) 2004-2009  The Mana World Development Team
 *  Copyright (C) 2009-2010  The Mana Developers
 *  Copyright (C) 2011-2018  The ManaPlus Developers
 *
 *  This file is part of The ManaPlus Client.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef NET_MESSAGEOUT_H
#define NET_MESSAGEOUT_H

#include "enums/simpletypes/beingid.h"

#include "utils/cast.h"

#include <string>

#include "localconsts.h"

UTILS_CAST_H

#define createOutPacket(name) MessageOut outMsg(name); \
    outMsg.writeInt16(CAST_S16(name), #name)

namespace Net
{

/**
 * Used for building an outgoing message.
 *
 * \ingroup Network
 */
class MessageOut notfinal
{
    public:
        A_DELETE_COPY(MessageOut)

        /**< Writes a byte. */
        virtual void writeInt8(const int8_t value,
                               const char *const str);

        /**< Writes a short. */
        void writeInt16(const int16_t value,
                        const char *const str);

        /**< Writes a long. */
        void writeInt32(const int32_t value,
                        const char *const str);

        void writeItemId(const int32_t value,
                         const char *const str);

        void writeInt64(const int64_t value,
                        const char *const str);

        void writeBeingId(const BeingId value,
                          const char *const str);

        void writeCoordinates(const uint16_t x,
                              const uint16_t y,
                              unsigned char direction,
                              const char *const str);

        /**
         * Writes a string. If a fixed length is not given (-1), it is stored
         * as a short at the start of the string.
         */
        void writeString(const std::string &string,
                         int length,
                         const char *const str);

        /**
         * Writes a string. If a fixed length is not given (-1), it is stored
         * as a short at the start of the string.
         */
        void writeStringNoLog(const std::string &string,
                              int length,
                              const char *const str);

        /**
         * Returns the content of the message.
         */
        const char *getData() const A_WARN_UNUSED;

        /**
         * Returns the length of the data.
         */
        unsigned int getDataSize() const A_WARN_UNUSED;

        virtual ~MessageOut()
        { }

        void resetPos()
        { mPos = 0; }

        static unsigned char toServerDirection(unsigned char direction)
                                               A_CONST;

    protected:
        /**
         * Constructor.
         */
        explicit MessageOut(const int16_t id);

        /**
         * Expand the packet data to be able to hold more data.
         *
         * NOTE: For performance enhancements this method could allocate extra
         * memory in advance instead of expanding size every time more data is
         * added.
         */
        virtual void expand(size_t size) const = 0;

        char *mData;                         /**< Data building up. */
        unsigned int mDataSize;              /**< Size of data. */
        unsigned int mPos;                   /**< Position in the data. */
        uint16_t mId;
        bool mIgnore;
};

}  // namespace Net

#endif  // NET_MESSAGEOUT_H