KVIrc 5.2.4
Developer APIs
KviIrcConnection.h
Go to the documentation of this file.
1#ifndef _KVI_IRCCONNECTION_H_
2#define _KVI_IRCCONNECTION_H_
3//=============================================================================
4//
5// File : KviIrcConnection.h
6// Creation date : Mon 03 May 2004 01:45:42 by Szymon Stefanek
7//
8// This file is part of the KVIrc IRC client distribution
9// Copyright (C) 2004-2010 Szymon Stefanek <pragma at kvirc dot net>
10//
11// This program is FREE software. You can redistribute it and/or
12// modify it under the terms of the GNU General Public License
13// as published by the Free Software Foundation; either version 2
14// of the License, or (at your option) any later version.
15//
16// This program is distributed in the HOPE that it will be USEFUL,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19// See the GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program. If not, write to the Free Software Foundation,
23// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24//
25//=============================================================================
26
33#include "kvi_settings.h"
34#include "KviQString.h"
35#include "KviTimeUtils.h"
36
37#include <QByteArray>
38#include <QObject>
39#include <QStringList>
40
41#include <memory>
42#include <utility>
43#include <vector>
44
45class QTimer;
46class QTextCodec;
48class KviIrcNetworkData;
49class KviIrcServer;
50class KviProxy;
51class KviIrcSocket;
52class KviIrcLink;
53class KviDataBuffer;
54class KviIrcContext;
55class KviMainWindow;
57class KviQueryWindow;
68class KviLagMeter;
70class KviDnsResolver;
71class KviUserIdentity;
73class KviCString;
74
96class KVIRC_API KviIrcConnection : public QObject
97{
98 friend class KviConsoleWindow;
99 friend class KviIrcContext;
100 friend class KviIrcLink;
101 friend class KviIrcServerParser;
102 Q_OBJECT
103protected:
123 KviIrcConnection(KviIrcContext * pContext, KviIrcConnectionTarget * pTarget, KviUserIdentity * pIdentity);
124
129
130public:
135 enum State
136 {
139 Connected
140 };
141
142private:
143 KviConsoleWindow * m_pConsole; // shallow, never null
144 KviIrcContext * m_pContext; // shallow, never null
145
146 State m_eState = Idle;
147 bool m_bIdentdAttached = false;
148
149 KviIrcConnectionTarget * m_pTarget; // owned, never null
150
151 KviIrcLink * m_pLink; // owned, never null
152
153 // The initial information about the user we'll send out to the server
154 // Note that the ACTUAL user information are in m_pUserInfo instead
155 KviUserIdentity * m_pUserIdentity; // owned, never null
156
157 // The ACTUAL user information
158 KviIrcConnectionUserInfo * m_pUserInfo; // owned, never null
159 // The ACTUAL server information
161
163
164 std::vector<KviChannelWindow *> m_pChannelList; // elements are borrowed and never null
165 std::vector<KviQueryWindow *> m_pQueryList; // elements are borrowed and never null
166
167 KviIrcUserDataBase * m_pUserDataBase; // owned, never null
168
169 KviNotifyListManager * m_pNotifyListManager = nullptr; // owned, see restartNotifyList()
170 QTimer * m_pNotifyListTimer = nullptr; // delayed startup timer for the notify lists
171
172 KviLagMeter * m_pLagMeter = nullptr; // owned, may be null (when not running)
173
177
178 std::unique_ptr<KviIrcConnectionStatistics> m_pStatistics; // owned, never null
179
180 KviDnsResolver * m_pLocalhostDns = nullptr; // FIXME: this should go to an aux structure
181
182 QTextCodec * m_pSrvCodec; // connection codec: never null
183 QTextCodec * m_pTextCodec; // connection codec: never null
185public:
192 KviConsoleWindow * console() const { return m_pConsole; }
193
200 KviIrcContext * context() const { return m_pContext; }
201
210 KviIrcConnectionTarget * target() const { return m_pTarget; }
211
218 KviIrcLink * link() const { return m_pLink; }
219
224 State state() const { return m_eState; }
225
233 KviIrcUserDataBase * userDataBase() const { return m_pUserDataBase; }
234
246 KviIrcConnectionUserInfo * userInfo() const { return m_pUserInfo; }
247
260 KviIrcConnectionServerInfo * serverInfo() const { return m_pServerInfo; }
261
274 KviIrcConnectionStateData * stateData() const { return m_pStateData; }
275
287 {
288 return m_pAntiCtcpFloodData;
289 }
290
302 {
303 return m_pNetsplitDetectorData;
304 }
305
317 {
318 return m_pAsyncWhoisData;
319 }
320
331 KviIrcConnectionStatistics * statistics() const { return m_pStatistics.get(); }
332
341 {
342 return m_pNotifyListManager;
343 }
344
352 KviLagMeter * lagMeter() const { return m_pLagMeter; }
353
358 KviIrcConnectionRequestQueue * requestQueue() const { return m_pRequestQueue; }
359
366 std::vector<KviChannelWindow *> & channelList() { return m_pChannelList; }
367
372 const QString & currentNetworkName() const;
373
378 const QString & currentNickName() const;
379
384 const QString & currentUserName() const;
385
390 const QString & currentServerName() const;
391
392 //
393 // Channel management
394 //
395 // FIXME: Delegate to a KviChannelManager
396 //
397
406 KviChannelWindow * findChannel(const QString & szName);
407
423 int getCommonChannels(const QString & szNick, QString & szChansBuffer, bool bAddEscapeSequences = true);
424
436 KviChannelWindow * createChannel(const QString & szName);
437
443 void registerChannel(KviChannelWindow * c);
444
450 void unregisterChannel(KviChannelWindow * c);
451
461 void keepChannelsOpenAfterDisconnect();
462
467 void closeAllChannels();
468
473 void closeAllQueries();
474
475 //
476 // Query management
477 //
478 // FIXME: Delegate to a KviQueryManager ?
479 //
480
489 KviQueryWindow * findQuery(const QString & szNick);
490
497 std::vector<KviQueryWindow *> & queryList() { return m_pQueryList; }
498
517
527 KviQueryWindow * createQuery(const QString & szNick, CreateQueryVisibilityMode eVisibilityMode = CreateQueryVisibilityFollowSettings);
528
534 void registerQuery(KviQueryWindow * q);
535
541 void unregisterQuery(KviQueryWindow * q);
542
551 void keepQueriesOpenAfterDisconnect();
552
560 void resurrectDeadQueries();
561
567 void restartLagMeter();
568
569 //
570 // Networking stack public stuff
571 //
572
596 bool sendData(const char * pcBuffer, int iBuflen = -1);
597
623 bool sendFmtData(const char * pcFmt, ...);
624
630 void clearOutputQueue(bool bPrivateMessagesOnly);
631
636 unsigned int outputQueueSize();
637
647 void incomingMessage(const char * pcMessage);
648
657 void incomingMessageNoFilter(const char * pcMessage);
658
659 //
660 // Encoding related stuff
661 //
662
670 QTextCodec * textCodec() const { return m_pTextCodec; }
671
679 QTextCodec * serverCodec() const { return m_pSrvCodec; }
680
693 void setEncoding(const QString & szEncoding);
694
703 QString decodeText(const char * szText);
704
713 QByteArray encodeText(const QString & szText);
714
715protected:
716 //
717 // Notify list management
718 //
719
727 void delayedStartNotifyList();
728
729 //
730 // Login operations
731 //
732
737 void resolveLocalHost();
738
739#ifdef COMPILE_SSL_SUPPORT
740 void handleFailedInitialStartTls();
741 bool trySTARTTLS(bool bAppendPing);
742 void enableStartTlsSupport(bool bEnable);
743#endif
744
754 void useProfileData(KviIdentityProfileSet * pSet, const QString & szNetwork);
755
761 void useRealName(const QString & szRealName);
762
767 void loginToIrcServer();
768
774 void joinChannels(const std::vector<std::pair<QString, QString>> & lChannelsAndPasses);
775
779 void gatherChannelAndPasswordPairs(std::vector<std::pair<QString, QString>> & lChannelsAndPasses);
780
784 void gatherQueryNames(QStringList & lQueryNames);
785
796 QString pickNextLoginNickName(bool bForceDefaultIfPrimaryNicknamesEmpty, const QString & szBaseNickForRandomChoices, QString & szChoiceDescriptionBuffer);
797
798 //
799 // KviIrcServerParser interface
800 //
801
806 void endOfMotdReceived();
807
815 void serverInfoReceived(const QString & szServerName, const QString & szUserModes, const QString & szChanModes);
816
821 void handleAuthenticate(KviCString & szResponse);
822
827 void handleInitialCapLs();
828
833 void handleFailedInitialCapLs();
834
839 void handleInitialCapAck();
840
845 void handleInitialCapNak();
846
851 void endInitialCapNegotiation();
852
858 void changeAwayState(bool bAway);
859
869 void userInfoReceived(const QString & szUserName, const QString & szHostName);
870
876 void nickChange(const QString & szNewNick);
877
884 bool changeUserMode(char cMode, bool bSet);
885
891 void loginComplete(const QString & szNickName);
892
893 //
894 // KviIrcContext interface
895 //
896
904 void start();
905
910 void abort();
911
917 void heartbeat(kvi_time_t tNow);
918
919 //
920 // KviIrcLink interface (down)
921 //
922
928 void linkAttemptFailed(int iError);
929
934 void linkEstablished();
935
940 void linkTerminated();
941
942private:
947 void setupTextCodec();
948
953 void setupSrvCodec();
954public slots:
959 void unhighlightAllChannels();
960
965 void unhighlightAllQueries();
966
971 void restartNotifyList();
972private slots:
977 void hostNameLookupTerminated(KviDnsResolver * pDns);
978signals:
984
990
996
1003
1010
1016};
1017
1018// TODO: KviIdentity
1019
1020#endif //_KVI_IRCCONNECTION_H_
Helper functions for the QString class.
Time management.
#define kvi_time_t
Definition KviTimeUtils.h:43
Definition Idle.h:33
Definition KviCString.h:102
The class which manages a channel.
Definition KviChannelWindow.h:108
Definition KviConsoleWindow.h:74
Definition KviDataBuffer.h:31
The KviDnsResolver class.
Definition KviDnsResolver.h:90
Class which manages the list of identity profiles.
Definition KviIdentityProfileSet.h:45
Definition KviIrcConnectionAntiCtcpFloodData.h:31
Definition KviIrcConnectionAsyncWhoisData.h:64
Definition KviIrcConnectionNetsplitDetectorData.h:33
Class to enqueue commands to IRC server.
Definition KviIrcConnectionRequestQueue.h:48
Definition KviIrcConnectionServerInfo.h:300
Definition KviIrcConnectionStateData.h:41
Definition KviIrcConnectionStatistics.h:32
Definition KviIrcConnectionTarget.h:36
Definition KviIrcConnectionUserInfo.h:33
An abstraction of a connection to an IRC server.
Definition KviIrcConnection.h:97
KviIrcConnectionAntiCtcpFloodData * m_pAntiCtcpFloodData
Definition KviIrcConnection.h:174
KviIrcConnectionNetsplitDetectorData * netsplitDetectorData() const
Returns a pointer to the KviIrcConnectionNetsplitDetectorData object.
Definition KviIrcConnection.h:301
KviIrcConnectionAntiCtcpFloodData * antiCtcpFloodData() const
Returns a pointer to the KviIrcConnectionAntiCtcpFloodData object.
Definition KviIrcConnection.h:286
KviIrcUserDataBase * userDataBase() const
Returns a pointer to the big connection user database.
Definition KviIrcConnection.h:233
KviIrcConnectionRequestQueue * m_pRequestQueue
Definition KviIrcConnection.h:184
KviIrcConnectionAsyncWhoisData * asyncWhoisData() const
Returns a pointer to the KviIrcConnectionAsyncWhoisData object.
Definition KviIrcConnection.h:316
void awayStateChanged()
Emitted when the away state changes.
KviIrcConnectionUserInfo * m_pUserInfo
Definition KviIrcConnection.h:158
void nickNameChanged()
Emitted when the nickname changes.
KviLagMeter * lagMeter() const
Returns a pointer to the current KviLagMeter.
Definition KviIrcConnection.h:352
KviNotifyListManager * notifyListManager() const
Returns a pointer to the current KviNotifyListManager.
Definition KviIrcConnection.h:340
CreateQueryVisibilityMode
Definition KviIrcConnection.h:503
@ CreateQueryVisibilityMinimized
Definition KviIrcConnection.h:507
@ CreateQueryVisibilityVisible
Definition KviIrcConnection.h:511
KviIrcLink * link() const
Returns the underlying KviIrcLink object.
Definition KviIrcConnection.h:218
KviIrcContext * m_pContext
Definition KviIrcConnection.h:144
KviIrcConnectionServerInfo * serverInfo() const
Returns a pointer to the KviIrcConnectionServerInfo object.
Definition KviIrcConnection.h:260
KviIrcConnectionServerInfo * m_pServerInfo
Definition KviIrcConnection.h:160
std::vector< KviChannelWindow * > m_pChannelList
Definition KviIrcConnection.h:164
KviIrcConnectionTarget * target() const
Returns the target of this connection.
Definition KviIrcConnection.h:210
KviIrcLink * m_pLink
Definition KviIrcConnection.h:151
KviIrcConnectionAsyncWhoisData * m_pAsyncWhoisData
Definition KviIrcConnection.h:176
QTextCodec * m_pTextCodec
Definition KviIrcConnection.h:183
void chanListChanged()
Emitted when the channels list change.
State
The possible "high level" states of this connection.
Definition KviIrcConnection.h:136
@ Idle
Definition KviIrcConnection.h:137
@ Connecting
Definition KviIrcConnection.h:138
KviIrcConnectionTarget * m_pTarget
Definition KviIrcConnection.h:149
KviConsoleWindow * m_pConsole
Definition KviIrcConnection.h:143
void userModeChanged()
Emitted when the user modes change.
void channelUnregistered(KviChannelWindow *pChan)
Emitted when we unregister a channel.
QTextCodec * textCodec() const
Returns a pointer to the current global codec for outbound text.
Definition KviIrcConnection.h:670
KviIrcConnectionRequestQueue * requestQueue() const
Returns a pointer to the current KviIrcConnectionRequestQueue.
Definition KviIrcConnection.h:358
std::vector< KviQueryWindow * > m_pQueryList
Definition KviIrcConnection.h:165
KviIrcConnectionStatistics * statistics() const
Returns a pointer to the KviIrcConnectionStatistics object.
Definition KviIrcConnection.h:331
KviIrcConnectionStateData * m_pStateData
Definition KviIrcConnection.h:162
KviIrcConnectionStateData * stateData() const
Returns a pointer to the KviIrcConnectionStateData object.
Definition KviIrcConnection.h:274
State state() const
Returns the current state of the connection.
Definition KviIrcConnection.h:224
KviConsoleWindow * console() const
Returns a pointer to the owning console.
Definition KviIrcConnection.h:192
std::vector< KviQueryWindow * > & queryList()
Returns the list of the currently open queries.
Definition KviIrcConnection.h:497
KviIrcConnectionUserInfo * userInfo() const
Returns a pointer to the KviIrcConnectionUserInfo object.
Definition KviIrcConnection.h:246
QTextCodec * serverCodec() const
Returns a pointer to the current global codec for inbound data.
Definition KviIrcConnection.h:679
KviIrcContext * context() const
Returns a pointer to the owning KviIrcContext.
Definition KviIrcConnection.h:200
KviIrcConnectionNetsplitDetectorData * m_pNetsplitDetectorData
Definition KviIrcConnection.h:175
void channelRegistered(KviChannelWindow *pChan)
Emitted when we register a channel.
QTextCodec * m_pSrvCodec
Definition KviIrcConnection.h:182
KviIrcUserDataBase * m_pUserDataBase
Definition KviIrcConnection.h:167
std::vector< KviChannelWindow * > & channelList()
Returns the list of the channels bound to the current connection.
Definition KviIrcConnection.h:366
std::unique_ptr< KviIrcConnectionStatistics > m_pStatistics
Definition KviIrcConnection.h:178
KviUserIdentity * m_pUserIdentity
Definition KviIrcConnection.h:155
Definition KviIrcContext.h:60
Definition KviIrcServerParser.h:114
The class which manages the irc servers.
Definition KviIrcServer.h:52
This class is the lowest level of the KVIrc networking stack.
Definition KviIrcSocket.h:75
The class which manages the user database.
Definition KviIrcUserDataBase.h:47
Definition KviLagMeter.h:45
Definition KviMainWindow.h:58
Definition KviNotifyList.h:43
Definition KviProxy.h:37
The class which manages a query.
Definition KviQueryWindow.h:50
User identity handling class.
Definition KviUserIdentity.h:45
#define q
Definition detector.cpp:82
This file contains compile time settings.
#define KVIRC_API
Definition kvi_settings.h:127