source: protocols/yahoo/yahoo.c @ ac83732

Last change on this file since ac83732 was 7a685f1, checked in by Wilmer van der Gaast <wilmer@…>, at 2006-05-15T09:26:54Z

Added correct return values for callbacks in yahoo.c.

  • Property mode set to 100644
File size: 22.3 KB
Line 
1/*
2 * libyahoo2 wrapper to BitlBee
3 *
4 * Mostly Copyright 2004 Wilmer van der Gaast <wilmer@gaast.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 *
20 */
21
22
23#include <errno.h>
24#include <string.h>
25#include <stdlib.h>
26#include <stdio.h>
27#include <time.h>
28#include <sys/stat.h>
29#include <ctype.h>
30#include "nogaim.h"
31#include "yahoo2.h"
32#include "yahoo2_callbacks.h"
33
34#define BYAHOO_DEFAULT_GROUP "Buddies"
35
36/* A hack to handle removal of buddies not in the group "Buddies" correctly */
37struct byahoo_buddygroups
38{
39        char *buddy;
40        char *group;
41};
42
43struct byahoo_data
44{
45        int y2_id;
46        int current_status;
47        gboolean logged_in;
48        GSList *buddygroups;
49};
50
51struct byahoo_input_data
52{
53        int h;
54        void *d;
55};
56
57struct byahoo_conf_invitation
58{
59        char *name;
60        struct conversation *c;
61        int yid;
62        YList *members;
63        struct gaim_connection *gc;
64};
65
66static GSList *byahoo_inputs = NULL;
67static int byahoo_chat_id = 0;
68
69static char *byahoo_strip( char *in )
70{
71        int len;
72       
73        /* This should get rid of HTML tags at the beginning of the string. */
74        while( *in )
75        {
76                if( g_strncasecmp( in, "<font", 5 ) == 0 ||
77                    g_strncasecmp( in, "<fade", 5 ) == 0 ||
78                    g_strncasecmp( in, "<alt", 4 ) == 0 )
79                {
80                        char *s = strchr( in, '>' );
81                        if( !s )
82                                break;
83                       
84                        in = s + 1;
85                }
86                else if( strncmp( in, "\e[", 2 ) == 0 )
87                {
88                        char *s;
89                       
90                        for( s = in + 2; *s && *s != 'm'; s ++ );
91                       
92                        if( *s != 'm' )
93                                break;
94                       
95                        in = s + 1;
96                }
97                else
98                {
99                        break;
100                }
101        }
102       
103        /* This is supposed to get rid of the closing HTML tags at the end of the line. */
104        len = strlen( in );
105        while( len > 0 && in[len-1] == '>' )
106        {
107                int blen = len;
108               
109                len --;
110                while( len > 0 && ( in[len] != '<' || in[len+1] != '/' ) )
111                        len --;
112               
113                if( len == 0 && ( in[len] != '<' || in[len+1] != '/' ) )
114                {
115                        len = blen;
116                        break;
117                }
118        }
119       
120        return( g_strndup( in, len ) );
121}
122
123static void byahoo_login( struct aim_user *user )
124{
125        struct gaim_connection *gc = new_gaim_conn( user );
126        struct byahoo_data *yd = gc->proto_data = g_new0( struct byahoo_data, 1 );
127       
128        yd->logged_in = FALSE;
129        yd->current_status = YAHOO_STATUS_AVAILABLE;
130       
131        set_login_progress( gc, 1, "Connecting" );
132        yd->y2_id = yahoo_init( user->username, user->password );
133        yahoo_login( yd->y2_id, yd->current_status );
134}
135
136static void byahoo_close( struct gaim_connection *gc )
137{
138        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
139        GSList *l;
140       
141        while( gc->conversations )
142                serv_got_chat_left( gc, gc->conversations->id );
143       
144        for( l = yd->buddygroups; l; l = l->next )
145        {
146                struct byahoo_buddygroups *bg = l->data;
147               
148                g_free( bg->buddy );
149                g_free( bg->group );
150                g_free( bg );
151        }
152        g_slist_free( yd->buddygroups );
153       
154        if( yd->logged_in )
155                yahoo_logoff( yd->y2_id );
156        else
157                yahoo_close( yd->y2_id );
158       
159        g_free( yd );
160}
161
162static void byahoo_get_info(struct gaim_connection *gc, char *who) 
163{
164        /* Just make an URL and let the user fetch the info */
165        serv_got_crap(gc, "%s\n%s: %s%s", _("User Info"), 
166                        _("For now, fetch yourself"), yahoo_get_profile_url(),
167                        who);
168}
169
170static int byahoo_send_im( struct gaim_connection *gc, char *who, char *what, int len, int flags )
171{
172        struct byahoo_data *yd = gc->proto_data;
173       
174        yahoo_send_im( yd->y2_id, NULL, who, what, 1 );
175       
176        return 1;
177}
178
179static int byahoo_send_typing( struct gaim_connection *gc, char *who, int typing )
180{
181        struct byahoo_data *yd = gc->proto_data;
182       
183        yahoo_send_typing( yd->y2_id, NULL, who, typing );
184       
185        return 1;
186}
187
188static void byahoo_set_away( struct gaim_connection *gc, char *state, char *msg )
189{
190        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
191       
192        gc->away = NULL;
193       
194        if( msg )
195        {
196                yd->current_status = YAHOO_STATUS_CUSTOM;
197                gc->away = "";
198        }
199        if( state )
200        {
201                gc->away = "";
202                if( g_strcasecmp( state, "Available" ) == 0 )
203                {
204                        yd->current_status = YAHOO_STATUS_AVAILABLE;
205                        gc->away = NULL;
206                }
207                else if( g_strcasecmp( state, "Be Right Back" ) == 0 )
208                        yd->current_status = YAHOO_STATUS_BRB;
209                else if( g_strcasecmp( state, "Busy" ) == 0 )
210                        yd->current_status = YAHOO_STATUS_BUSY;
211                else if( g_strcasecmp( state, "Not At Home" ) == 0 )
212                        yd->current_status = YAHOO_STATUS_NOTATHOME;
213                else if( g_strcasecmp( state, "Not At Desk" ) == 0 )
214                        yd->current_status = YAHOO_STATUS_NOTATDESK;
215                else if( g_strcasecmp( state, "Not In Office" ) == 0 )
216                        yd->current_status = YAHOO_STATUS_NOTINOFFICE;
217                else if( g_strcasecmp( state, "On Phone" ) == 0 )
218                        yd->current_status = YAHOO_STATUS_ONPHONE;
219                else if( g_strcasecmp( state, "On Vacation" ) == 0 )
220                        yd->current_status = YAHOO_STATUS_ONVACATION;
221                else if( g_strcasecmp( state, "Out To Lunch" ) == 0 )
222                        yd->current_status = YAHOO_STATUS_OUTTOLUNCH;
223                else if( g_strcasecmp( state, "Stepped Out" ) == 0 )
224                        yd->current_status = YAHOO_STATUS_STEPPEDOUT;
225                else if( g_strcasecmp( state, "Invisible" ) == 0 )
226                        yd->current_status = YAHOO_STATUS_INVISIBLE;
227                else if( g_strcasecmp( state, GAIM_AWAY_CUSTOM ) == 0 )
228                {
229                        yd->current_status = YAHOO_STATUS_AVAILABLE;
230                       
231                        gc->away = NULL;
232                }
233        }
234        else
235                yd->current_status = YAHOO_STATUS_AVAILABLE;
236       
237        if( yd->current_status == YAHOO_STATUS_INVISIBLE )
238                yahoo_set_away( yd->y2_id, yd->current_status, NULL, gc->away != NULL );
239        else
240                yahoo_set_away( yd->y2_id, yd->current_status, msg, gc->away != NULL );
241}
242
243static GList *byahoo_away_states( struct gaim_connection *gc )
244{
245        GList *m = NULL;
246
247        m = g_list_append( m, "Available" );
248        m = g_list_append( m, "Be Right Back" );
249        m = g_list_append( m, "Busy" );
250        m = g_list_append( m, "Not At Home" );
251        m = g_list_append( m, "Not At Desk" );
252        m = g_list_append( m, "Not In Office" );
253        m = g_list_append( m, "On Phone" );
254        m = g_list_append( m, "On Vacation" );
255        m = g_list_append( m, "Out To Lunch" );
256        m = g_list_append( m, "Stepped Out" );
257        m = g_list_append( m, "Invisible" );
258        m = g_list_append( m, GAIM_AWAY_CUSTOM );
259       
260        return m;
261}
262
263static void byahoo_keepalive( struct gaim_connection *gc )
264{
265        struct byahoo_data *yd = gc->proto_data;
266       
267        yahoo_keepalive( yd->y2_id );
268}
269
270static void byahoo_add_buddy( struct gaim_connection *gc, char *who )
271{
272        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
273       
274        yahoo_add_buddy( yd->y2_id, who, BYAHOO_DEFAULT_GROUP );
275}
276
277static void byahoo_remove_buddy( struct gaim_connection *gc, char *who, char *group )
278{
279        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
280        GSList *bgl;
281       
282        yahoo_remove_buddy( yd->y2_id, who, BYAHOO_DEFAULT_GROUP );
283       
284        for( bgl = yd->buddygroups; bgl; bgl = bgl->next )
285        {
286                struct byahoo_buddygroups *bg = bgl->data;
287               
288                if( g_strcasecmp( bg->buddy, who ) == 0 )
289                        yahoo_remove_buddy( yd->y2_id, who, bg->group );
290        }
291}
292
293static char *byahoo_get_status_string( struct gaim_connection *gc, int stat )
294{
295        enum yahoo_status a = stat >> 1;
296       
297        switch (a)
298        {
299        case YAHOO_STATUS_BRB:
300                return "Be Right Back";
301        case YAHOO_STATUS_BUSY:
302                return "Busy";
303        case YAHOO_STATUS_NOTATHOME:
304                return "Not At Home";
305        case YAHOO_STATUS_NOTATDESK:
306                return "Not At Desk";
307        case YAHOO_STATUS_NOTINOFFICE:
308                return "Not In Office";
309        case YAHOO_STATUS_ONPHONE:
310                return "On Phone";
311        case YAHOO_STATUS_ONVACATION:
312                return "On Vacation";
313        case YAHOO_STATUS_OUTTOLUNCH:
314                return "Out To Lunch";
315        case YAHOO_STATUS_STEPPEDOUT:
316                return "Stepped Out";
317        case YAHOO_STATUS_INVISIBLE:
318                return "Invisible";
319        case YAHOO_STATUS_CUSTOM:
320                return "Away";
321        case YAHOO_STATUS_IDLE:
322                return "Idle";
323        case YAHOO_STATUS_OFFLINE:
324                return "Offline";
325        case YAHOO_STATUS_NOTIFY:
326                return "Notify";
327        default:
328                return "Away";
329        }
330}
331
332static int byahoo_chat_send( struct gaim_connection *gc, int id, char *message )
333{
334        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
335        struct conversation *c;
336       
337        for( c = gc->conversations; c && c->id != id; c = c->next );
338
339        yahoo_conference_message( yd->y2_id, NULL, c->data, c->title, message, 1 );
340       
341        return( 0 );
342}
343
344static void byahoo_chat_invite( struct gaim_connection *gc, int id, char *msg, char *who )
345{
346        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
347        struct conversation *c;
348       
349        for( c = gc->conversations; c && c->id != id; c = c->next );
350       
351        yahoo_conference_invite( yd->y2_id, NULL, c->data, c->title, msg );
352}
353
354static void byahoo_chat_leave( struct gaim_connection *gc, int id )
355{
356        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
357        struct conversation *c;
358       
359        for( c = gc->conversations; c && c->id != id; c = c->next );
360       
361        yahoo_conference_logoff( yd->y2_id, NULL, c->data, c->title );
362        serv_got_chat_left( gc, c->id );
363}
364
365static int byahoo_chat_open( struct gaim_connection *gc, char *who )
366{
367        struct byahoo_data *yd = (struct byahoo_data *) gc->proto_data;
368        struct conversation *c;
369        char *roomname;
370        YList *members;
371       
372        roomname = g_new0( char, strlen( gc->username ) + 16 );
373        g_snprintf( roomname, strlen( gc->username ) + 16, "%s-Bee-%d", gc->username, byahoo_chat_id );
374       
375        c = serv_got_joined_chat( gc, ++byahoo_chat_id, roomname );
376        add_chat_buddy( c, gc->username );
377       
378        /* FIXME: Free this thing when the chat's destroyed. We can't *always*
379                  do this because it's not always created here. */
380        c->data = members = g_new0( YList, 1 );
381        members->data = g_strdup( who );
382       
383        yahoo_conference_invite( yd->y2_id, NULL, members, roomname, "Please join my groupchat..." );
384       
385        g_free( roomname );
386       
387        return( 1 );
388}
389
390void byahoo_init( )
391{
392        struct prpl *ret = g_new0(struct prpl, 1);
393        ret->name = "yahoo";
394       
395        ret->login = byahoo_login;
396        ret->close = byahoo_close;
397        ret->send_im = byahoo_send_im;
398        ret->get_info = byahoo_get_info;
399        ret->away_states = byahoo_away_states;
400        ret->set_away = byahoo_set_away;
401        ret->keepalive = byahoo_keepalive;
402        ret->add_buddy = byahoo_add_buddy;
403        ret->remove_buddy = byahoo_remove_buddy;
404        ret->get_status_string = byahoo_get_status_string;
405        ret->send_typing = byahoo_send_typing;
406       
407        ret->chat_send = byahoo_chat_send;
408        ret->chat_invite = byahoo_chat_invite;
409        ret->chat_leave = byahoo_chat_leave;
410        ret->chat_open = byahoo_chat_open;
411        ret->cmp_buddynames = g_strcasecmp;
412       
413        register_protocol(ret);
414}
415
416static struct gaim_connection *byahoo_get_gc_by_id( int id )
417{
418        GSList *l;
419        struct gaim_connection *gc;
420        struct byahoo_data *yd;
421       
422        for( l = get_connections(); l; l = l->next )
423        {
424                gc = l->data;
425                yd = gc->proto_data;
426               
427                if( !strcmp(gc->prpl->name, "yahoo") && yd->y2_id == id )
428                        return( gc );
429        }
430       
431        return( NULL );
432}
433
434
435/* Now it's callback time! */
436
437struct byahoo_connect_callback_data
438{
439        int fd;
440        yahoo_connect_callback callback;
441        gpointer data;
442        int id;
443};
444
445void byahoo_connect_callback( gpointer data, gint source, b_input_condition cond )
446{
447        struct byahoo_connect_callback_data *d = data;
448       
449        if( !byahoo_get_gc_by_id( d->id ) )
450        {
451                g_free( d );
452                return;
453        }
454       
455        d->callback( d->fd, 0, d->data );
456        g_free( d );
457}
458
459struct byahoo_read_ready_data
460{
461        int id;
462        int fd;
463        int tag;
464        gpointer data;
465};
466
467gboolean byahoo_read_ready_callback( gpointer data, gint source, b_input_condition cond )
468{
469        struct byahoo_read_ready_data *d = data;
470       
471        if( !byahoo_get_gc_by_id( d->id ) )
472                /* WTF doesn't libyahoo clean this up? */
473                return FALSE;
474       
475        yahoo_read_ready( d->id, d->fd, d->data );
476       
477        return TRUE;
478}
479
480struct byahoo_write_ready_data
481{
482        int id;
483        int fd;
484        int tag;
485        gpointer data;
486};
487
488gboolean byahoo_write_ready_callback( gpointer data, gint source, b_input_condition cond )
489{
490        struct byahoo_write_ready_data *d = data;
491       
492        if( !byahoo_get_gc_by_id( d->id ) )
493                /* WTF doesn't libyahoo clean this up? */
494                return FALSE;
495       
496        yahoo_write_ready( d->id, d->fd, d->data );
497       
498        return FALSE;
499}
500
501void ext_yahoo_login_response( int id, int succ, char *url )
502{
503        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
504        struct byahoo_data *yd = NULL;
505       
506        if( gc == NULL )
507        {
508                /* libyahoo2 seems to call this one twice when something
509                   went wrong sometimes. Don't know why. Because we clean
510                   up the connection on the first failure, the second
511                   should be ignored. */
512               
513                return;
514        }
515       
516        yd = (struct byahoo_data *) gc->proto_data;
517       
518        if( succ == YAHOO_LOGIN_OK )
519        {
520                account_online( gc );
521               
522                yd->logged_in = TRUE;
523        }
524        else
525        {
526                char *errstr;
527                char *s;
528               
529                yd->logged_in = FALSE;
530               
531                if( succ == YAHOO_LOGIN_UNAME )
532                        errstr = "Incorrect Yahoo! username";
533                else if( succ == YAHOO_LOGIN_PASSWD )
534                        errstr = "Incorrect Yahoo! password";
535                else if( succ == YAHOO_LOGIN_LOCK )
536                        errstr = "Yahoo! account locked";
537                else if( succ == YAHOO_LOGIN_DUPL )
538                {
539                        errstr = "Logged in on a different machine or device";
540                        gc->wants_to_die = TRUE;
541                }
542                else if( succ == YAHOO_LOGIN_SOCK )
543                        errstr = "Socket problem";
544                else
545                        errstr = "Unknown error";
546               
547                if( url && *url )
548                {
549                        s = g_malloc( strlen( "Error %d (%s). See %s for more information." ) + strlen( url ) + strlen( errstr ) + 16 );
550                        sprintf( s, "Error %d (%s). See %s for more information.", succ, errstr, url );
551                }
552                else
553                {
554                        s = g_malloc( strlen( "Error %d (%s)" ) + strlen( errstr ) + 16 );
555                        sprintf( s, "Error %d (%s)", succ, errstr );
556                }
557               
558                if( yd->logged_in )
559                        hide_login_progress_error( gc, s );
560                else
561                        hide_login_progress( gc, s );
562               
563                g_free( s );
564               
565                signoff( gc );
566        }
567}
568
569void ext_yahoo_got_buddies( int id, YList *buds )
570{
571        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
572        struct byahoo_data *yd = gc->proto_data;
573        YList *bl = buds;
574       
575        while( bl )
576        {
577                struct yahoo_buddy *b = bl->data;
578                struct byahoo_buddygroups *bg;
579               
580                if( strcmp( b->group, BYAHOO_DEFAULT_GROUP ) != 0 )
581                {
582                        bg = g_new0( struct byahoo_buddygroups, 1 );
583                       
584                        bg->buddy = g_strdup( b->id );
585                        bg->group = g_strdup( b->group );
586                        yd->buddygroups = g_slist_append( yd->buddygroups, bg );
587                }
588               
589                add_buddy( gc, b->group, b->id, b->real_name );
590                bl = bl->next;
591        }
592}
593
594void ext_yahoo_got_ignore( int id, YList *igns )
595{
596}
597
598void ext_yahoo_got_identities( int id, YList *ids )
599{
600}
601
602void ext_yahoo_got_cookies( int id )
603{
604}
605
606void ext_yahoo_status_changed( int id, char *who, int stat, char *msg, int away )
607{
608        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
609       
610        serv_got_update( gc, who, stat != YAHOO_STATUS_OFFLINE, 0, 0, 0,
611                         ( stat != YAHOO_STATUS_AVAILABLE ) | ( stat << 1 ), 0 );
612}
613
614void ext_yahoo_got_im( int id, char *who, char *msg, long tm, int stat, int utf8 )
615{
616        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
617        char *m = byahoo_strip( msg );
618       
619        serv_got_im( gc, who, m, 0, 0, strlen( m ) );
620        g_free( m );
621}
622
623void ext_yahoo_got_file( int id, char *who, char *url, long expires, char *msg, char *fname, unsigned long fesize )
624{
625        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
626       
627        serv_got_crap( gc, "Got a file transfer (file = %s) from %s. Ignoring for now due to lack of support.", fname, who );
628}
629
630void ext_yahoo_typing_notify( int id, char *who, int stat )
631{
632        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
633        if (stat == 1) {
634                /* User is typing */
635                serv_got_typing( gc, who, 1, 1 );
636        }
637        else {
638                /* User stopped typing */
639                serv_got_typing( gc, who, 1, 0 );
640        }
641}
642
643void ext_yahoo_system_message( int id, char *msg )
644{
645        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
646       
647        serv_got_crap( gc, "Yahoo! system message: %s", msg );
648}
649
650void ext_yahoo_webcam_invite( int id, char *from )
651{
652        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
653       
654        serv_got_crap( gc, "Got a webcam invitation from %s. IRC+webcams is a no-no though...", from );
655}
656
657void ext_yahoo_error( int id, char *err, int fatal )
658{
659        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
660       
661        if( fatal )
662        {
663                hide_login_progress_error( gc, err );
664                signoff( gc );
665        }
666        else
667        {
668                do_error_dialog( gc, err, "Yahoo! error" );
669        }
670}
671
672/* TODO: Clear up the mess of inp and d structures */
673int ext_yahoo_add_handler( int id, int fd, yahoo_input_condition cond, void *data )
674{
675        struct byahoo_input_data *inp = g_new0( struct byahoo_input_data, 1 );
676       
677        if( cond == YAHOO_INPUT_READ )
678        {
679                struct byahoo_read_ready_data *d = g_new0( struct byahoo_read_ready_data, 1 );
680               
681                d->id = id;
682                d->fd = fd;
683                d->data = data;
684               
685                inp->d = d;
686                d->tag = inp->h = b_input_add( fd, GAIM_INPUT_READ, (b_event_handler) byahoo_read_ready_callback, (gpointer) d );
687        }
688        else if( cond == YAHOO_INPUT_WRITE )
689        {
690                struct byahoo_write_ready_data *d = g_new0( struct byahoo_write_ready_data, 1 );
691               
692                d->id = id;
693                d->fd = fd;
694                d->data = data;
695               
696                inp->d = d;
697                d->tag = inp->h = b_input_add( fd, GAIM_INPUT_WRITE, (b_event_handler) byahoo_write_ready_callback, (gpointer) d );
698        }
699        else
700        {
701                g_free( inp );
702                return( -1 );
703                /* Panic... */
704        }
705       
706        byahoo_inputs = g_slist_append( byahoo_inputs, inp );
707        return( inp->h );
708}
709
710void ext_yahoo_remove_handler( int id, int tag )
711{
712        struct byahoo_input_data *inp;
713        GSList *l = byahoo_inputs;
714       
715        while( l )
716        {
717                inp = l->data;
718                if( inp->h == tag )
719                {
720                        g_free( inp->d );
721                        g_free( inp );
722                        byahoo_inputs = g_slist_remove( byahoo_inputs, inp );
723                        break;
724                }
725                l = l->next;
726        }
727       
728        b_event_remove( tag );
729}
730
731int ext_yahoo_connect_async( int id, char *host, int port, yahoo_connect_callback callback, void *data )
732{
733        struct byahoo_connect_callback_data *d;
734        int fd;
735       
736        d = g_new0( struct byahoo_connect_callback_data, 1 );
737        if( ( fd = proxy_connect( host, port, (b_event_handler) byahoo_connect_callback, (gpointer) d ) ) < 0 )
738        {
739                g_free( d );
740                return( fd );
741        }
742        d->fd = fd;
743        d->callback = callback;
744        d->data = data;
745        d->id = id;
746       
747        return( fd );
748}
749
750/* Because we don't want asynchronous connects in BitlBee, and because
751   libyahoo doesn't seem to use this one anyway, this one is now defunct. */
752int ext_yahoo_connect(char *host, int port)
753{
754#if 0
755        struct sockaddr_in serv_addr;
756        static struct hostent *server;
757        static char last_host[256];
758        int servfd;
759        char **p;
760
761        if(last_host[0] || g_strcasecmp(last_host, host)!=0) {
762                if(!(server = gethostbyname(host))) {
763                        return -1;
764                }
765                strncpy(last_host, host, 255);
766        }
767
768        if((servfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
769                return -1;
770        }
771
772        for (p = server->h_addr_list; *p; p++)
773        {
774                memset(&serv_addr, 0, sizeof(serv_addr));
775                serv_addr.sin_family = AF_INET;
776                memcpy(&serv_addr.sin_addr.s_addr, *p, server->h_length);
777                serv_addr.sin_port = htons(port);
778
779                if(connect(servfd, (struct sockaddr *) &serv_addr,
780                                        sizeof(serv_addr)) == -1) {
781                        return -1;
782                } else {
783                        return servfd;
784                }
785        }
786
787        closesocket(servfd);
788#endif
789        return -1;
790}
791
792static void byahoo_accept_conf( gpointer w, struct byahoo_conf_invitation *inv )
793{
794        yahoo_conference_logon( inv->yid, NULL, inv->members, inv->name );
795        add_chat_buddy( inv->c, inv->gc->username );
796        g_free( inv->name );
797        g_free( inv );
798}
799
800static void byahoo_reject_conf( gpointer w, struct byahoo_conf_invitation *inv )
801{
802        yahoo_conference_decline( inv->yid, NULL, inv->members, inv->name, "User rejected groupchat" );
803        serv_got_chat_left( inv->gc, inv->c->id );
804        g_free( inv->name );
805        g_free( inv );
806}
807
808void ext_yahoo_got_conf_invite( int id, char *who, char *room, char *msg, YList *members )
809{
810        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
811        struct byahoo_conf_invitation *inv;
812        char txt[1024];
813        YList *m;
814       
815        inv = g_malloc( sizeof( struct byahoo_conf_invitation ) );
816        memset( inv, 0, sizeof( struct byahoo_conf_invitation ) );
817        inv->name = g_strdup( room );
818        inv->c = serv_got_joined_chat( gc, ++byahoo_chat_id, room );
819        inv->c->data = members;
820        inv->yid = id;
821        inv->members = members;
822        inv->gc = gc;
823       
824        for( m = members; m; m = m->next )
825                if( g_strcasecmp( m->data, gc->username ) != 0 )
826                        add_chat_buddy( inv->c, m->data );
827       
828        g_snprintf( txt, 1024, "Got an invitation to chatroom %s from %s: %s", room, who, msg );
829       
830        do_ask_dialog( gc, txt, inv, byahoo_accept_conf, byahoo_reject_conf );
831}
832
833void ext_yahoo_conf_userdecline( int id, char *who, char *room, char *msg )
834{
835        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
836       
837        serv_got_crap( gc, "Invite to chatroom %s rejected by %s: %s", room, who, msg );
838}
839
840void ext_yahoo_conf_userjoin( int id, char *who, char *room )
841{
842        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
843        struct conversation *c;
844       
845        for( c = gc->conversations; c && strcmp( c->title, room ) != 0; c = c->next );
846       
847        if( c )
848                add_chat_buddy( c, who );
849}
850
851void ext_yahoo_conf_userleave( int id, char *who, char *room )
852{
853        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
854        struct conversation *c;
855       
856        for( c = gc->conversations; c && strcmp( c->title, room ) != 0; c = c->next );
857       
858        if( c )
859                remove_chat_buddy( c, who, "" );
860}
861
862void ext_yahoo_conf_message( int id, char *who, char *room, char *msg, int utf8 )
863{
864        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
865        char *m = byahoo_strip( msg );
866        struct conversation *c;
867       
868        for( c = gc->conversations; c && strcmp( c->title, room ) != 0; c = c->next );
869       
870        serv_got_chat_in( gc, c ? c->id : 0, who, 0, m, 0 );
871        g_free( m );
872}
873
874void ext_yahoo_chat_cat_xml( int id, char *xml )
875{
876}
877
878void ext_yahoo_chat_join( int id, char *room, char *topic, YList *members, int fd )
879{
880}
881
882void ext_yahoo_chat_userjoin( int id, char *room, struct yahoo_chat_member *who )
883{
884}
885
886void ext_yahoo_chat_userleave( int id, char *room, char *who )
887{
888}
889
890void ext_yahoo_chat_message( int id, char *who, char *room, char *msg, int msgtype, int utf8 )
891{
892}
893
894void ext_yahoo_chat_yahoologout( int id )
895{
896}
897
898void ext_yahoo_chat_yahooerror( int id )
899{
900}
901
902void ext_yahoo_contact_added( int id, char *myid, char *who, char *msg )
903{
904}
905
906void ext_yahoo_rejected( int id, char *who, char *msg )
907{
908}
909
910void ext_yahoo_game_notify( int id, char *who, int stat )
911{
912}
913
914void ext_yahoo_mail_notify( int id, char *from, char *subj, int cnt )
915{
916        struct gaim_connection *gc = byahoo_get_gc_by_id( id );
917       
918        if( from && subj )
919                serv_got_crap( gc, "Received e-mail message from %s with subject `%s'", from, subj );
920        else if( cnt > 0 )
921                serv_got_crap( gc, "Received %d new e-mails", cnt );
922}
923
924void ext_yahoo_webcam_invite_reply( int id, char *from, int accept )
925{
926}
927
928void ext_yahoo_webcam_closed( int id, char *who, int reason )
929{
930}
931
932void ext_yahoo_got_search_result( int id, int found, int start, int total, YList *contacts )
933{
934}
935
936void ext_yahoo_webcam_viewer( int id, char *who, int connect )
937{
938}
939
940void ext_yahoo_webcam_data_request( int id, int send )
941{
942}
943
944int ext_yahoo_log( char *fmt, ... )
945{
946        return( 0 );
947}
948
949void ext_yahoo_got_webcam_image( int id, const char * who, const unsigned char *image, unsigned int image_size, unsigned int real_size, unsigned int timestamp )
950{
951}
Note: See TracBrowser for help on using the repository browser.