#include "chat.h" #include #include #include #include /* sleep microseconds at poll: to prevent too much polling */ /* only on unsuccesful polling */ #define SLEEP 5000 static void delay(int us); /*** App-specific servant structures ***/ // the number of remembered messages #define MAXMESS 100 typedef struct { POA_chat servant; PortableServer_POA poa; messid attr_nextmessage; char messages[MAXMESS][messlen+1]; char names[MAXMESS][namelen+1]; short clients; short totalclients; } impl_POA_chat; /*** Implementation stub prototypes ***/ static void impl_chat__destroy(impl_POA_chat * servant, CORBA_Environment * ev); static messid impl_chat__get_nextmessage(impl_POA_chat * servant, CORBA_Environment * ev); static CORBA_boolean impl_chat_join(impl_POA_chat * servant, name username, messid * firstmessage, CORBA_Environment * ev); static CORBA_boolean impl_chat_pollmessage(impl_POA_chat * servant, messid messageid, name * username, mess * message, CORBA_Environment * ev); static messid impl_chat_postmessage(impl_POA_chat * servant, name username, mess message, CORBA_Environment * ev); static void impl_chat_disconnect(impl_POA_chat * servant, name username, CORBA_Environment * ev); /*** epv structures ***/ static PortableServer_ServantBase__epv impl_chat_base_epv = { NULL, /* _private data */ NULL, /* finalize routine */ NULL, /* default_POA routine */ }; static POA_chat__epv impl_chat_epv = { NULL, /* _private */ (gpointer) & impl_chat__get_nextmessage, (gpointer) & impl_chat_join, (gpointer) & impl_chat_pollmessage, (gpointer) & impl_chat_postmessage, (gpointer) & impl_chat_disconnect, }; /*** vepv structures ***/ static POA_chat__vepv impl_chat_vepv = { &impl_chat_base_epv, &impl_chat_epv, }; /*** Stub implementations ***/ static chat impl_chat__create(PortableServer_POA poa, CORBA_Environment * ev) { chat retval; impl_POA_chat *newservant; PortableServer_ObjectId *objid; newservant = g_new0(impl_POA_chat, 1); newservant->servant.vepv = &impl_chat_vepv; newservant->poa = poa; /* SJ */ newservant->attr_nextmessage = 0; newservant->clients = 0; newservant->totalclients = 0; POA_chat__init((PortableServer_Servant) newservant, ev); objid = PortableServer_POA_activate_object(poa, newservant, ev); CORBA_free(objid); retval = PortableServer_POA_servant_to_reference(poa, newservant, ev); return retval; } static void impl_chat__destroy(impl_POA_chat * servant, CORBA_Environment * ev) { PortableServer_ObjectId *objid; objid = PortableServer_POA_servant_to_id(servant->poa, servant, ev); PortableServer_POA_deactivate_object(servant->poa, objid, ev); CORBA_free(objid); POA_chat__fini((PortableServer_Servant) servant, ev); g_free(servant); } static messid impl_chat__get_nextmessage(impl_POA_chat * servant, CORBA_Environment * ev) { messid retval; retval = servant->attr_nextmessage; return retval; } static CORBA_boolean impl_chat_join(impl_POA_chat * servant, name username, messid * firstmessage, CORBA_Environment * ev) { CORBA_boolean retval; /* clip */ printf("Charserver: connection %d(%d):%s (%d msgs)\n", servant->clients, servant->totalclients, username, servant->attr_nextmessage); retval = 1; return retval; } static CORBA_boolean impl_chat_pollmessage(impl_POA_chat * servant, messid messageid, name * username, mess * message, CORBA_Environment * ev) { CORBA_boolean retval; *message = CORBA_string_alloc(messlen+1); *username = CORBA_string_alloc(namelen+1); if ((messageid < (servant->attr_nextmessage-MAXMESS+2)) || (messageid >= servant->attr_nextmessage)) { /* no such message */ strcpy(*message, ""); strcpy(*username, ""); retval = 0; /* delay to prevent load increase */ #ifdef SLEEP delay(SLEEP); #endif } else { /* clip */ } return retval; } static messid impl_chat_postmessage(impl_POA_chat * servant, name username, mess message, CORBA_Environment * ev) { messid retval; /* clip */ return retval; } static void impl_chat_disconnect(impl_POA_chat * servant, name username, CORBA_Environment * ev) { servant->clients--; } static void delay(int us) { struct timeval wt; wt.tv_sec = 0; wt.tv_usec = us; select(1, NULL, NULL, NULL, &wt); }