ssl: Use QSslSocket directly to avoid redundant qobject_casts
[quassel.git] / src / common / message.h
1 /***************************************************************************
2  *   Copyright (C) 2005-2020 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
19  ***************************************************************************/
20
21 #pragma once
22
23 #include "common-export.h"
24
25 #include <QCoreApplication>
26 #include <QDateTime>
27
28 #include "bufferinfo.h"
29 #include "types.h"
30
31 class COMMON_EXPORT Message
32 {
33     Q_DECLARE_TR_FUNCTIONS(Message)
34
35 public:
36     /** The different types a message can have for display */
37     enum Type
38     {
39         Plain        = 0x00001,
40         Notice       = 0x00002,
41         Action       = 0x00004,
42         Nick         = 0x00008,
43         Mode         = 0x00010,
44         Join         = 0x00020,
45         Part         = 0x00040,
46         Quit         = 0x00080,
47         Kick         = 0x00100,
48         Kill         = 0x00200,
49         Server       = 0x00400,
50         Info         = 0x00800,
51         Error        = 0x01000,
52         DayChange    = 0x02000,
53         Topic        = 0x04000,
54         NetsplitJoin = 0x08000,
55         NetsplitQuit = 0x10000,
56         Invite       = 0x20000,
57     };
58     Q_DECLARE_FLAGS(Types, Type)
59
60     // DO NOT CHANGE without knowing what you do, some of these flags are stored in the database
61     enum Flag
62     {
63         None       = 0x00,
64         Self       = 0x01,
65         Highlight  = 0x02,
66         Redirected = 0x04,
67         ServerMsg  = 0x08,
68         StatusMsg  = 0x10,
69         Backlog    = 0x80
70     };
71     Q_DECLARE_FLAGS(Flags, Flag)
72
73     Message(BufferInfo bufferInfo = BufferInfo(),
74             Type type = Plain,
75             QString contents = {},
76             QString sender = {},
77             QString senderPrefixes = {},
78             QString realName = {},
79             QString avatarUrl = {},
80             Flags flags = None);
81     Message(QDateTime ts,
82             BufferInfo buffer = BufferInfo(),
83             Type type = Plain,
84             QString contents = {},
85             QString sender = {},
86             QString senderPrefixes = {},
87             QString realName = {},
88             QString avatarUrl = {},
89             Flags flags = None);
90
91     inline static Message ChangeOfDay(const QDateTime& day) { return Message(day, BufferInfo(), DayChange); }
92     inline const MsgId& msgId() const { return _msgId; }
93     inline void setMsgId(MsgId id) { _msgId = id; }
94
95     inline const BufferInfo& bufferInfo() const { return _bufferInfo; }
96     inline const BufferId& bufferId() const { return _bufferInfo.bufferId(); }
97     inline void setBufferId(BufferId id) { _bufferInfo.setBufferId(id); }
98     inline const QString& contents() const { return _contents; }
99     inline const QString& sender() const { return _sender; }
100     inline const QString& senderPrefixes() const { return _senderPrefixes; }
101     inline const QString& realName() const { return _realName; }
102     inline const QString& avatarUrl() const { return _avatarUrl; }
103     inline Type type() const { return _type; }
104     inline Flags flags() const { return _flags; }
105     inline void setFlags(Flags flags) { _flags = flags; }
106     inline const QDateTime& timestamp() const { return _timestamp; }
107
108     inline bool isValid() const { return _msgId.isValid(); }
109
110     inline bool operator<(const Message& other) const { return _msgId < other._msgId; }
111
112 private:
113     QDateTime _timestamp;
114     MsgId _msgId;
115     BufferInfo _bufferInfo;
116     QString _contents;
117     QString _sender;
118     QString _senderPrefixes;
119     QString _realName;
120     QString _avatarUrl;
121     Type _type;
122     Flags _flags;
123
124     friend QDataStream& operator>>(QDataStream& in, Message& msg);
125 };
126
127 using MessageList = QList<Message>;
128
129 QDataStream& operator<<(QDataStream& out, const Message& msg);
130 QDataStream& operator>>(QDataStream& in, Message& msg);
131 QDebug operator<<(QDebug dbg, const Message& msg);
132
133 Q_DECLARE_METATYPE(Message)
134 Q_DECLARE_OPERATORS_FOR_FLAGS(Message::Types)
135 Q_DECLARE_OPERATORS_FOR_FLAGS(Message::Flags)