#ifndef _rA_EVDP_H_
#define _rA_EVDP_H_
#include "../common/cbasetypes.h"
typedef struct EVDP_DATA EVDP_DATA;
//#idef EVDP_EPOLL
#include <sys/epoll.h>
struct EVDP_DATA{
struct epoll_event ev_data;
bool ev_added;
};
//#endif
enum EVDP_EVENTFLAGS{
EVDP_EVENT_IN = 1, // Incomming data
EVDP_EVENT_OUT = 2, // Connection accepts writing.
EVDP_EVENT_HUP = 4 // Connection Closed.
};
typedef struct EVDP_EVENT{
int32 events; // due to performance reasons, this should be the first member.
int32 fd; // Connection Identifier
} EVDP_EVENT;
/**
* Network Event Dispatcher Initialization / Finalization routines
*/
void evdp_init();
void evdp_final();
/**
* Will Wait for events.
*
* @param *out_ev pointer to array in size at least of max_events.
* @param max_events max no of events to report with this call (coalesc)
* @param timeout_ticks max time to wait in ticks (milliseconds)
*
* @Note:
* The function will block until an event has occured on one of the monitored connections
* or the timeout of timeout_ticks has passed by.
* Upon successfull call (changed connections) this function will write the connection
* Identifier & event to the out_fds array.
*
* @return 0 -> Timeout, > 0 no of changed connections.
*/
int32 evdp_wait(EVDP_EVENT *out_fds, int32 max_events, int32 timeout_ticks);
/**
* Applys the given mask on the given connection.
*
* @param fd connection identifier
* @param *ep event data pointer for the connection
* @param mask new event mask we're monitoring for.
*/
//void evdp_apply(int32 fd, EVDP_DATA *ep, int32 mask);
/**
* Adds a connection (listner) to the event notification system.
*
* @param fd connection identifier
* @param *ep event data pointer for the connection
*
* @note:
* Listener type sockets are edge triggered, (see epoll manual for more information)
* - This basicaly means that youll receive one event, adn you have to accept until accept returns an error (nothing to accept)
*
* MONITORS by default: IN
*
* @return success indicator.
*/
bool evdp_addlistener(int32 fd, EVDP_DATA *ep);
/**
* Adds a connection (client connectioN) to the event notification system
*
* @param fd connection identifier
* @param *ep event data pointr for the connection
*
* @note:
*
* MONITORS by default: IN, HUP
*
* @return success indicator.
*/
bool evdp_addclient(int32 fd, EVDP_DATA *ep);
/**
* Adds a connection (pending / outgoing connection!) to the event notification system.
*
* @param fd connection identifier
* @param *ep event data pointer for the conneciton.
*
* @note:
* Outgoing connection type sockets are getting monitored for connection established
* successfull
* - if the connection has been established - we're generitng a writable notification .. (send)
* this is typical for BSD / posix conform network stacks.
* - Additinionally its edge triggered.
*
* @see evdp_outgoingconnection_established
*
*
* @return success indicator
*/
bool evdp_addconnecting(int32 fd, EVDP_DATA *ep);
/**
* Adds an outgoing connection to the normal event notification system after it has been successfully established.
*
* @param fd connection identifier
* @param *ep event data pointer for the conneciton.
* @note
* after this call, its handled like a normal "client" connection (incomming)
*
* @rturn success indicator
*/
bool evdp_outgoingconnection_established(int32 fd, EVDP_DATA *ep);
/**
* Marks a connection to be monitored for writable.
*
* @param fd connection identifier
* @param *ep event data pointer for the connection
*
* @note:
* the connection must be already added (as client or listener)
*
*
* @return sucess indicator
*/
bool evdp_writable_add(int32 fd, EVDP_DATA *ep);
/**
* Removes the connection from writable notification monitoring
*
* @param fd connection identifier
* @param *ep event data pointr for the connection
*
*/
void evdp_writable_remove(int32 fd, EVDP_DATA *ep);
/**
* Removes an connectio from the event notification system.
*
* @param fd connection iditentfir
* @param *ep event data pointer for th connection
*
*
* @note:
* this will also clear the given EVENT_DATA block
* so the connection slot is in an "initial" blank status / ready to get reused.
*
*/
void evdp_remove(int32 fd, EVDP_DATA *ep);
#endif