Package common :: Module events
[hide private]
[frames] | no frames]

Source Code for Module common.events

  1  # -*- coding:utf-8 -*- 
  2  ## src/common/events.py 
  3  ## 
  4  ## Copyright (C) 2006 Jean-Marie Traissard <jim AT lapin.org> 
  5  ##                    Nikos Kouremenos <kourem AT gmail.com> 
  6  ## Copyright (C) 2006-2010 Yann Leboulanger <asterix AT lagaule.org> 
  7  ## Copyright (C) 2007 Julien Pivotto <roidelapluie AT gmail.com> 
  8  ## Copyright (C) 2007-2008 Stephan Erb <steve-e AT h3c.de> 
  9  ## Copyright (C) 2008 Brendan Taylor <whateley AT gmail.com> 
 10  ##                    Jonathan Schleifer <js-gajim AT webkeks.org> 
 11  ## 
 12  ## This file is part of Gajim. 
 13  ## 
 14  ## Gajim is free software; you can redistribute it and/or modify 
 15  ## it under the terms of the GNU General Public License as published 
 16  ## by the Free Software Foundation; version 3 only. 
 17  ## 
 18  ## Gajim is distributed in the hope that it will be useful, 
 19  ## but WITHOUT ANY WARRANTY; without even the implied warranty of 
 20  ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 21  ## GNU General Public License for more details. 
 22  ## 
 23  ## You should have received a copy of the GNU General Public License 
 24  ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 
 25  ## 
 26   
 27  import time 
 28   
29 -class Event:
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 # Set when adding the event 62 self.jid = None 63 self.account = None
64
65 -class Events:
66 """ 67 Information concerning all events 68 """ 69
70 - def __init__(self):
71 self._events = {} # list of events {acct: {jid1: [E1, E2]}, } 72 self._event_added_listeners = [] 73 self._event_removed_listeners = []
74
75 - def event_added_subscribe(self, listener):
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
82 - def event_added_unsubscribe(self, listener):
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
89 - def event_removed_subscribe(self, listener):
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
96 - def event_removed_unsubscribe(self, listener):
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
103 - def fire_event_added(self, event):
104 for listener in self._event_added_listeners: 105 listener(event)
106
107 - def fire_event_removed(self, event_list):
108 for listener in self._event_removed_listeners: 109 listener(event_list)
110
111 - def change_account_name(self, old_name, new_name):
112 if old_name in self._events: 113 self._events[new_name] = self._events[old_name] 114 del self._events[old_name]
115
116 - def add_account(self, account):
117 self._events[account] = {}
118
119 - def get_accounts(self):
120 return self._events.keys()
121
122 - def remove_account(self, account):
123 del self._events[account]
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
130 - def add_event(self, account, jid, event):
131 # No such account before ? 132 if account not in self._events: 133 self._events[account] = {jid: [event]} 134 # no such jid before ? 135 elif jid not in self._events[account]: 136 self._events[account][jid] = [event] 137 else: 138 self._events[account][jid].append(event) 139 event.jid = jid 140 event.account = account 141 self.fire_event_added(event)
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: # remove only one 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 = [] # list of events to keep 164 removed_list = [] # list of removed events 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 # no event nor type given, remove them all 179 self.fire_event_removed(self._events[account][jid]) 180 del self._events[account][jid]
181
182 - def change_jid(self, account, old_jid, new_jid):
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
193 - def get_nb_events(self, types = [], account = None):
194 return self._get_nb_events(types = types, account = account)
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 = {} # list of events 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 = [] # list of events 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
222 - def get_first_event(self, account, jid = None, type_ = None):
223 """ 224 Return the first event of type type_ if given 225 """ 226 events_list = self.get_events(account, jid, type_) 227 # be sure it's bigger than latest event 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
265 - def _get_some_events(self, attribute):
266 """ 267 Attribute in systray, roster 268 """ 269 events = {} 270 for account in self._events: 271 events[account] = {} 272 for jid in self._events[account]: 273 events[account][jid] = [] 274 for event in self._events[account][jid]: 275 if attribute == 'systray' and event.show_in_systray or \ 276 attribute == 'roster' and event.show_in_roster: 277 events[account][jid].append(event) 278 if not events[account][jid]: 279 del events[account][jid] 280 if not events[account]: 281 del events[account] 282 return events
283
284 - def _get_first_event_with_attribute(self, events):
285 """ 286 Get the first event 287 288 events is in the form {account1: {jid1: [ev1, ev2], },. } 289 """ 290 # be sure it's bigger than latest event 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
305 - def get_nb_systray_events(self, types = []):
306 """ 307 Return the number of events displayed in roster 308 """ 309 return self._get_nb_events(attribute = 'systray', types = types)
310
311 - def get_systray_events(self):
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
318 - def get_first_systray_event(self):
321
322 - def get_nb_roster_events(self, account = None, jid = None, types = []):
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
329 - def get_roster_events(self):
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