aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--protocols/jabber/jabber.c26
-rw-r--r--protocols/jabber/jabber.h1
-rw-r--r--protocols/jabber/jabber_util.c38
-rw-r--r--protocols/jabber/presence.c15
4 files changed, 76 insertions, 4 deletions
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index 21633973..05ff8047 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -172,6 +172,24 @@ static void jabber_keepalive( struct gaim_connection *gc )
jabber_write( gc, "\n", 1 );
}
+static void jabber_add_permit( struct gaim_connection *gc, char *who )
+{
+ presence_send_request( gc, who, "subscribed" );
+}
+
+static void jabber_rem_permit( struct gaim_connection *gc, char *who )
+{
+ presence_send_request( gc, who, "unsubscribed" );
+}
+
+static void jabber_add_deny( struct gaim_connection *gc, char *who )
+{
+}
+
+static void jabber_rem_deny( struct gaim_connection *gc, char *who )
+{
+}
+
void jabber_init()
{
struct prpl *ret = g_new0( struct prpl, 1 );
@@ -193,10 +211,10 @@ void jabber_init()
// ret->chat_leave = jabber_chat_leave;
// ret->chat_open = jabber_chat_open;
ret->keepalive = jabber_keepalive;
-// ret->add_permit = jabber_add_permit;
-// ret->rem_permit = jabber_rem_permit;
-// ret->add_deny = jabber_add_deny;
-// ret->rem_deny = jabber_rem_deny;
+ ret->add_permit = jabber_add_permit;
+ ret->rem_permit = jabber_rem_permit;
+ ret->add_deny = jabber_add_deny;
+ ret->rem_deny = jabber_rem_deny;
// ret->send_typing = jabber_send_typing;
ret->handle_cmp = g_strcasecmp;
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index 7a2c7783..f05c1c55 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -91,6 +91,7 @@ void jabber_cache_packet( struct gaim_connection *gc, struct xt_node *node );
struct xt_node *jabber_packet_from_cache( struct gaim_connection *gc, char *id );
const struct jabber_away_state *jabber_away_state_by_code( char *code );
const struct jabber_away_state *jabber_away_state_by_name( char *name );
+void jabber_buddy_ask( struct gaim_connection *gc, char *handle );
extern const struct jabber_away_state jabber_away_state_list[];
diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c
index e7a161cc..3a0d2004 100644
--- a/protocols/jabber/jabber_util.c
+++ b/protocols/jabber/jabber_util.c
@@ -148,3 +148,41 @@ const struct jabber_away_state *jabber_away_state_by_name( char *name )
return NULL;
}
+
+struct jabber_buddy_ask_data
+{
+ struct gaim_connection *gc;
+ char *handle;
+ char *realname;
+};
+
+static void jabber_buddy_ask_yes( gpointer w, struct jabber_buddy_ask_data *bla )
+{
+ presence_send_request( bla->gc, bla->handle, "subscribed" );
+
+ if( find_buddy( bla->gc, bla->handle ) == NULL )
+ show_got_added( bla->gc, bla->handle, NULL );
+
+ g_free( bla->handle );
+ g_free( bla );
+}
+
+static void jabber_buddy_ask_no( gpointer w, struct jabber_buddy_ask_data *bla )
+{
+ presence_send_request( bla->gc, bla->handle, "subscribed" );
+
+ g_free( bla->handle );
+ g_free( bla );
+}
+
+void jabber_buddy_ask( struct gaim_connection *gc, char *handle )
+{
+ struct jabber_buddy_ask_data *bla = g_new0( struct jabber_buddy_ask_data, 1 );
+ char *buf;
+
+ bla->gc = gc;
+ bla->handle = g_strdup( handle );
+
+ buf = g_strdup_printf( "The user %s wants to add you to his/her buddy list.", handle );
+ do_ask_dialog( gc, buf, bla, jabber_buddy_ask_yes, jabber_buddy_ask_no );
+}
diff --git a/protocols/jabber/presence.c b/protocols/jabber/presence.c
index fa9c1248..1b8008b8 100644
--- a/protocols/jabber/presence.c
+++ b/protocols/jabber/presence.c
@@ -41,6 +41,21 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data )
serv_got_update( gc, from, 1, 0, 0, 0, 0, 0 );
else if( strcmp( type, "unavailable" ) == 0 )
serv_got_update( gc, from, 0, 0, 0, 0, 0, 0 );
+ else if( strcmp( type, "subscribe" ) == 0 )
+ jabber_buddy_ask( gc, from );
+ else if( strcmp( type, "subscribed" ) == 0 )
+ serv_got_crap( gc, "%s just accepted your authorization request", from );
+ else if( strcmp( type, "unsubscribe" ) == 0 || strcmp( type, "unsubscribed" ) == 0 )
+ {
+ /* Do nothing here. Plenty of control freaks or over-curious
+ souls get excited when they can see who still has them in
+ their buddy list and who finally removed them. Somehow I
+ got the impression that those are the people who get
+ removed from many buddy lists for "some" reason...
+
+ If you're one of those people, this is your chance to write
+ your first line of code in C... */
+ }
else
{
printf( "Received PRES from %s:\n", from );