--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%402304
		
			
				
	
	
		
			110 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef _INCLUDE_SMUD_CONNECTION_H_
 | 
						|
#define _INCLUDE_SMUD_CONNECTION_H_
 | 
						|
 | 
						|
#include "smud.h"
 | 
						|
#include <list>
 | 
						|
#include "poll.h"
 | 
						|
 | 
						|
enum ConnectionState
 | 
						|
{
 | 
						|
	ConnectionState_ReadQueryHeader,
 | 
						|
	ConnectionState_ReadQueryData,
 | 
						|
	ConnectionState_ReplyQuery,
 | 
						|
	ConnectionState_SendingFiles,
 | 
						|
	ConnectionState_SendUnknownList,
 | 
						|
	ConnectionState_Complete,
 | 
						|
};
 | 
						|
 | 
						|
enum QueryResult
 | 
						|
{
 | 
						|
	QueryResult_Continue,
 | 
						|
	QueryResult_Complete,
 | 
						|
};
 | 
						|
 | 
						|
enum MD5Status
 | 
						|
{
 | 
						|
	MD5Status_Unknown,
 | 
						|
	MD5Status_Current,
 | 
						|
	MD5Status_NeedsUpdate,
 | 
						|
};
 | 
						|
 | 
						|
enum UpdateStatus
 | 
						|
{ 
 | 
						|
	Update_Unknown = 0,				/* Version wasn't recognised or version querying is unsupported */
 | 
						|
	Update_Current = 1,				/* Server is running latest version */
 | 
						|
	Update_NewBuild = 2,			/* Server is on a svn release and a newer version is available */
 | 
						|
	Update_MinorAvailable = 3,		/* Server is on a release and a minor release has superceeded it */
 | 
						|
	Update_MajorAvailable = 4,		/* Server is on a release and a major release has superceeded it */
 | 
						|
	Update_CriticalAvailable = 5,	/* A critical update has been released (security fixes etc) */
 | 
						|
};
 | 
						|
 | 
						|
struct smud_connection
 | 
						|
{
 | 
						|
	smud_connection(int fd)
 | 
						|
	{
 | 
						|
		shouldSend = NULL;
 | 
						|
		fileLocation = NULL;
 | 
						|
		headerSent = NULL;
 | 
						|
		sentSums = 0;
 | 
						|
		sendCount = 0;
 | 
						|
		currentFile = 0;
 | 
						|
		unknownCount = 0;
 | 
						|
		pollData.events = POLLIN;
 | 
						|
		start = time(NULL);
 | 
						|
		state = ConnectionState_ReadQueryHeader;
 | 
						|
		this->fd = fd;
 | 
						|
		pollData.fd = fd;
 | 
						|
	}
 | 
						|
 | 
						|
	~smud_connection()
 | 
						|
	{
 | 
						|
		if (shouldSend != NULL)
 | 
						|
			delete [] shouldSend;
 | 
						|
		if (fileLocation != NULL)
 | 
						|
			delete [] fileLocation;
 | 
						|
		if (headerSent != NULL)
 | 
						|
			delete [] headerSent;
 | 
						|
	}
 | 
						|
 | 
						|
	int fd;							/** Socket file descriptor */
 | 
						|
	time_t start;					/** The time this connection was received (for timeouts) */
 | 
						|
	ConnectionState state;			/** How far through processing the connection we are */
 | 
						|
	uint8_t sentSums;				/** Number of MD5 Sums sent from the client */
 | 
						|
	MD5Status *shouldSend;			/** Arrays of statuses for each sum */
 | 
						|
	int *fileLocation;				/** Array of indexes into the global file list for each sum (only valid if shouldSend[i] == MD5Status_NeedsUpdate) */
 | 
						|
	bool *headerSent;				/** Has the header been sent yet for each sum? Header == file index and size */
 | 
						|
	int sendCount;					/** Number of files that need to be sent */
 | 
						|
	int unknownCount;				/** Number of files that were unknown */
 | 
						|
	int currentFile;				/** Current file being sent (index into the above 3 arrays) */
 | 
						|
	pollfd pollData;				/** Data to be passed into poll() */
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class ConnectionPool
 | 
						|
{
 | 
						|
public:
 | 
						|
	ConnectionPool();
 | 
						|
	~ConnectionPool();
 | 
						|
public:
 | 
						|
	void AddConnection(int fd);
 | 
						|
	void Process(bool *terminate);
 | 
						|
private:
 | 
						|
	QueryResult ProcessConnection(smud_connection *con);
 | 
						|
	void ReadQueryHeader(smud_connection *con);
 | 
						|
	void ReadQueryContent(smud_connection *con);
 | 
						|
	void ReplyQuery(smud_connection *con);
 | 
						|
	void SendFile(smud_connection *con);
 | 
						|
	void SendUnknownList(smud_connection *con);
 | 
						|
 | 
						|
	MD5Status GetMD5UpdateStatus(const char *md5, smud_connection *con, int fileNum);
 | 
						|
private:
 | 
						|
	std::list<smud_connection *> m_Links;
 | 
						|
	std::list<smud_connection *> m_AddQueue;
 | 
						|
	pthread_mutex_t m_AddLock;
 | 
						|
	time_t m_timeOut;
 | 
						|
};
 | 
						|
 | 
						|
#endif //_INCLUDE_SMUD_CONNECTION_H_
 | 
						|
 |