diff -ru mu-conference-0.6.0/include/conference.h mu-conference/include/conference.h --- mu-conference-0.6.0/include/conference.h 2003-11-14 23:19:43.000000000 -0500 +++ mu-conference/include/conference.h 2006-01-21 13:07:45.000000000 -0500 @@ -202,6 +202,7 @@ void con_room_log_new(cnr room); /* New Log */ void con_room_log_close(cnr room); /* Close logfile */ void con_room_send_invite(cnu sender, xmlnode node); /* Send invites */ +void con_room_decline(cnr room, xmlnode orig, xmlnode node, jid from); /* Send decline */ cnr con_room_new(cni c, jid roomid, jid owner, char *name, char *secret, int private, int xdata, int persist); /* Set up a new room */ void con_room_sendwalk(gpointer key, gpointer data, gpointer arg); Only in mu-conference/include: conference.h~ Only in mu-conference/src: admin.o diff -ru mu-conference-0.6.0/src/conference.c mu-conference/src/conference.c --- mu-conference-0.6.0/src/conference.c 2003-11-14 23:19:44.000000000 -0500 +++ mu-conference/src/conference.c 2006-01-21 22:14:38.000000000 -0500 @@ -473,6 +473,27 @@ return; } + /* the user won't exist if they are delining an invite. so we check for that first*/ + if(jp->type == JPACKET_MESSAGE && u == NULL) + { + xmlnode invite = NULL; + char* key = jid_full(jid_fix(jp->from)); + if((invite = g_hash_table_lookup(room->member,key)) == NULL) + { + key = jid_full(jid_user(jid_fix(jp->from))); + invite = g_hash_table_lookup(room->member,key); + } + if(invite != NULL) + { + con_room_decline(room,invite, jp->x, jp->from); +#ifndef _JCOMP + pth_mutex_release(&master->lock); +#else + g_mutex_unlock(master->lock); +#endif + return; + } + } /* Block message from users not already in the room */ if(jp->type == JPACKET_MESSAGE && u == NULL) { Only in mu-conference/src: conference.c~ Only in mu-conference/src: conference.o diff -ru mu-conference-0.6.0/src/conference_room.c mu-conference/src/conference_room.c --- mu-conference-0.6.0/src/conference_room.c 2003-11-14 23:19:45.000000000 -0500 +++ mu-conference/src/conference_room.c 2006-01-21 23:07:32.000000000 -0500 @@ -21,6 +21,100 @@ #include "conference.h" extern int deliver__flag; +void con_room_decline(cnr room, xmlnode orig, xmlnode node, jid from) +{ + xmlnode result; + xmlnode x; + xmlnode decline; + xmlnode reason_tag; + char *body, *user, *reason, *decliner; + pool p; + if(room == NULL || node == NULL) + { + log_warn(NAME, "[%s] Aborting - NULL attribute found", FZONE); + return; + } + + log_debug(NAME, "[%s] Sending room decline", FZONE); + + x = xmlnode_get_tag(node,"x"); + + if(!NSCHECK(x, NS_MUC_USER)) + { + /* we just return */ + return; + } + + decline = xmlnode_get_tag(x, "decline"); + user = xmlnode_get_attrib(decline, "to"); + reason = xmlnode_get_tag_data(decline,"reason"); + decliner = jid_full(jid_fix(from)); + + if(user == NULL) + { + log_debug(NAME, "[%s] No receipient, returning error", FZONE); + + jutil_error(node, TERROR_BAD); + deliver(dpacket_new(node),NULL); + return; + } + + /* determine the real jid of the user */ + cnu remote = g_hash_table_lookup(room->remote,user); + if(remote == NULL) + { + remote = con_room_usernick(room, user); + if(remote == NULL) + { + log_debug(NAME, "[%s] No %s in room", FZONE, user); + + jutil_error(node, TERROR_BAD); + deliver(dpacket_new(node),NULL); + return; + } + + user = jid_full(jid_fix(remote->realid)); + } + + p = xmlnode_pool(node); + if(reason == NULL) + { + reason = spools(p, "None given", p); + } + + body = spools(p, decliner, " has declined your invitation to ", jid_full(jid_fix(room->id)), "\nReason: ", reason,p); + + result = jutil_msgnew("normal", user, "Decline", body); + xmlnode_put_attrib(result, "from", jid_full(jid_fix(room->id))); + + x = xmlnode_insert_tag(result, "x"); + xmlnode_put_attrib(x, "xmlns",NS_X_CONFERENCE); + decline = xmlnode_insert_tag(x, "decline"); + xmlnode_put_attrib(decline, "from", decliner); + + reason_tag = xmlnode_insert_tag(decline,"reason"); + xmlnode_insert_cdata(reason_tag, reason, -1); + + log_debug(NAME, "[%s] >>>%s<<<", FZONE, xmlnode2str(result)); + + deliver(dpacket_new(result),NULL); + + char* key = jid_full(jid_fix(from)); + if(g_hash_table_lookup(room->member,key) == NULL) + { + key = jid_full(jid_user(jid_fix(from))); + if(g_hash_table_lookup(room->member,key) == NULL) + { + key = NULL; + } + } + if( key != NULL) + { + g_hash_table_remove(room->member,key); + } + return ; +} + /* Handles logging for each room, simply returning if logfile is not defined */ void con_room_log(cnr room, char *nick, char *message) { @@ -837,17 +931,10 @@ return; } - if(room->invitation == 1) - { - id = jid_new(xmlnode_pool(item), nick); + id = jid_new(xmlnode_pool(item), nick); - key = j_strdup(jid_full(jid_user(jid_fix(id)))); - g_hash_table_insert(room->member, key, (void*)item); - } - else - { - xmlnode_free(item); - } + key = j_strdup(jid_full(jid_user(jid_fix(id)))); + g_hash_table_insert(room->member, key, (void*)item); con_room_send_invite(from, xmlnode_get_tag(jp->x,"x")); return; Only in mu-conference/src: conference_room.c.orig Only in mu-conference/src: conference_room.c~ Only in mu-conference/src: conference_room.o Only in mu-conference/src: conference_user.o Only in mu-conference/src: hash.o Only in mu-conference/src: jcomp.mk Only in mu-conference/src: jcomp.mk~ Only in mu-conference/src: main.c Only in mu-conference/src: main.o Only in mu-conference/src: mu-conference Only in mu-conference/src: roles.o Only in mu-conference/src: utils.o Only in mu-conference/src: xdata.o Only in mu-conference/src: xdb.o