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