zp_net_threadpool.h 4.2 KB
Newer Older
丁劲犇's avatar
丁劲犇 已提交
1 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_ThreadPool 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 33 34 35 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

		//Listening Ctrl
		//Begin a listening socket at special address and port. The socket will be activated as soon as possible
		void AddListeningAddress(const QString & id,const QHostAddress & address , quint16 nPort,bool bSSLConn = true);
		//Remove a listening socket at special address and port.The socket will be deactivated as soon as possible
		void RemoveListeningAddress(const QString & id);
		//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,const 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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
		//this event indicates a client disconnected.
		void evt_ClientDisconnected(QObject * /*clientHandle*/);
		//some data arrival
		void evt_Data_recieved(QObject *  /*clientHandle*/,const QByteArray & /*datablock*/ );
		//a block of data has been successfuly sent
		void evt_Data_transferred(QObject *   /*clientHandle*/,qint64 /*bytes sent*/);

		//Internal Message for ctrl.------------------------------------
		//Listen Control
		void startListen(const QString & id);
		void stopListen(const QString & id);
		void evt_EstablishConnection(QObject * threadid,qintptr socketDescriptor);
		void evt_FireConnection(QObject * threadid,const QHostAddress & hostAddr, quint16 port);
		//Trans Control,for intenal thread usage
		void evt_SendDataToClient(QObject * objClient,const QByteArray &  dtarray);
		void evt_BroadcastData(QObject * objFromClient,const QByteArray &  dtarray);
		void evt_KickClient(QObject *);
		void evt_DeactivteImmediately(zp_netTransThread *);
		void evt_KickAll(zp_netTransThread *);

	protected slots:
		void on_New_Arrived_Client(qintptr socketDescriptor);
		void on_ListenClosed(const QString & id);
	public slots:
		//Call this function to send data to client
		void SendDataToClient(QObject * objClient,const QByteArray &  dtarray);
		//Call this function to send data to client
		void BroadcastData(QObject * objFromClient,const QByteArray &  dtarray);

		//Close client Immediatele
		void KickClients(QObject * object);

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

	};
119
}
丁劲犇's avatar
丁劲犇 已提交
120
#endif // ZP_NET_THREADPOOL_H