#ifndef __SERVER__
#define __SERVER__


#ifdef WIN32
#include <system/threads/bthread.h>
#else
#include <metalsvm/tasks.h>
#endif

#ifndef LWIP_SOCKET
#include <lwip/sockets.h>
#endif


typedef struct _ServerEventArgs
{
	unsigned int ClientID;
	unsigned int dwLen;
	void* pBuffer;
} ServerEventArgs;

#define DEF_BUFFERSIZE 2048

typedef void (*ServerEventHandler)(ServerEventArgs*);

#ifndef SOCKET
#define SOCKET int
#endif


typedef struct _Server
{
	SOCKET			sSocket;
	unsigned int*	sConnections;
	struct sockaddr_in	adAddr;
        unsigned short		wPort;
        unsigned int		dwConnections;
        unsigned int		dwMaximumConnections;

	struct sockaddr_in*			ConnectionsAddr;

	tid_t					bThread_listen;
	tid_t*					bThreads;

	ServerEventHandler		_OnConnect;
	ServerEventHandler		_OnDisconnect;
	ServerEventHandler		_OnRead;
	ServerEventHandler		_OnWrite;
} Server;

typedef struct _ServerThreadArgs
{
	Server*			srv;
	unsigned int	ID;
} ServerThreadArgs;


int	srv_sendBuffer(Server* srv,unsigned int cli,void* pBuffer, unsigned int dwLen);
void	srv_DisconnectClient(Server* srv,unsigned int cli);
void*	srv_WaitForConnection(Server* srv);
void*	srv_WaitForPacket(ServerThreadArgs* t);

int     server_init(Server* srv,unsigned short Port, unsigned int dwMaxConnections);
int     server_destroy(Server* srv);

#endif