zp_net_threadpool.h 3.9 KB
Newer Older
丁劲犇's avatar
UTF-8  
丁劲犇 已提交
1
/**
丁劲犇's avatar
丁劲犇 已提交
2 3
  * @brief This is the Zoom-Pipeline Network engine by goldenhawking, 2013,2014
  */
丁劲犇's avatar
丁劲犇 已提交
4 5 6 7 8 9 10 11 12
#ifndef ZP_NET_THREADPOOL_H
#define ZP_NET_THREADPOOL_H

#include <QObject>
#include <QThread>
#include <QMap>
#include <QVector>
#include <QMutex>
#include <QThread>
13 14 15
#include <QSslCertificate>
#include <QSslKey>
#include <QFile>
丁劲犇's avatar
丁劲犇 已提交
16 17
#include "zp_netlistenthread.h"
#include "zp_nettransthread.h"
18 19 20

namespace ZPNetwork{

丁劲犇's avatar
丁劲犇 已提交
21
	/**
22
	  * @brief zp_net_Engine provides a  multi-thread listening\transfer network
丁劲犇's avatar
丁劲犇 已提交
23 24
	  * framework. SSL and Plain sockets are both supported.
	  */
25
	class zp_net_Engine : public QObject
丁劲犇's avatar
丁劲犇 已提交
26 27 28
	{
		Q_OBJECT
	public:
29
		explicit zp_net_Engine(int nPayLoad = 4096,QObject *parent = 0);
丁劲犇's avatar
丁劲犇 已提交
30 31 32

		//Listening Ctrl
		//Begin a listening socket at special address and port. The socket will be activated as soon as possible
33
		void AddListeningAddress(QString  id,const QHostAddress & address , quint16 nPort,bool bSSLConn = true);
丁劲犇's avatar
丁劲犇 已提交
34
		//Remove a listening socket at special address and port.The socket will be deactivated as soon as possible
35
		void RemoveListeningAddress(QString  id);
丁劲犇's avatar
丁劲犇 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
		//Remove all listening sockets
		void RemoveAllAddresses();


		//Trans Control
		//Add n client-Trans Thread(s).
		void AddClientTransThreads(int nThreads,bool bSSL=true);
		//Remove n client-Trans Thread(s).a thread marked reomved will be terminated after its last client socket exited.
		void RemoveClientTransThreads(int nThreads,bool bSSL=true);
		//Kick All Clients
		void KickAllClients();
		//Deactive Immediately
		void DeactiveImmediately();


		//when Program exit, wait for close;
		bool CanExit();

		//The status
		QStringList ListenerNames();
		int TransThreadNum();
		int TransThreadNum(bool bSSL);
		int totalClients(int idxThread);

	protected:
		int m_nPayLoad;
		//QMutex m_mutex_listen;
		//QMutex m_mutex_trans;
		//This map stores listenThreadObjects
		QMap<QString,zp_netListenThread *> m_map_netListenThreads;
		//Internal Threads to hold each listenThreadObjects' message Queue
		QMap<QString,QThread *> m_map_netInternalListenThreads;

		//This map stores ClientTransThreadObjects
		QVector<zp_netTransThread *> m_vec_NetTransThreads;
		//Internal Threads to hold each m_map_NetTransThreads' message Queue
		QVector<QThread *> m_vec_netInternalTransThreads;
		bool TransThreadDel(zp_netTransThread * pThreadObj);
	signals:
丁劲犇's avatar
丁劲犇 已提交
75

76
		void evt_Message(QObject * pSource,QString );
丁劲犇's avatar
丁劲犇 已提交
77 78 79 80
		//The socket error message
		void evt_SocketError(QObject * senderSock ,QAbstractSocket::SocketError socketError);
		//this event indicates new client connected.
		void evt_NewClientConnected(QObject * /*clientHandle*/);
丁劲犇's avatar
丁劲犇 已提交
81 82
		//SSL Connections OK
		void evt_ClientEncrypted(QObject * client);
丁劲犇's avatar
丁劲犇 已提交
83 84 85
		//this event indicates a client disconnected.
		void evt_ClientDisconnected(QObject * /*clientHandle*/);
		//some data arrival
86
		void evt_Data_recieved(QObject *  /*clientHandle*/,QByteArray  /*datablock*/ );
丁劲犇's avatar
丁劲犇 已提交
87 88 89 90 91
		//a block of data has been successfuly sent
		void evt_Data_transferred(QObject *   /*clientHandle*/,qint64 /*bytes sent*/);

		//Internal Message for ctrl.------------------------------------
		//Listen Control
92 93
		void startListen(QString  id);
		void stopListen(QString  id);
丁劲犇's avatar
丁劲犇 已提交
94 95 96
		void evt_EstablishConnection(QObject * threadid,qintptr socketDescriptor);
		void evt_FireConnection(QObject * threadid,const QHostAddress & hostAddr, quint16 port);
		//Trans Control,for intenal thread usage
97
		void evt_SendDataToClient(QObject * objClient,QByteArray   dtarray);
丁劲犇's avatar
丁劲犇 已提交
98 99 100 101 102 103
		void evt_KickClient(QObject *);
		void evt_DeactivteImmediately(zp_netTransThread *);
		void evt_KickAll(zp_netTransThread *);

	protected slots:
		void on_New_Arrived_Client(qintptr socketDescriptor);
104
		void on_ListenClosed(QString  id);
丁劲犇's avatar
丁劲犇 已提交
105 106
	public slots:
		//Call this function to send data to client
107
		void SendDataToClient(QObject * objClient,QByteArray   dtarray);
丁劲犇's avatar
丁劲犇 已提交
108 109 110 111
		//Close client Immediatele
		void KickClients(QObject * object);

		//Possive Connection Methods
112
		bool connectTo (const QHostAddress & address , quint16 nPort,bool bSSLConn);
丁劲犇's avatar
丁劲犇 已提交
113 114

	};
115
}
丁劲犇's avatar
丁劲犇 已提交
116
#endif // ZP_NET_THREADPOOL_H