Communi  3.4.0
A cross-platform IRC framework written with Qt
ircconnection.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008-2015 The Communi Project
3 
4  You may use this file under the terms of BSD license as follows:
5 
6  Redistribution and use in source and binary forms, with or without
7  modification, are permitted provided that the following conditions are met:
8  * Redistributions of source code must retain the above copyright
9  notice, this list of conditions and the following disclaimer.
10  * Redistributions in binary form must reproduce the above copyright
11  notice, this list of conditions and the following disclaimer in the
12  documentation and/or other materials provided with the distribution.
13  * Neither the name of the copyright holder nor the names of its
14  contributors may be used to endorse or promote products derived
15  from this software without specific prior written permission.
16 
17  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
21  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 
29 #ifndef IRCCONNECTION_H
30 #define IRCCONNECTION_H
31 
32 #include <IrcGlobal>
33 #include <IrcMessage>
34 #include <IrcNetwork>
35 #include <QtCore/qobject.h>
36 #include <QtCore/qvariant.h>
37 #include <QtCore/qmetatype.h>
38 #include <QtCore/qstringlist.h>
39 #include <QtCore/qscopedpointer.h>
40 #include <QtNetwork/qabstractsocket.h>
41 
42 IRC_BEGIN_NAMESPACE
43 
44 class IrcCommand;
45 class IrcProtocol;
46 class IrcConnectionPrivate;
47 
48 class IRC_CORE_EXPORT IrcConnection : public QObject
49 {
50  Q_OBJECT
51 
52  Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged)
53  Q_PROPERTY(int port READ port WRITE setPort NOTIFY portChanged)
54  Q_PROPERTY(QStringList servers READ servers WRITE setServers NOTIFY serversChanged)
55  Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged)
56  Q_PROPERTY(QString nickName READ nickName WRITE setNickName NOTIFY nickNameChanged)
57  Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
58  Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
59  Q_PROPERTY(QStringList nickNames READ nickNames WRITE setNickNames NOTIFY nickNamesChanged)
60  Q_PROPERTY(QString displayName READ displayName WRITE setDisplayName NOTIFY displayNameChanged)
61  Q_PROPERTY(QVariantMap userData READ userData WRITE setUserData NOTIFY userDataChanged)
62  Q_PROPERTY(QByteArray encoding READ encoding WRITE setEncoding)
63  Q_PROPERTY(Status status READ status NOTIFY statusChanged)
64  Q_PROPERTY(bool active READ isActive NOTIFY statusChanged)
65  Q_PROPERTY(bool connected READ isConnected NOTIFY statusChanged)
66  Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
67  Q_PROPERTY(int reconnectDelay READ reconnectDelay WRITE setReconnectDelay NOTIFY reconnectDelayChanged)
68  Q_PROPERTY(QAbstractSocket* socket READ socket WRITE setSocket)
69  Q_PROPERTY(bool secure READ isSecure WRITE setSecure NOTIFY secureChanged)
70  Q_PROPERTY(bool secureSupported READ isSecureSupported)
71  Q_PROPERTY(QString saslMechanism READ saslMechanism WRITE setSaslMechanism NOTIFY saslMechanismChanged)
72  Q_PROPERTY(QStringList supportedSaslMechanisms READ supportedSaslMechanisms CONSTANT)
73  Q_PROPERTY(IrcNetwork* network READ network CONSTANT)
74  Q_PROPERTY(IrcProtocol* protocol READ protocol WRITE setProtocol)
75  Q_ENUMS(Status)
76 
77 public:
78  explicit IrcConnection(QObject* parent = 0);
79  explicit IrcConnection(const QString& host, QObject* parent = 0);
80  virtual ~IrcConnection();
81 
82  Q_INVOKABLE IrcConnection* clone(QObject *parent = 0) const;
83 
84  QString host() const;
85  void setHost(const QString& host);
86 
87  int port() const;
88  void setPort(int port);
89 
90  QStringList servers() const;
91  void setServers(const QStringList& servers);
92 
93  Q_INVOKABLE static bool isValidServer(const QString& server);
94 
95  QString userName() const;
96  void setUserName(const QString& name);
97 
98  QString nickName() const;
99  void setNickName(const QString& name);
100 
101  QString realName() const;
102  void setRealName(const QString& name);
103 
104  QString password() const;
105  void setPassword(const QString& password);
106 
107  QStringList nickNames() const;
108  void setNickNames(const QStringList& names);
109 
110  QString displayName() const;
111  void setDisplayName(const QString& name);
112 
113  QVariantMap userData() const;
114  void setUserData(const QVariantMap& data);
115 
116  QByteArray encoding() const;
117  void setEncoding(const QByteArray& encoding);
118 
119  enum Status {
126  Error
127  };
128  Status status() const;
129  bool isActive() const;
130  bool isConnected() const;
131  bool isEnabled() const;
132 
133  int reconnectDelay() const;
134  void setReconnectDelay(int seconds);
135 
136  QAbstractSocket* socket() const;
137  void setSocket(QAbstractSocket* socket);
138 
139  bool isSecure() const;
140  void setSecure(bool secure);
141  static bool isSecureSupported();
142 
143  QString saslMechanism() const;
144  void setSaslMechanism(const QString& mechanism);
145 
146  static QStringList supportedSaslMechanisms();
147 
148  IrcNetwork* network() const;
149 
150  IrcProtocol* protocol() const;
151  void setProtocol(IrcProtocol* protocol);
152 
153  void installMessageFilter(QObject* filter);
154  void removeMessageFilter(QObject* filter);
155 
156  void installCommandFilter(QObject* filter);
157  void removeCommandFilter(QObject* filter);
158 
159  Q_INVOKABLE QByteArray saveState(int version = 0) const;
160  Q_INVOKABLE bool restoreState(const QByteArray& state, int version = 0);
161 
162 public Q_SLOTS:
163  void open();
164  void close();
165  void quit(const QString& reason = QString());
166  void setEnabled(bool enabled = true);
167  void setDisabled(bool disabled = true);
168 
169  bool sendCommand(IrcCommand* command);
170  bool sendData(const QByteArray& data);
171  bool sendRaw(const QString& message);
172 
173 Q_SIGNALS:
174  void connecting();
175  void connected();
176  void disconnected();
177  void statusChanged(IrcConnection::Status status);
178  void socketError(QAbstractSocket::SocketError error);
179  void socketStateChanged(QAbstractSocket::SocketState state);
180  void secureError();
181 
182  void nickNameReserved(QString* alternate); // deprecated
183  void nickNameRequired(const QString& reserved, QString* alternate);
184  void channelKeyRequired(const QString& channel, QString* key);
185 
186  void messageReceived(IrcMessage* message);
187 
188  void accountMessageReceived(IrcAccountMessage* message);
189  void awayMessageReceived(IrcAwayMessage* message);
190  void capabilityMessageReceived(IrcCapabilityMessage* message);
191  void errorMessageReceived(IrcErrorMessage* message);
192  void hostChangeMessageReceived(IrcHostChangeMessage* message);
193  void inviteMessageReceived(IrcInviteMessage* message);
194  void joinMessageReceived(IrcJoinMessage* message);
195  void kickMessageReceived(IrcKickMessage* message);
196  void modeMessageReceived(IrcModeMessage* message);
197  void motdMessageReceived(IrcMotdMessage* message);
198  void namesMessageReceived(IrcNamesMessage* message);
199  void nickMessageReceived(IrcNickMessage* message);
200  void noticeMessageReceived(IrcNoticeMessage* message);
201  void numericMessageReceived(IrcNumericMessage* message);
202  void partMessageReceived(IrcPartMessage* message);
203  void pingMessageReceived(IrcPingMessage* message);
204  void pongMessageReceived(IrcPongMessage* message);
205  void privateMessageReceived(IrcPrivateMessage* message);
206  void quitMessageReceived(IrcQuitMessage* message);
207  void topicMessageReceived(IrcTopicMessage* message);
208  void whoisMessageReceived(IrcWhoisMessage* message);
209  void whowasMessageReceived(IrcWhowasMessage* message);
210  void whoReplyMessageReceived(IrcWhoReplyMessage* message);
211 
212  void hostChanged(const QString& host);
213  void portChanged(int port);
214  void serversChanged(const QStringList& servers);
215  void userNameChanged(const QString& name);
216  void nickNameChanged(const QString& name);
217  void realNameChanged(const QString& name);
218  void passwordChanged(const QString& password);
219  void nickNamesChanged(const QStringList& names);
220  void displayNameChanged(const QString& name);
221  void userDataChanged(const QVariantMap& data);
222 
223  void reconnectDelayChanged(int seconds);
224  void enabledChanged(bool enabled);
225  void secureChanged(bool secure);
226  void saslMechanismChanged(const QString& mechanism);
227 
228  void destroyed(IrcConnection* connection);
229 
230 protected Q_SLOTS:
231  virtual IrcCommand* createCtcpReply(IrcPrivateMessage* request) const;
232 
233 private:
234  friend class IrcProtocol;
235  friend class IrcProtocolPrivate;
237  Q_DECLARE_PRIVATE(IrcConnection)
238  Q_DISABLE_COPY(IrcConnection)
239 
240  Q_PRIVATE_SLOT(d_func(), void _irc_connected())
241  Q_PRIVATE_SLOT(d_func(), void _irc_disconnected())
242  Q_PRIVATE_SLOT(d_func(), void _irc_error(QAbstractSocket::SocketError))
243  Q_PRIVATE_SLOT(d_func(), void _irc_state(QAbstractSocket::SocketState))
244  Q_PRIVATE_SLOT(d_func(), void _irc_sslErrors())
245  Q_PRIVATE_SLOT(d_func(), void _irc_reconnect())
246  Q_PRIVATE_SLOT(d_func(), void _irc_readData())
247  Q_PRIVATE_SLOT(d_func(), void _irc_filterDestroyed(QObject*))
248 };
249 
250 #ifndef QT_NO_DEBUG_STREAM
251 IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcConnection::Status status);
252 IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcConnection* connection);
253 #endif // QT_NO_DEBUG_STREAM
254 
255 IRC_END_NAMESPACE
256 
257 Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcConnection*))
258 Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcConnection::Status))
259 
260 #endif // IRCCONNECTION_H
Represents an invite message.
Definition: ircmessage.h:243
Represents a private message.
Definition: ircmessage.h:476
Represents a names list message.
Definition: ircmessage.h:348
Represents a reply message to a WHOIS command.
Definition: ircmessage.h:538
Provides means to establish a connection to an IRC server.
Definition: ircconnection.h:48
Represents a host change message.
Definition: ircmessage.h:225
Provides network information and capability management.
Definition: ircnetwork.h:43
The connection is being established.
Definition: ircconnection.h:122
Represents a reply message to a WHOWAS command.
Definition: ircmessage.h:571
Represents a numeric message.
Definition: ircmessage.h:408
Represents an error message.
Definition: ircmessage.h:209
Represents a quit message.
Definition: ircmessage.h:502
Represents a join message.
Definition: ircmessage.h:263
The connection is being closed.
Definition: ircconnection.h:124
Represents a pong message.
Definition: ircmessage.h:460
Q_INVOKABLE QString version()
Definition: irc.cpp:56
Represents a nick message.
Definition: ircmessage.h:366
Represents a ping message.
Definition: ircmessage.h:444
The connection is inactive.
Definition: ircconnection.h:120
The connection has been established.
Definition: ircconnection.h:123
Provides the most common commands.
Definition: irccommand.h:43
Status
Definition: ircconnection.h:119
The connection has been closed.
Definition: ircconnection.h:125
Represents a kick message.
Definition: ircmessage.h:283
Implements the IRC protocol and provides means for implementing support for custom protocols...
Definition: ircprotocol.h:45
Represents a reply message to a WHO command.
Definition: ircmessage.h:593
Represents a capability message.
Definition: ircmessage.h:191
Represents an account notify message.
Definition: ircmessage.h:155
Represents a part message.
Definition: ircmessage.h:426
Represents a topic message.
Definition: ircmessage.h:518
The base class of all messages.
Definition: ircmessage.h:47
Represents an away message.
Definition: ircmessage.h:171
Represents a mode message.
Definition: ircmessage.h:303
Represents a message of the day.
Definition: ircmessage.h:332
The connection is waiting for a reconnect.
Definition: ircconnection.h:121
void destroyed(QObject *obj)
Represents a notice message.
Definition: ircmessage.h:384