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

#include <QObject>
#include <QList>
#include <QAbstractSocket>
#include <QMutex>
11 12
#include <unordered_map>
#include <QSet>
13
#include <QList>
14
namespace ZPNetwork{
15
	class zp_net_Engine;
16 17 18 19 20
	/**
	 * @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
丁劲犇 已提交
21 22 23 24
	class zp_netTransThread : public QObject
	{
		Q_OBJECT
	public:
25
		explicit zp_netTransThread(zp_net_Engine * pThreadPool,int nPayLoad = 4096,QObject *parent = 0);
丁劲犇's avatar
丁劲犇 已提交
26 27 28
		QList <QObject *> clientsList();
		int CurrentClients();
		void SetPayload(int nPayload);
29
		bool isActive();
丁劲犇's avatar
丁劲犇 已提交
30

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

35 36 37 38 39
		//RubbishCan Functions
		void Empty_RabishCan();
		//Size of the RubbishCan
		static int RUBBISH_CAN_SIZE;

丁劲犇's avatar
丁劲犇 已提交
40 41 42 43
	private:
		bool m_bActivated;
		bool m_bSSLConnection;
		//sending buffer, hold byteArraies.
44
		std::unordered_map<QObject *,QList<QByteArray> > m_buffer_sending;
丁劲犇's avatar
丁劲犇 已提交
45

46
		std::unordered_map<QObject *,QList<qint64> > m_buffer_sending_offset;
丁劲犇's avatar
丁劲犇 已提交
47
		//The socket and the connection-direction, 0 is passive, 1 is postive.
48
		QSet<QObject*> m_clientList;
丁劲犇's avatar
丁劲犇 已提交
49 50
		int m_nPayLoad;
		QMutex m_mutex_protect;
51
		zp_net_Engine * m_pThreadPool;
52 53
		//Rabish Can
		QList<QObject *> m_rabish_can;
丁劲犇's avatar
丁劲犇 已提交
54
		QSet<QObject *> m_set_rabish;
55 56
		QMutex m_mutex_rabish_can;
		void push_to_rabish_can(QObject * deletedobj);
丁劲犇's avatar
丁劲犇 已提交
57 58 59
	public slots:
		//This slot dealing with multi-thread client socket accept.
		void incomingConnection(QObject * threadid,qintptr socketDescriptor);
60
		//This slot dealing with possive connecting-to method.
丁劲犇's avatar
丁劲犇 已提交
61 62
		void startConnection(QObject * threadid,const QHostAddress & addr, quint16 port);
		//sending dtarray to objClient. dtarray will be pushed into m_buffer_sending
63
		void SendDataToClient(QObject * objClient,QByteArray   dtarray);
丁劲犇's avatar
丁劲犇 已提交
64
		//Set terminate mark, the thread will quit after last client quit.
65
		void Deactivate();
丁劲犇's avatar
丁劲犇 已提交
66 67 68 69 70 71
		//terminate this thread immediately
		void DeactivateImmediately(zp_netTransThread *);
		//Kick all clients .
		void KickAllClients(zp_netTransThread *);
		//Kick client.
		void KickClient(QObject *);
72

丁劲犇's avatar
丁劲犇 已提交
73 74 75 76 77 78
	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
丁劲犇 已提交
79 80
		//Plain Connected
		void on_connected();
丁劲犇's avatar
丁劲犇 已提交
81 82 83
		//SSL Encrypted started
		void on_encrypted();
	signals:
84
		void evt_Message(QObject * psource,QString );
丁劲犇's avatar
丁劲犇 已提交
85 86
		void evt_SocketError(QObject * senderSock ,QAbstractSocket::SocketError socketError);
		void evt_NewClientConnected(QObject * client);
丁劲犇's avatar
丁劲犇 已提交
87
		void evt_ClientEncrypted(QObject * client);
丁劲犇's avatar
丁劲犇 已提交
88
		void evt_ClientDisconnected(QObject * client);
89
		void evt_Data_recieved(QObject * ,QByteArray   );
丁劲犇's avatar
丁劲犇 已提交
90 91
		void evt_Data_transferred(QObject * client,qint64);
	};
92
}
丁劲犇's avatar
丁劲犇 已提交
93
#endif // ZP_NETTRANSTHREAD_H