aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'protocols')
-rw-r--r--protocols/Makefile2
-rw-r--r--protocols/bee.h73
-rw-r--r--protocols/bee_user.c82
-rw-r--r--protocols/nogaim.c59
-rw-r--r--protocols/user.c106
-rw-r--r--protocols/user.h40
6 files changed, 180 insertions, 182 deletions
diff --git a/protocols/Makefile b/protocols/Makefile
index f1133cc9..1f89ee5a 100644
--- a/protocols/Makefile
+++ b/protocols/Makefile
@@ -10,7 +10,7 @@
# [SH] Program variables
#objects = account.o nogaim.o user.o
-objects = bee.o
+objects = bee.o bee_user.o nogaim.o
# [SH] The next two lines should contain the directory name (in $(subdirs))
diff --git a/protocols/bee.h b/protocols/bee.h
index b25f0e08..e5c21120 100644
--- a/protocols/bee.h
+++ b/protocols/bee.h
@@ -1,7 +1,32 @@
-typedef struct bee_ui
-{
- void *data;
-} bee_ui_t;
+ /********************************************************************\
+ * BitlBee -- An IRC to other IM-networks gateway *
+ * *
+ * Copyright 2002-2010 Wilmer van der Gaast and others *
+ \********************************************************************/
+
+/* Stuff to handle, save and search buddies */
+
+/*
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License with
+ the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
+ if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __BEE_H__
+#define __BEE_H__
+
+struct bee_ui_funcs;
typedef struct bee
{
@@ -10,9 +35,47 @@ typedef struct bee
GSList *users;
GSList *accounts;
- //const bee_ui_funcs_t *ui;
+ const struct bee_ui_funcs *ui;
void *ui_data;
} bee_t;
bee_t *bee_new();
void bee_free( bee_t *b );
+
+typedef enum
+{
+ BEE_USER_ONLINE = 1,
+ BEE_USER_AWAY = 2,
+} bee_user_flags_t;
+
+typedef struct bee_user
+{
+ struct im_connection *ic;
+ char *handle;
+ char *fullname;
+ char *group;
+
+ char *away;
+ char *status_msg;
+
+ bee_t *bee;
+ void *ui_data;
+} bee_user_t;
+
+typedef struct bee_ui_funcs
+{
+ gboolean (*user_new)( bee_t *bee, struct bee_user *bu );
+ gboolean (*user_free)( bee_t *bee, struct bee_user *bu );
+} bee_ui_funcs_t;
+
+
+/* bee.c */
+bee_t *bee_new();
+void bee_free( bee_t *b );
+
+/* bee_user.c */
+bee_user_t *bee_user_new( bee_t *bee, struct im_connection *ic, const char *handle );
+int bee_user_free( bee_t *bee, struct im_connection *ic, const char *handle );
+bee_user_t *bee_user_by_handle( bee_t *bee, struct im_connection *ic, const char *handle );
+
+#endif /* __BEE_H__ */
diff --git a/protocols/bee_user.c b/protocols/bee_user.c
new file mode 100644
index 00000000..538aa509
--- /dev/null
+++ b/protocols/bee_user.c
@@ -0,0 +1,82 @@
+ /********************************************************************\
+ * BitlBee -- An IRC to other IM-networks gateway *
+ * *
+ * Copyright 2002-2010 Wilmer van der Gaast and others *
+ \********************************************************************/
+
+/* Stuff to handle, save and search buddies */
+
+/*
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License with
+ the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
+ if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#define BITLBEE_CORE
+#include "bitlbee.h"
+
+bee_user_t *bee_user_new( bee_t *bee, struct im_connection *ic, const char *handle )
+{
+ bee_user_t *bu;
+
+ if( bee_user_by_handle( bee, ic, handle ) != NULL )
+ return NULL;
+
+ bu = g_new0( bee_user_t, 1 );
+ bu->bee = bee;
+ bu->ic = ic;
+ bu->handle = g_strdup( handle );
+ bee->users = g_slist_prepend( bee->users, bu );
+
+ if( bee->ui->user_new )
+ bee->ui->user_new( bee, bu );
+
+ return bu;
+}
+
+int bee_user_free( bee_t *bee, struct im_connection *ic, const char *handle )
+{
+ bee_user_t *bu;
+
+ if( ( bu = bee_user_by_handle( bee, ic, handle ) ) == NULL )
+ return 0;
+
+ if( bee->ui->user_free )
+ bee->ui->user_free( bee, bu );
+
+ g_free( bu->handle );
+ g_free( bu->fullname );
+ g_free( bu->group );
+ g_free( bu->away );
+ g_free( bu->status_msg );
+
+ bee->users = g_slist_remove( bee->users, bu );
+
+ return 1;
+}
+
+bee_user_t *bee_user_by_handle( bee_t *bee, struct im_connection *ic, const char *handle )
+{
+ GSList *l;
+
+ for( l = bee->users; l; l = l->next )
+ {
+ bee_user_t *bu = l->data;
+
+ if( bu->ic == ic && ic->acc->prpl->handle_cmp( bu->handle, handle ) )
+ return bu;
+ }
+
+ return NULL;
+}
diff --git a/protocols/nogaim.c b/protocols/nogaim.c
index c326e378..618616c7 100644
--- a/protocols/nogaim.c
+++ b/protocols/nogaim.c
@@ -198,8 +198,8 @@ static void serv_got_crap( struct im_connection *ic, char *format, ... )
text = g_strdup_vprintf( format, params );
va_end( params );
- if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) ||
- ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) )
+ if( ( g_strcasecmp( set_getstr( &ic->irc->b->set, "strip_html" ), "always" ) == 0 ) ||
+ ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->b->set, "strip_html" ) ) )
strip_html( text );
/* Try to find a different connection on the same protocol. */
@@ -264,7 +264,6 @@ void imcb_connected( struct im_connection *ic )
{
irc_t *irc = ic->irc;
struct chat *c;
- user_t *u;
/* MSN servers sometimes redirect you to a different server and do
the whole login sequence again, so these "late" calls to this
@@ -272,8 +271,6 @@ void imcb_connected( struct im_connection *ic )
if( ic->flags & OPT_LOGGED_IN )
return;
- u = user_find( ic->irc, ic->irc->nick );
-
imcb_log( ic, "Logged in" );
ic->keepalive = b_timeout_add( 60000, send_keepalive, ic );
@@ -286,6 +283,7 @@ void imcb_connected( struct im_connection *ic )
exponential backoff timer. */
ic->acc->auto_reconnect_delay = 0;
+ /*
for( c = irc->chatrooms; c; c = c->next )
{
if( c->acc != ic->acc )
@@ -294,6 +292,7 @@ void imcb_connected( struct im_connection *ic )
if( set_getbool( &c->set, "auto_join" ) )
chat_join( irc, c, NULL );
}
+ */
}
gboolean auto_reconnect( gpointer data, gint fd, b_input_condition cond )
@@ -359,7 +358,7 @@ void imc_logout( struct im_connection *ic, int allow_reconnect )
{
/* Uhm... This is very sick. */
}
- else if( allow_reconnect && set_getbool( &irc->set, "auto_reconnect" ) &&
+ else if( allow_reconnect && set_getbool( &irc->b->set, "auto_reconnect" ) &&
set_getbool( &a->set, "auto_reconnect" ) &&
( delay = account_reconnect_delay( a ) ) > 0 )
{
@@ -390,7 +389,7 @@ void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *g
if( user_findhandle( ic, handle ) )
{
- if( set_getbool( &irc->set, "debug" ) )
+ if( set_getbool( &irc->b->set, "debug" ) )
imcb_log( ic, "User already exists, ignoring add request: %s", handle );
return;
@@ -469,7 +468,7 @@ void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char
u->realname = g_strdup( realname );
- if( ( ic->flags & OPT_LOGGED_IN ) && set_getbool( &ic->irc->set, "display_namechanges" ) )
+ if( ( ic->flags & OPT_LOGGED_IN ) && set_getbool( &ic->irc->b->set, "display_namechanges" ) )
imcb_log( ic, "User `%s' changed name to `%s'", u->nick, u->realname );
}
@@ -517,7 +516,7 @@ void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const c
/* Some processing to make sure this string is a valid IRC nickname. */
nick_strip( newnick );
- if( set_getbool( &ic->irc->set, "lcnicks" ) )
+ if( set_getbool( &ic->irc->b->set, "lcnicks" ) )
nick_lc( newnick );
if( strcmp( u->nick, newnick ) != 0 )
@@ -625,14 +624,14 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
if( !u )
{
- if( g_strcasecmp( set_getstr( &ic->irc->set, "handle_unknown" ), "add" ) == 0 )
+ if( g_strcasecmp( set_getstr( &ic->irc->b->set, "handle_unknown" ), "add" ) == 0 )
{
imcb_add_buddy( ic, (char*) handle, NULL );
u = user_findhandle( ic, (char*) handle );
}
else
{
- if( set_getbool( &ic->irc->set, "debug" ) || g_strcasecmp( set_getstr( &ic->irc->set, "handle_unknown" ), "ignore" ) != 0 )
+ if( set_getbool( &ic->irc->b->set, "debug" ) || g_strcasecmp( set_getstr( &ic->irc->b->set, "handle_unknown" ), "ignore" ) != 0 )
{
imcb_log( ic, "imcb_buddy_status() for unknown handle %s:", handle );
imcb_log( ic, "flags = %d, state = %s, message = %s", flags,
@@ -692,14 +691,14 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
}
/* LISPy... */
- if( ( set_getbool( &ic->irc->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */
+ if( ( set_getbool( &ic->irc->b->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */
( u->online ) && /* Don't touch offline people */
( ( ( u->online != oo ) && !u->away ) || /* Voice joining people */
( ( u->online == oo ) && ( oa == !u->away ) ) ) ) /* (De)voice people changing state */
{
char *from;
- if( set_getbool( &ic->irc->set, "simulate_netsplit" ) )
+ if( set_getbool( &ic->irc->b->set, "simulate_netsplit" ) )
{
from = g_strdup( ic->irc->myhost );
}
@@ -724,18 +723,18 @@ void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, ui
if( !u )
{
- char *h = set_getstr( &irc->set, "handle_unknown" );
+ char *h = set_getstr( &irc->b->set, "handle_unknown" );
if( g_strcasecmp( h, "ignore" ) == 0 )
{
- if( set_getbool( &irc->set, "debug" ) )
+ if( set_getbool( &irc->b->set, "debug" ) )
imcb_log( ic, "Ignoring message from unknown handle %s", handle );
return;
}
else if( g_strncasecmp( h, "add", 3 ) == 0 )
{
- int private = set_getbool( &irc->set, "private" );
+ int private = set_getbool( &irc->b->set, "private" );
if( h[3] )
{
@@ -756,8 +755,8 @@ void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, ui
}
}
- if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) ||
- ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) )
+ if( ( g_strcasecmp( set_getstr( &ic->irc->b->set, "strip_html" ), "always" ) == 0 ) ||
+ ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->b->set, "strip_html" ) ) )
strip_html( msg );
wrapped = word_wrap( msg, 425 );
@@ -769,7 +768,7 @@ void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags )
{
user_t *u;
- if( !set_getbool( &ic->irc->set, "typing_notice" ) )
+ if( !set_getbool( &ic->irc->b->set, "typing_notice" ) )
return;
if( ( u = user_findhandle( ic, handle ) ) )
@@ -800,7 +799,7 @@ struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle )
c->channel = g_strdup_printf( "&chat_%03d", ic->irc->c_id++ );
c->topic = g_strdup_printf( "BitlBee groupchat: \"%s\". Please keep in mind that root-commands won't work here. Have fun!", c->title );
- if( set_getbool( &ic->irc->set, "debug" ) )
+ if( set_getbool( &ic->irc->b->set, "debug" ) )
imcb_log( ic, "Creating new conversation: (id=%p,handle=%s)", c, handle );
return c;
@@ -812,7 +811,7 @@ void imcb_chat_free( struct groupchat *c )
struct groupchat *l;
GList *ir;
- if( set_getbool( &ic->irc->set, "debug" ) )
+ if( set_getbool( &ic->irc->b->set, "debug" ) )
imcb_log( ic, "You were removed from conversation %p", c );
if( c )
@@ -859,8 +858,8 @@ void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t fl
u = user_findhandle( ic, who );
- if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) ||
- ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) )
+ if( ( g_strcasecmp( set_getstr( &ic->irc->b->set, "strip_html" ), "always" ) == 0 ) ||
+ ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->b->set, "strip_html" ) ) )
strip_html( msg );
wrapped = word_wrap( msg, 425 );
@@ -905,8 +904,8 @@ void imcb_chat_topic( struct groupchat *c, char *who, char *topic, time_t set_at
else
u = user_findhandle( ic, who );
- if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) ||
- ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) )
+ if( ( g_strcasecmp( set_getstr( &ic->irc->b->set, "strip_html" ), "always" ) == 0 ) ||
+ ( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->b->set, "strip_html" ) ) )
strip_html( topic );
g_free( c->topic );
@@ -924,7 +923,7 @@ void imcb_chat_add_buddy( struct groupchat *b, const char *handle )
user_t *u = user_findhandle( b->ic, handle );
int me = 0;
- if( set_getbool( &b->ic->irc->set, "debug" ) )
+ if( set_getbool( &b->ic->irc->b->set, "debug" ) )
imcb_log( b->ic, "User %s added to conversation %p", handle, b );
/* It might be yourself! */
@@ -959,7 +958,7 @@ void imcb_chat_remove_buddy( struct groupchat *b, const char *handle, const char
user_t *u;
int me = 0;
- if( set_getbool( &b->ic->irc->set, "debug" ) )
+ if( set_getbool( &b->ic->irc->b->set, "debug" ) )
imcb_log( b->ic, "User %s removed from conversation %p (%s)", handle, b, reason ? reason : "" );
/* It might be yourself! */
@@ -1017,7 +1016,7 @@ char *set_eval_away_devoice( set_t *set, char *value )
/* Horror.... */
- if( st != set_getbool( &irc->set, "away_devoice" ) )
+ if( st != set_getbool( &irc->b->set, "away_devoice" ) )
{
char list[80] = "";
user_t *u = irc->users;
@@ -1106,7 +1105,7 @@ int imc_away_send_update( struct im_connection *ic )
char *away, *msg = NULL;
away = set_getstr( &ic->acc->set, "away" ) ?
- : set_getstr( &ic->irc->set, "away" );
+ : set_getstr( &ic->irc->b->set, "away" );
if( away && *away )
{
GList *m = ic->acc->prpl->away_states( ic );
@@ -1117,7 +1116,7 @@ int imc_away_send_update( struct im_connection *ic )
{
away = NULL;
msg = set_getstr( &ic->acc->set, "status" ) ?
- : set_getstr( &ic->irc->set, "status" );
+ : set_getstr( &ic->irc->b->set, "status" );
}
ic->acc->prpl->set_away( ic, away, msg );
diff --git a/protocols/user.c b/protocols/user.c
deleted file mode 100644
index f014586b..00000000
--- a/protocols/user.c
+++ /dev/null
@@ -1,106 +0,0 @@
- /********************************************************************\
- * BitlBee -- An IRC to other IM-networks gateway *
- * *
- * Copyright 2002-2004 Wilmer van der Gaast and others *
- \********************************************************************/
-
-/* Stuff to handle, save and search buddies */
-
-/*
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License with
- the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
- if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#define BITLBEE_CORE
-#include "bitlbee.h"
-
-user_t *user_add( irc_t *irc, char *nick )
-{
- user_t *u, *lu = NULL;
- char *key;
-
- if( !nick_ok( nick ) )
- return( NULL );
-
- if( user_find( irc, nick ) != NULL )
- return( NULL );
-
- return( u );
-}
-
-int user_del( irc_t *irc, char *nick )
-{
- user_t *u, *t;
- char *key;
- gpointer okey, ovalue;
-
- if( !nick_ok( nick ) )
- return( 0 );
-
- u = irc->users;
- t = NULL;
- while( u )
- {
- if( nick_cmp( u->nick, nick ) == 0 )
- {
- /* Get this key now already, since "nick" might be free()d
- at the time we start playing with the hash... */
- key = g_strdup( nick );
- nick_lc( key );
-
- if( t )
- t->next = u->next;
- else
- irc->users = u->next;
- if( u->online )
- irc_kill( irc, u );
- g_free( u->nick );
- if( u->nick != u->user ) g_free( u->user );
- if( u->nick != u->host ) g_free( u->host );
- if( u->nick != u->realname ) g_free( u->realname );
- g_free( u->group );
- g_free( u->away );
- g_free( u->handle );
- g_free( u->sendbuf );
- if( u->sendbuf_timer ) b_event_remove( u->sendbuf_timer );
- g_free( u );
-
- return( 1 );
- }
- u = (t=u)->next;
- }
-
- return( 0 );
-}
-
-user_t *user_findhandle( struct im_connection *ic, const char *handle )
-{
- user_t *u;
- char *nick;
-
- /* First, let's try a hash lookup. If it works, it's probably faster. */
- if( ( nick = g_hash_table_lookup( ic->acc->nicks, handle ) ) &&
- ( u = user_find( ic->irc, nick ) ) &&
- ( ic->acc->prpl->handle_cmp( handle, u->handle ) == 0 ) )
- return u;
-
- /* However, it doesn't always work, so in that case we'll have to dig
- through the whole userlist. :-( */
- for( u = ic->irc->users; u; u = u->next )
- if( u->ic == ic && u->handle && ic->acc->prpl->handle_cmp( u->handle, handle ) == 0 )
- return u;
-
- return NULL;
-}
diff --git a/protocols/user.h b/protocols/user.h
deleted file mode 100644
index 26697a3a..00000000
--- a/protocols/user.h
+++ /dev/null
@@ -1,40 +0,0 @@
- /********************************************************************\
- * BitlBee -- An IRC to other IM-networks gateway *
- * *
- * Copyright 2002-2004 Wilmer van der Gaast and others *
- \********************************************************************/
-
-/* Stuff to handle, save and search buddies */
-
-/*
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License with
- the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
- if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#ifndef __USER_H__
-#define __USER_H__
-
-struct __USER
-{
- struct im_connection *ic;
- char *handle;
- char *fullname;
- char *group;
-
- char *away;
- char *status_msg;
-} user_t;
-
-#endif /* __USER_H__ */