zp_nettransthread.h 2.8 KB
Newer Older
1 2 3
/**
 * @brief class zp_netTransThread by goldenhawking, 2013,2014
 */
丁劲犇's avatar
丁劲犇 已提交
4 5 6 7 8 9 10 11
#ifndef ZP_NETTRANSTHREAD_H
#define ZP_NETTRANSTHREAD_H

#include <QObject>
#include <QMap>
#include <QList>
#include <QAbstractSocket>
#include <QMutex>
12
namespace ZPNetwork{
13
	class zp_net_Engine;
14 15 16 17 18
	/**
	 * @brief class zp_netTransThread is a QObject-derived object class.
	 * Objects of this type will be binded to a QThread, in which TCP transfer
	 * will work
	 */
丁劲犇's avatar
丁劲犇 已提交
19 20 21 22
	class zp_netTransThread : public QObject
	{
		Q_OBJECT
	public:
23
		explicit zp_netTransThread(zp_net_Engine * pThreadPool,int nPayLoad = 4096,QObject *parent = 0);
丁劲犇's avatar
丁劲犇 已提交
24

丁劲犇's avatar
丁劲犇 已提交
25 26 27
		QList <QObject *> clientsList();
		int CurrentClients();
		void SetPayload(int nPayload);
28
		bool isActive();
丁劲犇's avatar
丁劲犇 已提交
29

丁劲犇's avatar
丁劲犇 已提交
30
		bool CanExit();
31 32
		bool SSLConnection();
		void SetSSLConnection(bool bssl);
丁劲犇's avatar
丁劲犇 已提交
33

丁劲犇's avatar
丁劲犇 已提交
34 35 36 37 38
	private:
		bool m_bActivated;
		bool m_bSSLConnection;
		//sending buffer, hold byteArraies.
		QMap<QObject *,QList<QByteArray> > m_buffer_sending;
丁劲犇's avatar
丁劲犇 已提交
39

丁劲犇's avatar
丁劲犇 已提交
40
		QMap<QObject *,QList<qint64> > m_buffer_sending_offset;
丁劲犇's avatar
丁劲犇 已提交
41
		//The socket and the connection-direction, 0 is passive, 1 is postive.
丁劲犇's avatar
丁劲犇 已提交
42 43 44
		QMap<QObject*,int> m_clientList;
		int m_nPayLoad;
		QMutex m_mutex_protect;
45
		zp_net_Engine * m_pThreadPool;
丁劲犇's avatar
丁劲犇 已提交
46 47 48
	public slots:
		//This slot dealing with multi-thread client socket accept.
		void incomingConnection(QObject * threadid,qintptr socketDescriptor);
49
		//This slot dealing with possive connecting-to method.
丁劲犇's avatar
丁劲犇 已提交
50 51 52 53 54 55
		void startConnection(QObject * threadid,const QHostAddress & addr, quint16 port);
		//sending dtarray to objClient. dtarray will be pushed into m_buffer_sending
		void SendDataToClient(QObject * objClient,const QByteArray &  dtarray);
		//Broadcast dtarray to every client except objFromClient itself
		void BroadcastData(QObject * objFromClient,const QByteArray &  dtarray);
		//Set terminate mark, the thread will quit after last client quit.
56
		void Deactivate();
丁劲犇's avatar
丁劲犇 已提交
57 58 59 60 61 62
		//terminate this thread immediately
		void DeactivateImmediately(zp_netTransThread *);
		//Kick all clients .
		void KickAllClients(zp_netTransThread *);
		//Kick client.
		void KickClient(QObject *);
63

丁劲犇's avatar
丁劲犇 已提交
64 65 66 67 68 69
	protected slots:
		//when client closed, this slot will be activated.
		void client_closed();
		void new_data_recieved();
		void some_data_sended(qint64);
		void displayError(QAbstractSocket::SocketError socketError);
丁劲犇's avatar
丁劲犇 已提交
70 71
		//Plain Connected
		void on_connected();
丁劲犇's avatar
丁劲犇 已提交
72 73 74
		//SSL Encrypted started
		void on_encrypted();
	signals:
丁劲犇's avatar
丁劲犇 已提交
75
		void evt_Message(QObject * psource,const QString &);
丁劲犇's avatar
丁劲犇 已提交
76 77
		void evt_SocketError(QObject * senderSock ,QAbstractSocket::SocketError socketError);
		void evt_NewClientConnected(QObject * client);
丁劲犇's avatar
丁劲犇 已提交
78
		void evt_ClientEncrypted(QObject * client);
丁劲犇's avatar
丁劲犇 已提交
79 80 81 82
		void evt_ClientDisconnected(QObject * client);
		void evt_Data_recieved(QObject * ,const QByteArray &  );
		void evt_Data_transferred(QObject * client,qint64);
	};
83
}
丁劲犇's avatar
丁劲犇 已提交
84
#endif // ZP_NETTRANSTHREAD_H