Exemple #1
0
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" );
}
Exemple #2
0
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;
	}
}
Exemple #3
0
static void Irc_ConnectedListener_f( void *connected )
{
	if( *(bool *) connected )
	{
		assert( irc_server );
	}
	else
	{
		assert( irc_server );
		Dynvar_RemoveListener( irc_connected, Irc_ConnectedListener_f );
	}
}
Exemple #4
0
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>]" );
}
Exemple #5
0
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" );
}