Wow - very handy - thanks very much for the detailed answer. I should be able 
to run from here. 



On Jan 23, 2012, at 5:37 AM, Øystein Schønning-Johansen <[email protected]> 
wrote:

> I did this with glib and the GSocket classes. I guess you can connect to fibs 
> with whatever system you want. Python probably has something similar.
> 
> Fractions of my code below. Totally without any warranty of even working. The 
> only thing you should need to write is now the callback function 
> input_message_cb().
> 
> gint main( gint argc, gchar *argv[] )
> {
>       GSocketClient *client;
>       GSocketConnection *conn;
>       GDataInputStream *input;
>       GOutputStream *output;
>       GError *err = NULL;
>       /* Engine *engine; */
> 
>       g_type_init();
> 
>       /* engine =  engine_new_ .... */
>       engine_set_equity_calculator( engine, DOUBLE_MATCHPOINT_EQUITY );
> 
>       client = g_socket_client_new();
>       conn = g_socket_client_connect_to_host( client, "fibs.com", 4321, NULL, 
> &err);
>       if( err )
>               g_error( "%s", err->message );
> 
>       input = g_data_input_stream_new( 
> g_io_stream_get_input_stream(G_IO_STREAM(conn)) );
>       output = g_io_stream_get_output_stream(G_IO_STREAM(conn));
> 
>       fibs_login( G_INPUT_STREAM(input), output, &err );
>       if ( err )
>               g_error( "%s", err->message );
> 
>       g_data_input_stream_read_line_async(input, G_PRIORITY_DEFAULT, NULL, 
> input_message_cb, (gpointer) engine );
> 
>       /* main loop */
>       while( TRUE ){
>               gchar *message;
>               gboolean doexit = FALSE;
>               gsize length;
>               GError *err = NULL;
> 
>               message = g_data_input_stream_read_line( input, &length, NULL, 
> &err);
>               if( err ) g_error( "%s", err->message );
>               doexit = message_handler( message, engine, output, players, 
> saved );
>               g_free( message );
>               if ( doexit )
>                       break;
>       }
>       g_print("Cleaning up....\n" );
> 
>       g_object_unref ( engine );
>       g_object_unref ( client );
>       return 0;
> }
> 
> /* You can not read line by line until after login, since the is no newline 
> after the
>  * login prompt. We therefore need to read the unbuffered stream until we're
>  * logged in. The login procedure is therefor separated out. */
> static gboolean
> fibs_login( GInputStream *input, GOutputStream *output, GError **err )
> {
>       GError *local_err = NULL;
>       gint i;
>       gchar prelogin[PRELOGIN_SIZE];
>       gchar **spl;
> 
>       g_return_val_if_fail (err == NULL || *err == NULL, FALSE);      
> 
>       /* It's actually 2 reads */
>       for( i = 0; i < 2; i++ ){
>               gssize size = g_input_stream_read( G_INPUT_STREAM(input), 
> &prelogin, PRELOGIN_SIZE, NULL, &local_err );
>               if ( local_err ){
>                       g_propagate_error (err, local_err);
>                       return FALSE;
>               }
>       
>               if ( size < 0 ) g_error( "size -1" );
>               if ( size > PRELOGIN_SIZE ) g_error( "buffer overflow");
> 
>               prelogin[size-1] = '\0';
>               if (!i)
>                       g_printf( "%s\n", prelogin );
>       }
> 
>       spl = g_strsplit( prelogin, "\n", 0 );
>       if ( strncmp( spl[1], "login:", 6 ) ){
>               g_strfreev( spl );
>               g_warning("Can't find login prompt");
>               return FALSE;
>       }
> 
>       g_strfreev( spl );
> 
>       g_output_stream_write( output, loginstring, strlen(loginstring), NULL, 
> &local_err ); 
>       if ( local_err ){
>               g_propagate_error (err, local_err);
>               return FALSE;
>       }
>       return TRUE;
> }
> 
> 
> 
> On Mon, Jan 23, 2012 at 10:20 AM, Ian Shaw <[email protected]> wrote:
> Øystein has done this.  He might have some useful tips.
> 
> -- Ian
> 
_______________________________________________
Bug-gnubg mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-gnubg

Reply via email to