#include <jabberd.h>
#include <stdio.h>
#include <string.h>
#include <glib.h>
#include "hash.h"
#include "ns.h"
#define NAME "MU-Conference"
#undef VERSION
#ifndef _JCOMP
#define VERSION "0.6.0"
#else
#define VERSION "0.6.0-jcr"
#endif
#define FZONE funcstr(__FILE__,__FUNCTION__,__LINE__)
#define STATUS_MUC_SHOWN_JID "100"
#define STATUS_MUC_AFFCHANGE "101"
#define STATUS_MUC_SHOW_MEMBER "102"
#define STATUS_MUC_HIDE_MEMBER "103"
#define STATUS_MUC_CONF_CHANGE "104"
#define STATUS_MUC_HIDDEN_JID "109"
#define STATUS_MUC_CREATED "201"
#define STATUS_MUC_BANNED "301"
#define STATUS_MUC_NICKCHANGE "303"
#define STATUS_MUC_KICKED "307"
#define STATUS_MUC_REM_AFFCHG "321"
#define STATUS_MUC_REM_NONMEM "322"
#define STATUS_MUC_REM_SHUTDOWN "332"
#define TERROR_MUC_PASSWORD (terror){401, "Password required to join this room."}
#define TERROR_MUC_BANNED (terror){403, "You have been banned from this room."}
#define TERROR_MUC_VOICE (terror){403, "You do not have permission to talk in this room."}
#define TERROR_MUC_PRIVMSG (terror){403, "Private messages are not allowed in this room."}
#define TERROR_MUC_ROOM (terror){403, "Room creation is disabled."}
#define TERROR_MUC_CONFIG (terror){405, "You are disallowed access to room configuration"}
#define TERROR_MUC_OUTSIDE (terror){405, "You are not in this room"}
#define TERROR_MUC_INVITED (terror){407, "Invitation required to join this room."}
#define TERROR_MUC_FULL (terror){408, "Room is full."}
#define TERROR_MUC_NICK (terror){409, "Please choose a different nickname."}
#define TERROR_MUC_NICKREG (terror){409, "Reserved Nick - Please choose a different nickname."}
#define SEND_ALL 0
#define SEND_LEGACY 1
#define LOG_TEXT 0
#define LOG_XML 1
#define LOG_XHTML 2
typedef struct cnu_struct *cnu, _cnu;
typedef struct cni_struct
{
instance i;
#ifndef _JCOMP
xdbcache xdbc;
#else
void *xdbc;
#endif
GHashTable *rooms;
GHashTable *extbrowse;
xmlnode config;
int public;
int history;
#ifndef _JCOMP
mtq q;
#endif
int start;
char *day;
GHashTable *sadmin;
char *logdir;
int loader;
int roomlock;
int dynamic;
int shutdown;
#ifndef _JCOMP
pth_mutex_t lock;
#else
GMutex *lock;
#endif
GQueue *queue;
} *cni, _cni;
typedef struct cnr_struct
{
pool p;
cni master;
jid id;
jid creator;
char *name;
char *description;
char *secret;
GHashTable *owner;
GHashTable *remote;
GHashTable *local;
GHashTable *roster;
GHashTable *admin;
GHashTable *member;
GHashTable *outcast;
GHashTable *moderator;
GHashTable *participant;
int start;
int created;
int last;
int private;
int public;
int subjectlock;
int maxusers;
int persistent;
int moderated;
int defaulttype;
int visible;
int invitation;
int invites;
int locked;
int privmsg;
int legacy;
int count;
int hlast;
int packets;
xmlnode topic;
xmlnode *history;
char *note_leave, *note_join, *note_rename;
FILE *logfile;
int logformat;
GQueue *queue;
} *cnr, _cnr;
struct cnu_struct
{
cnr room;
pool p;
jid realid, localid;
xmlnode nick;
xmlnode presence;
xmlnode history;
int last;
int private;
int packets;
int legacy;
int leaving;
};
typedef struct trole_struct
{
int code;
char msg[64];
} trole;
typedef struct taffil_struct
{
int code;
char msg[64];
} taffil;
#define TAFFIL_OWNER (taffil){3, "owner"}
#define TAFFIL_ADMIN (taffil){2, "admin"}
#define TAFFIL_MEMBER (taffil){1, "member"}
#define TAFFIL_NONE (taffil){0, "none"}
#define TAFFIL_OUTCAST (taffil){-1, "outcast"}
#define TROLE_MODERATOR (trole){3, "moderator"}
#define TROLE_PARTICIPANT (trole){2, "participant"}
#define TROLE_VISITOR (trole){1, "visitor"}
#define TROLE_NONE (trole){0, "none"}
void con_room_log(cnr room, char *nick, char *message);
void con_room_log_new(cnr room);
void con_room_log_close(cnr room);
void con_room_send_invite(cnu sender, xmlnode node);
cnr con_room_new(cni c, jid roomid, jid owner, char *name, char *secret, int private, int xdata, int persist);
void con_room_sendwalk(gpointer key, gpointer data, gpointer arg);
void con_room_leaveall(gpointer key, gpointer data, gpointer arg);
void con_room_process(cnr room, cnu from, jpacket jp);
void con_room_outsider(cnr room, cnu from, jpacket jp);
cnu con_room_usernick(cnr room, char *nick);
void con_room_show_config(cnr room, xmlnode msg);
void con_room_send(cnr room, xmlnode x, int legacy);
void con_room_cleanup(cnr room);
void con_room_zap(cnr room);
void con_room_history_clear(cnr room);
cnu con_user_new(cnr room, jid id);
void con_user_nick(cnu user, char *nick, xmlnode data);
void con_user_enter(cnu user, char *nick, int created);
void con_user_send(cnu to, cnu from, xmlnode x);
void con_user_zap(cnu user, xmlnode data);
void con_user_process(cnu to, cnu from, jpacket jp);
xmlnode add_extended_presence(cnu from, cnu to, xmlnode presence, char *status, char *reason, char *actor);
int is_sadmin(cni master, jid user);
int is_owner(cnr room, jid user);
int is_admin(cnr room, jid user);
int is_member(cnr room, jid user);
int is_outcast(cnr room, jid user);
int is_moderator(cnr room, jid user);
int is_participant(cnr room, jid user);
int is_visitor(cnr room, jid user);
int in_room(cnr room, jid user);
int is_legacy(cnu user);
int is_leaving(cnr room, jid user);
int is_registered(cni master, char *user, char *nick);
void con_send_alert(cnu user, char *text, char *subject, char *status);
void con_send_room_status(cnr room, char *status);
char *linesplit(char **entry);
char *funcstr(char *file, char *function, int line);
char *itoa(int number, char *result);
int minuteget(time_t tin);
char *timeget(time_t tin);
char *dateget(time_t tin);
void update_presence(cnu user);
void insert_item_error(xmlnode node, char *code, char *msg);
int add_roster(cnr room, jid userid);
int remove_roster(cnr room, jid userid);
xmlnode get_roster(cnr room, jid userid);
char *extractAction(char *origin, pool p);
int isPrime(unsigned long n);
jid jid_fix(jid id);
xmlnode add_xdata_boolean(char *label, char *var, int data);
xmlnode add_xdata_text(char *label, int type, char *var, char *data);
xmlnode add_xdata_desc(char *label);
void add_xdata_add_rid(gpointer key, gpointer data, gpointer arg);
void xdata_handler(cnr room, cnu user, jpacket packet);
void xdata_room_config(cnr room, cnu user, int new, xmlnode query);
void con_get_banlist(gpointer key, gpointer data, gpointer arg);
void adm_user_kick(cnu user, cnu target, char *reason);
void con_parse_item(cnu sender, jpacket jp);
taffil affiliation_level(cnr room, jid user);
trole role_level(cnr room, jid user);
int add_affiliate(GHashTable *hash, jid userid, xmlnode details);
int remove_affiliate(GHashTable *hash, jid userid);
xmlnode revoke_affiliate(cnr room, GHashTable *hash, jid userid);
void change_affiliate(char *role, cnu sender, jid user, char *reason, jid by);
void add_role(GHashTable *hash, cnu user);
void revoke_role(GHashTable *hash, cnu user);
void change_role(char *role, cnu sender, jid user, char *reason);
int xdb_room_lists_set(cnr room);
void xdb_room_set(cnr room);
void xdb_rooms_get(cni master);
void xdb_room_clear(cnr room);
int set_data(cni master, char *nick, char *jabberid, xmlnode node, int remove);
xmlnode get_data_bynick(cni master, char *nick);
xmlnode get_data_byjid(cni master, char *jabberid);