1 #ifndef __MCABBER_ROSTER_H__ 2 #define __MCABBER_ROSTER_H__ 1 3 4 #include <glib.h> 5 #include <time.h> 6 7 #include <mcabber/pgp.h> 8 #include <mcabber/config.h> 9 10 #define SPECIAL_BUFFER_STATUS_ID "[status]" 11 12 // Default UI priorities 13 #define ROSTER_UI_PRIO_MUC_MESSAGE 20 14 #define ROSTER_UI_PRIO_MUC_HL_MESSAGE 30 15 #define ROSTER_UI_PRIO_MUC_PRIV_MESSAGE 40 16 #define ROSTER_UI_PRIO_PRIVATE_MESSAGE 50 17 #define ROSTER_UI_PRIO_ATTENTION_MESSAGE 100 18 #define ROSTER_UI_PRIO_STATUS_WIN_MESSAGE 500 19 20 enum imstatus { 21 offline, 22 available, 23 freeforchat, 24 dontdisturb, 25 notavail, 26 away, 27 invisible, 28 imstatus_size 29 }; 30 31 extern char imstatus2char[]; // Should match enum above 32 33 enum imrole { 34 role_none, 35 role_moderator, 36 role_participant, 37 role_visitor, 38 imrole_size 39 }; 40 41 extern char *strrole[]; // Should match enum above 42 43 enum imaffiliation { 44 affil_none, 45 affil_owner, 46 affil_admin, 47 affil_member, 48 affil_outcast, 49 imaffiliation_size 50 }; 51 52 extern char *straffil[]; // Should match enum above 53 54 enum subscr { 55 sub_none = 0, 56 sub_pending = 1, 57 sub_to = 1 << 1, 58 sub_from = 1 << 2, 59 sub_both = sub_to|sub_from, 60 sub_remove = 1 << 3 61 }; 62 63 enum findwhat { 64 jidsearch, 65 namesearch 66 }; 67 68 enum setuiprio_ops { 69 prio_set, // Set priority 70 prio_max, // Set priority to max(specified, current) 71 prio_inc, // Increment priority 72 }; 73 74 extern char *strprintstatus[]; 75 76 // Note: do not change the ordering as these values are visible 77 // to the user (option 'muc_print_status')! 78 enum room_printstatus { 79 status_default, 80 status_none, 81 status_in_and_out, 82 status_all 83 }; 84 85 extern char *strautowhois[]; 86 87 enum room_autowhois { 88 autowhois_default, 89 autowhois_off, 90 autowhois_on 91 }; 92 93 extern char *strflagjoins[]; 94 95 enum room_flagjoins { 96 flagjoins_default, 97 flagjoins_none, 98 flagjoins_joins, 99 flagjoins_all 100 }; 101 102 struct role_affil { 103 enum { type_role, type_affil } type; 104 union { 105 enum imrole role; 106 enum imaffiliation affil; 107 } val; 108 }; 109 110 // Roster_type is a set of flags, so values should be 2^n 111 #define ROSTER_TYPE_USER 1U 112 #define ROSTER_TYPE_GROUP (1U<<1) 113 #define ROSTER_TYPE_AGENT (1U<<2) 114 #define ROSTER_TYPE_ROOM (1U<<3) 115 #define ROSTER_TYPE_SPECIAL (1U<<4) 116 117 // Flags: 118 #define ROSTER_FLAG_MSG 1U // Message not read 119 #define ROSTER_FLAG_HIDE (1U<<1) // Group hidden (or buddy window closed) 120 #define ROSTER_FLAG_LOCK (1U<<2) // Node should not be removed from buddylist 121 #define ROSTER_FLAG_USRLOCK (1U<<3) // Node should not be removed from buddylist 122 // ROSTER_FLAG_LOCAL (1U<<4) // Buddy not on server's roster (??) 123 124 #define XEP0085 125 126 struct xep0085 { 127 guint support; 128 guint last_state_sent; 129 guint last_state_rcvd; 130 }; 131 132 enum chatstate_support { 133 CHATSTATES_SUPPORT_UNKNOWN = 0, 134 CHATSTATES_SUPPORT_PROBED, 135 CHATSTATES_SUPPORT_NONE, 136 CHATSTATES_SUPPORT_OK 137 }; 138 139 struct pgp_data { 140 gchar *sign_keyid; // KeyId used by the contact to sign their presence/msg 141 #ifdef HAVE_GPGME 142 gpgme_sigsum_t last_sigsum; // Last signature summary 143 #endif 144 }; 145 146 /* Message event and chat state flags */ 147 #define ROSTER_EVENT_NONE 0U 148 /* XEP-85 Chat State Notifications */ 149 #define ROSTER_EVENT_COMPOSING (1U<<0) 150 #define ROSTER_EVENT_ACTIVE (1U<<1) 151 #define ROSTER_EVENT_PAUSED (1U<<2) 152 #define ROSTER_EVENT_INACTIVE (1U<<3) 153 #define ROSTER_EVENT_GONE (1U<<4) 154 155 extern GList *buddylist; 156 extern GList *current_buddy; 157 extern GList *alternate_buddy; 158 extern GList *last_activity_buddy; 159 160 // Macros... 161 162 #define BUDDATA(glist_node) ((glist_node)->data) 163 #define CURRENT_JID buddy_getjid(BUDDATA(current_buddy)) 164 165 // Prototypes... 166 void roster_init(void); 167 GSList *roster_add_group(const char *name); 168 GSList *roster_add_user(const char *jid, const char *name, const char *group, 169 guint type, enum subscr esub, gint on_server); 170 GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type); 171 void roster_del_user(const char *jid); 172 void roster_free(void); 173 void roster_setstatus(const char *jid, const char *resname, gchar prio, 174 enum imstatus bstat, const char *status_msg, 175 time_t timestamp, 176 enum imrole role, enum imaffiliation affil, 177 const char *realjid); 178 void roster_setflags(const char *jid, guint flags, guint value); 179 void roster_msg_setflag(const char *jid, guint special, guint value); 180 void roster_msg_update_unread(const char *jid, gboolean increment); 181 void roster_setuiprio(const char *jid, guint special, guint value, 182 enum setuiprio_ops action); 183 guint roster_getuiprio(const char *jid, guint special); 184 const char *roster_getname(const char *jid); 185 const char *roster_getnickname(const char *jid); 186 void roster_settype(const char *jid, guint type); 187 enum imstatus roster_getstatus(const char *jid, const char *resname); 188 const char *roster_getstatusmsg(const char *jid, const char *resname); 189 char roster_getprio(const char *jid, const char *resname); 190 guint roster_gettype(const char *jid); 191 guint roster_getsubscription(const char *jid); 192 void roster_unsubscribed(const char *jid); 193 194 void buddylist_defer_build(void); 195 void buddylist_build(void); 196 void buddy_hide_group(gpointer rosterdata, int hide); 197 void buddylist_set_hide_offline_buddies(int hide); 198 int buddylist_isset_filter(void); 199 int buddylist_is_status_filtered(enum imstatus status); 200 void buddylist_set_filter(guchar); 201 guchar buddylist_get_filter(void); 202 const char *buddy_getjid(gpointer rosterdata); 203 void buddy_setname(gpointer rosterdata, char *newname); 204 const char *buddy_getname(gpointer rosterdata); 205 void buddy_setnickname(gpointer rosterdata, const char *newname); 206 const char *buddy_getnickname(gpointer rosterdata); 207 void buddy_setinsideroom(gpointer rosterdata, guint inside); 208 guint buddy_getinsideroom(gpointer rosterdata); 209 void buddy_settopic(gpointer rosterdata, const char *newtopic); 210 const char *buddy_gettopic(gpointer rosterdata); 211 void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus); 212 enum room_printstatus buddy_getprintstatus(gpointer rosterdata); 213 void buddy_setautowhois(gpointer rosterdata, enum room_autowhois); 214 enum room_autowhois buddy_getautowhois(gpointer rosterdata); 215 void buddy_setflagjoins(gpointer rosterdata, enum room_flagjoins); 216 enum room_flagjoins buddy_getflagjoins(gpointer rosterdata); 217 void buddy_settype(gpointer rosterdata, guint type); 218 guint buddy_gettype(gpointer rosterdata); 219 guint buddy_getsubscription(gpointer rosterdata); 220 void buddy_setgroup(gpointer rosterdata, char *newgroupname); 221 const char *buddy_getgroupname(gpointer rosterdata); 222 gpointer buddy_getgroup(gpointer rosterdata); 223 enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname); 224 const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname); 225 time_t buddy_getstatustime(gpointer rosterdata, const char *resname); 226 gchar buddy_getresourceprio(gpointer rosterdata, const char *resname); 227 //int buddy_isresource(gpointer rosterdata); 228 GSList *buddy_getresources(gpointer rosterdata); 229 GSList *buddy_getresources_locale(gpointer rosterdata); 230 const char *buddy_getactiveresource(gpointer rosterdata); 231 void buddy_setactiveresource(gpointer rosterdata, const char *resname); 232 void buddy_resource_setname(gpointer rosterdata, const char *resname, 233 const char *newname); 234 void buddy_resource_setevents(gpointer rosterdata, const char *resname, 235 guint event); 236 guint buddy_resource_getevents(gpointer rosterdata, const char *resname); 237 void buddy_resource_setcaps(gpointer rosterdata, const char *resname, 238 const char *caps); 239 char *buddy_resource_getcaps(gpointer rosterdata, const char *resname); 240 struct xep0085 *buddy_resource_xep85(gpointer rosterdata, const char *resname); 241 struct pgp_data *buddy_resource_pgp(gpointer rosterdata, const char *resname); 242 enum imrole buddy_getrole(gpointer rosterdata, const char *resname); 243 enum imaffiliation buddy_getaffil(gpointer rosterdata, const char *resname); 244 const char *buddy_getrjid(gpointer rosterdata, const char *resname); 245 void buddy_del_all_resources(gpointer rosterdata); 246 void buddy_setflags(gpointer rosterdata, guint flags, guint value); 247 guint buddy_getflags(gpointer rosterdata); 248 guint buddy_getuiprio(gpointer rosterdata); 249 guint buddy_getunread(gpointer rosterdata); 250 void buddy_setonserverflag(gpointer rosterdata, guint onserver); 251 guint buddy_getonserverflag(gpointer rosterdata); 252 GList *buddy_search_jid(const char *jid); 253 GList *buddy_search(char *string); 254 void foreach_buddy(guint roster_type, 255 void (*pfunc)(gpointer rosterdata, void *param), 256 void *param); 257 void foreach_group_member(gpointer groupdata, 258 void (*pfunc)(gpointer rosterdata, void *param), 259 void *param); 260 gpointer unread_msg(gpointer rosterdata); 261 262 void unread_jid_add(const char *jid); 263 GList *unread_jid_get_list(void); 264 265 GSList *compl_list(guint type); 266 267 #endif /* __MCABBER_ROSTER_H__ */ 268 269 /* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2: For Vim users... */ 270