fixing crash on disconnect
[quassel.git] / src / client / clientsyncer.h
index 95aee59..aa8d786 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel IRC Team                         *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#ifndef _CLIENTSYNCER_H_
-#define _CLIENTSYNCER_H_
+#ifndef CLIENTSYNCER_H_
+#define CLIENTSYNCER_H_
 
 #include <QPointer>
 #include <QString>
-#include <QTcpSocket>
 #include <QVariantMap>
 
+#ifdef HAVE_SSL
+#  include <QSslSocket>
+#else
+#  include <QTcpSocket>
+#endif
+
+#include "types.h"
+
 class IrcUser;
 class IrcChannel;
+class SignalProxy;
 
 class ClientSyncer : public QObject {
   Q_OBJECT
 
-  public:
-    ClientSyncer(QObject *parent = 0);
-    ~ClientSyncer();
-
-  signals:
-    void recvPartialItem(quint32 avail, quint32 size);
-    void connectionError(const QString &errorMsg);
-    void connectionMsg(const QString &msg);
-    void sessionProgress(quint32 part, quint32 total);
-    void networksProgress(quint32 part, quint32 total);
-    void channelsProgress(quint32 part, quint32 total);
-    void ircUsersProgress(quint32 part, quint32 total);
-    void socketStateChanged(QAbstractSocket::SocketState);
-    void socketDisconnected();
-
-    void startLogin();
-    void loginFailed(const QString &error);
-    void loginSuccess();
-    void syncFinished();
-    void startCoreSetup(const QVariantList &);
-    void coreSetupSuccess();
-    void coreSetupFailed(const QString &error);
-
-
-  public slots:
-    void connectToCore(const QVariantMap &);
-    void loginToCore(const QString &user, const QString &passwd);
-    void disconnectFromCore();
-
-  private slots:
-    void coreSocketError(QAbstractSocket::SocketError);
-    void coreHasData();
-    void coreSocketConnected();
-    void coreSocketDisconnected();
-
-    void clientInitAck(const QVariantMap &msg);
+public:
+  ClientSyncer(QObject *parent = 0);
+  ~ClientSyncer();
+
+  inline const QIODevice *currentDevice() { return _socket; }
+
+signals:
+  void recvPartialItem(quint32 avail, quint32 size);
+  void connectionError(const QString &errorMsg);
+  void connectionWarnings(const QStringList &warnings);
+  void connectionMsg(const QString &msg);
+  void sessionProgress(quint32 part, quint32 total);
+  void networksProgress(quint32 part, quint32 total);
+  void socketStateChanged(QAbstractSocket::SocketState);
+  void socketDisconnected();
+
+  void startLogin();
+  void loginFailed(const QString &error);
+  void loginSuccess();
+  void syncFinished();
+  void startCoreSetup(const QVariantList &);
+  void coreSetupSuccess();
+  void coreSetupFailed(const QString &error);
+
+  void encrypted(); // relaying encrypted signal of the encapsulated SslSocket
+
+  void startInternalCore(ClientSyncer *syncer);
+  void connectToInternalCore(SignalProxy *proxy);
+
+  void handleIgnoreWarnings(bool permanently);
+
+public slots:
+  void connectToCore(const QVariantMap &);
+  void loginToCore(const QString &user, const QString &passwd);
+  void disconnectFromCore();
+  void useInternalCore();
+
+  inline void ignoreWarnings(bool permanently) { emit handleIgnoreWarnings(permanently); }
+
+private slots:
+  void coreSocketError(QAbstractSocket::SocketError);
+  void coreHasData();
+  void coreSocketConnected();
+  void coreSocketDisconnected();
+
+  void clientInitAck(const QVariantMap &msg);
 
   // for sync progress
-    void networkInitDone();
-    void ircUserAdded(IrcUser *);
-    void ircUserRemoved(QObject *);
-    void ircUserInitDone(IrcUser *);
-    void ircChannelAdded(IrcChannel *);
-    void ircChannelRemoved(QObject *);
-    void ircChannelInitDone(IrcChannel *);
-    void checkSyncState();
+  void networkInitDone();
+  void checkSyncState();
+
+  void syncToCore(const QVariantMap &sessionState);
+  void internalSessionStateReceived(const QVariant &packedState);
+  void sessionStateReceived(const QVariantMap &state);
 
-    void syncToCore(const QVariantMap &sessionState);
-    void sessionStateReceived(const QVariantMap &state);
+  void connectionReady();
+  void doCoreSetup(const QVariant &setupData);
 
-    void doCoreSetup(const QVariant &setupData);
+  void setWarningsHandler(const char *slot);
+  void resetWarningsHandler();
+  void resetConnection();
+
+#ifdef HAVE_SSL
+  void ignoreSslWarnings(bool permanently);
+  void sslSocketEncrypted();
+  void sslErrors(const QList<QSslError> &errors);
+#endif
 
-  private:
-    QPointer<QIODevice> socket;
-    quint32 blockSize;
-    QVariantMap coreConnectionInfo;
+private:
+  QPointer<QIODevice> _socket;
+  quint32 _blockSize;
 
-    QSet<QObject *> netsToSync, channelsToSync, usersToSync;
-    int numNetsToSync, numChannelsToSync, numUsersToSync;
+  QVariantMap coreConnectionInfo;
+  QVariantMap _coreMsgBuffer;
 
+  QSet<QObject *> netsToSync;
+  int numNetsToSync;
 };
 
 #endif