1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import time
28
30 """
31 Information concerning each event
32 """
33
34 - def __init__(self, type_, time_, parameters, show_in_roster=False,
35 show_in_systray=True):
36 """
37 type_ in chat, normal, file-request, file-error, file-completed,
38 file-request-error, file-send-error, file-stopped, gc_msg, pm,
39 printed_chat, printed_gc_msg, printed_marked_gc_msg, printed_pm,
40 gc-invitation, subscription_request, unsubscribedm jingle-incoming
41
42 parameters is (per type_):
43 chat, normal, pm: [message, subject, kind, time, encrypted, resource,
44 msg_id]
45 where kind in error, incoming
46 file-*: file_props
47 gc_msg: None
48 printed_chat: control
49 printed_*: None
50 messages that are already printed in chat, but not read
51 gc-invitation: [room_jid, reason, password, is_continued]
52 subscription_request: [text, nick]
53 unsubscribed: contact
54 jingle-incoming: (fulljid, sessionid, content_types)
55 """
56 self.type_ = type_
57 self.time_ = time_
58 self.parameters = parameters
59 self.show_in_roster = show_in_roster
60 self.show_in_systray = show_in_systray
61
62 self.jid = None
63 self.account = None
64
66 """
67 Information concerning all events
68 """
69
71 self._events = {}
72 self._event_added_listeners = []
73 self._event_removed_listeners = []
74
76 """
77 Add a listener when an event is added to the queue
78 """
79 if not listener in self._event_added_listeners:
80 self._event_added_listeners.append(listener)
81
83 """
84 Remove a listener when an event is added to the queue
85 """
86 if listener in self._event_added_listeners:
87 self._event_added_listeners.remove(listener)
88
90 """
91 Add a listener when an event is removed from the queue
92 """
93 if not listener in self._event_removed_listeners:
94 self._event_removed_listeners.append(listener)
95
97 """
98 Remove a listener when an event is removed from the queue
99 """
100 if listener in self._event_removed_listeners:
101 self._event_removed_listeners.remove(listener)
102
104 for listener in self._event_added_listeners:
105 listener(event)
106
108 for listener in self._event_removed_listeners:
109 listener(event_list)
110
112 if old_name in self._events:
113 self._events[new_name] = self._events[old_name]
114 del self._events[old_name]
115
118
120 return self._events.keys()
121
124
125 - def create_event(self, type_, parameters, time_ = time.time(),
126 show_in_roster = False, show_in_systray = True):
127 return Event(type_, time_, parameters, show_in_roster,
128 show_in_systray)
129
142
143 - def remove_events(self, account, jid, event = None, types = []):
144 """
145 If event is not specified, remove all events from this jid, optionally
146 only from given type return True if no such event found
147 """
148 if account not in self._events:
149 return True
150 if jid not in self._events[account]:
151 return True
152 if event:
153 if event in self._events[account][jid]:
154 if len(self._events[account][jid]) == 1:
155 del self._events[account][jid]
156 else:
157 self._events[account][jid].remove(event)
158 self.fire_event_removed([event])
159 return
160 else:
161 return True
162 if types:
163 new_list = []
164 removed_list = []
165 for ev in self._events[account][jid]:
166 if ev.type_ not in types:
167 new_list.append(ev)
168 else:
169 removed_list.append(ev)
170 if len(new_list) == len(self._events[account][jid]):
171 return True
172 if new_list:
173 self._events[account][jid] = new_list
174 else:
175 del self._events[account][jid]
176 self.fire_event_removed(removed_list)
177 return
178
179 self.fire_event_removed(self._events[account][jid])
180 del self._events[account][jid]
181
183 if account not in self._events:
184 return
185 if old_jid not in self._events[account]:
186 return
187 if new_jid in self._events[account]:
188 self._events[account][new_jid] += self._events[account][old_jid]
189 else:
190 self._events[account][new_jid] = self._events[account][old_jid]
191 del self._events[account][old_jid]
192
195
196 - def get_events(self, account, jid = None, types = []):
197 """
198 Return all events from the given account of the form {jid1: [], jid2:
199 []}. If jid is given, returns all events from the given jid in a list: []
200 optionally only from given type
201 """
202 if account not in self._events:
203 return []
204 if not jid:
205 events_list = {}
206 for jid_ in self._events[account]:
207 events = []
208 for ev in self._events[account][jid_]:
209 if not types or ev.type_ in types:
210 events.append(ev)
211 if events:
212 events_list[jid_] = events
213 return events_list
214 if jid not in self._events[account]:
215 return []
216 events_list = []
217 for ev in self._events[account][jid]:
218 if not types or ev.type_ in types:
219 events_list.append(ev)
220 return events_list
221
223 """
224 Return the first event of type type_ if given
225 """
226 events_list = self.get_events(account, jid, type_)
227
228 first_event_time = time.time() + 1
229 first_event = None
230 for event in events_list:
231 if event.time_ < first_event_time:
232 first_event_time = event.time_
233 first_event = event
234 return first_event
235
236 - def _get_nb_events(self, account = None, jid = None, attribute = None, types
237 = []):
238 """
239 Return the number of pending events
240 """
241 nb = 0
242 if account:
243 accounts = [account]
244 else:
245 accounts = self._events.keys()
246 for acct in accounts:
247 if acct not in self._events:
248 continue
249 if jid:
250 jids = [jid]
251 else:
252 jids = self._events[acct].keys()
253 for j in jids:
254 if j not in self._events[acct]:
255 continue
256 for event in self._events[acct][j]:
257 if types and event.type_ not in types:
258 continue
259 if not attribute or \
260 attribute == 'systray' and event.show_in_systray or \
261 attribute == 'roster' and event.show_in_roster:
262 nb += 1
263 return nb
264
283
285 """
286 Get the first event
287
288 events is in the form {account1: {jid1: [ev1, ev2], },. }
289 """
290
291 first_event_time = time.time() + 1
292 first_account = None
293 first_jid = None
294 first_event = None
295 for account in events:
296 for jid in events[account]:
297 for event in events[account][jid]:
298 if event.time_ < first_event_time:
299 first_event_time = event.time_
300 first_account = account
301 first_jid = jid
302 first_event = event
303 return first_account, first_jid, first_event
304
306 """
307 Return the number of events displayed in roster
308 """
309 return self._get_nb_events(attribute = 'systray', types = types)
310
312 """
313 Return all events that must be displayed in systray:
314 {account1: {jid1: [ev1, ev2], },. }
315 """
316 return self._get_some_events('systray')
317
321
323 """
324 Return the number of events displayed in roster
325 """
326 return self._get_nb_events(attribute = 'roster', account = account,
327 jid = jid, types = types)
328
330 """
331 Return all events that must be displayed in roster:
332 {account1: {jid1: [ev1, ev2], },. }
333 """
334 return self._get_some_events('roster')
335