void Irc_Disconnect_f( void ) { if( irc_libhandle ) { bool *c; if( !irc_server ) irc_server = Cvar_Get( "irc_server", "", 0 ); if( !irc_connected ) irc_connected = Dynvar_Lookup( "irc_connected" ); assert( irc_connected ); assert( irc_server ); Dynvar_GetValue( irc_connected, (void **) &c ); if( *c ) { // still connected, proceed if( irc_wakelock ) { Sys_ReleaseWakeLock( irc_wakelock ); irc_wakelock = NULL; } irc_export->Disconnect(); Dynvar_RemoveListener( irc_connected, Irc_ConnectedListener_f ); } else Com_Printf( "Not connected.\n" ); } else Com_Printf( "IRC module not loaded. Connect first.\n" ); }
void Dynvar_CallListeners( dynvar_t *dynvar, void *value ) { dynvar_listener_node_t *n; dynvar->listeners_immutable = qtrue; // protect against concurrent Dynvar_RemoveListener // call listeners for( n = dynvar->listeners; n; n = n->next ) { assert( n->listener ); n->listener( value ); } dynvar->listeners_immutable = qfalse; // allow Dynvar_RemoveListener to modify dynvar->listeners // perform pending removals if( dynvar->to_remove ) { dynvar_listener_node_t *n, *prev = NULL; for( n = dynvar->to_remove; n; n = n->next ) { Dynvar_RemoveListener( dynvar, n->listener ); Mem_ZoneFree( prev ); prev = n; } Mem_ZoneFree( prev ); dynvar->to_remove = NULL; } }
static void Irc_ConnectedListener_f( void *connected ) { if( *(bool *) connected ) { assert( irc_server ); } else { assert( irc_server ); Dynvar_RemoveListener( irc_connected, Irc_ConnectedListener_f ); } }
void Irc_Connect_f( void ) { const int argc = Cmd_Argc(); if( argc <= 3 ) { if( !irc_libhandle ) Irc_LoadLibrary(); // load IRC library if not already loaded if( irc_libhandle ) { // library loaded, check for connection status bool *c; if( !irc_server ) irc_server = Cvar_Get( "irc_server", "irc.quakenet.org", CVAR_ARCHIVE ); if( !irc_connected ) irc_connected = Dynvar_Lookup( "irc_connected" ); assert( irc_server ); assert( irc_connected ); Dynvar_GetValue( irc_connected, (void **) &c ); if( !*c ) { // not connected yet if( argc >= 2 ) Cvar_Set( "irc_server", Cmd_Argv( 1 ) ); if( argc >= 3 ) Cvar_Set( "irc_port", Cmd_Argv( 2 ) ); Dynvar_AddListener( irc_connected, Irc_ConnectedListener_f ); irc_export->Connect(); Dynvar_GetValue( irc_connected, (void **) &c ); if( *c ) { irc_wakelock = Sys_AcquireWakeLock(); } else { // connect failed Com_Printf( "Could not connect to %s (%s).\n", Cvar_GetStringValue( irc_server ), irc_export->ERROR_MSG ); Dynvar_RemoveListener( irc_connected, Irc_ConnectedListener_f ); } } else Com_Printf( "Already connected.\n" ); } } else Com_Printf( "usage: irc_connect [<server>] [<port>]" ); }
static void Irc_UnloadLibrary( void ) { assert( irc_libhandle ); if( irc_initialized ) { dynvar_t *const quit = Dynvar_Lookup( "quit" ); bool *c; if( !irc_connected ) irc_connected = Dynvar_Lookup( "irc_connected" ); Dynvar_GetValue( irc_connected, (void **) &c ); if( *c ) irc_export->Disconnect(); irc_export->Shutdown(); Cmd_RemoveCommand( "irc_unload" ); if( quit ) Dynvar_RemoveListener( quit, Irc_Quit_f ); irc_initialized = false; } Com_UnloadLibrary( &irc_libhandle ); assert( !irc_libhandle ); Com_Printf( "IRC module unloaded.\n" ); }