summaryrefslogtreecommitdiff
path: root/src/protocol/fqterm_socket.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocol/fqterm_socket.h')
-rw-r--r--src/protocol/fqterm_socket.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/protocol/fqterm_socket.h b/src/protocol/fqterm_socket.h
new file mode 100644
index 0000000..2d6240b
--- /dev/null
+++ b/src/protocol/fqterm_socket.h
@@ -0,0 +1,196 @@
+/***************************************************************************
+ * fqterm, a terminal emulator for both BBS and *nix. *
+ * Copyright (C) 2008 fqterm development group. *
+ * *
+ * 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 *
+ * (at your option) 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, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. *
+ ***************************************************************************/
+
+#ifndef FQTERM_SOCKET_H
+#define FQTERM_SOCKET_H
+
+// _OS_X_ not defined if i dont include it
+#include <QGlobalStatic>
+
+// different
+#if defined(Q_OS_WIN32) || defined(_OS_WIN32_)
+
+#include <winsock2.h>
+
+#elif defined(Q_OS_BSD4) || defined(_OS_FREEBSD_) \
+ || defined(Q_OS_MACX) || defined(Q_OS_DARWIN)
+
+#include <netdb.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#else
+
+#include <netdb.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <arpa/inet.h>
+
+#endif
+
+#include <QAbstractSocket>
+#include <QString>
+#include <QStringList>
+#include <QProcess>
+
+class QTcpSocket;
+namespace FQTerm {
+/*
+ * Socket with proxy support.
+ *
+ */
+class FQTermSocketPrivate: public QObject {
+
+ Q_OBJECT;
+ public:
+ FQTermSocketPrivate(QObject *parent_ = 0);
+
+ ~FQTermSocketPrivate();
+
+ void flush();
+ void setProxy(int nProxyType, bool bAuth, const QString &strProxyHost,
+ quint16 uProxyPort, const QString &strProxyUsr,
+ const QString &strProxyPwd);
+ void connectToHost(const QString &hostname, quint16 portnumber);
+ void close();
+ QByteArray readBlock(unsigned long maxlen);
+ long writeBlock(const QByteArray &data);
+ unsigned long bytesAvailable();
+
+ signals:
+ void connected();
+ void hostFound();
+ void connectionClosed();
+ void delayedCloseFinished();
+ void readyRead();
+ void error(QAbstractSocket::SocketError);
+ void socketState(int);
+
+ protected slots:
+ void socketConnected();
+ void socketReadyRead();
+
+ protected:
+ // socks5 function
+ void socks5_connect();
+ void socks5_auth();
+ void socks5_reply(const QByteArray &, int);
+
+ private:
+ // proxy
+ int proxy_type;
+ QString proxy_host;
+ QString proxy_usr;
+ quint16 proxy_port;
+ QString proxy_pwd;
+ QString host;
+ quint16 port;
+ int proxy_state;
+ bool bauth;
+
+ struct sockaddr_in addr_host;
+
+ QTcpSocket *m_socket;
+};
+
+// Virtual base class for FQTermTelnetSocket and FQTermSSHSocket
+class FQTermSocket: public QObject {
+
+ Q_OBJECT;
+ public:
+ FQTermSocket(QObject *parent = 0): QObject(parent) {}
+
+ virtual ~FQTermSocket() {}
+
+ virtual void flush() = 0;
+ virtual void setProxy(int nProxyType, bool bAuth,
+ const QString &strProxyHost,
+ quint16 uProxyPort,
+ const QString &strProxyUsr,
+ const QString &strProxyPwd) = 0;
+ virtual void connectToHost(const QString &host, quint16 port) = 0;
+ virtual void close() = 0;
+ virtual QByteArray readBlock(unsigned long maxlen) = 0;
+ virtual long writeBlock(const QByteArray &data) = 0;
+ virtual unsigned long bytesAvailable() = 0;
+ virtual bool readyForInput() {return true;}
+ virtual bool setTermSize(int col, int row) {return 0;}
+ signals:
+ void sshAuthOK();
+ void connected();
+ void hostFound();
+ void connectionClosed();
+ void delayedCloseFinished();
+ void readyRead();
+ void error(QAbstractSocket::SocketError);
+ void errorMessage(QString);
+ void socketState(int);
+ void requestUserPwd(QString *user, QString *pwd, bool *isOK);
+};
+
+class FQTermTelnetSocket: public FQTermSocket {
+ private:
+ FQTermSocketPrivate *private_socket_;
+
+ public:
+ FQTermTelnetSocket();
+
+ ~FQTermTelnetSocket();
+
+ void flush();
+ void setProxy(int nProxyType, bool bAuth, const QString &strProxyHost,
+ quint16 uProxyPort, const QString &strProxyUsr,
+ const QString &strProxyPwd);
+ void connectToHost(const QString &host, quint16 port);
+ void close();
+ QByteArray readBlock(unsigned long maxlen);
+ long writeBlock(const QByteArray &data);
+ unsigned long bytesAvailable();
+};
+
+class FQTermLocalSocket: public FQTermSocket {
+ Q_OBJECT;
+private:
+ QString shell_bin_;
+ QProcess* shell_process_;
+public:
+ FQTermLocalSocket(const QString& shell_bin);
+ ~FQTermLocalSocket();
+ void flush(){}
+ void setProxy(int nProxyType, bool bAuth, const QString &strProxyHost,
+ quint16 uProxyPort, const QString &strProxyUsr,
+ const QString &strProxyPwd){}
+ void connectToHost(const QString &host, quint16 port);
+ void close();
+ QByteArray readBlock(unsigned long maxlen);
+ long writeBlock(const QByteArray &data);
+ unsigned long bytesAvailable();
+
+public slots:
+ void stateChanged(QProcess::ProcessState newState);
+ void finished (int exitCode, QProcess::ExitStatus exitStatus);
+};
+
+
+
+} // namespace FQTerm
+
+#endif // FQTERM_SOCKET_H