| Trees | Indices | Help |
|
|---|
|
|
1 ## 2 ## Copyright (C) 2006 Gajim Team 3 ## 4 ## This program is free software; you can redistribute it and/or modify 5 ## it under the terms of the GNU General Public License as published 6 ## by the Free Software Foundation; version 2 only. 7 ## 8 ## This program is distributed in the hope that it will be useful, 9 ## but WITHOUT ANY WARRANTY; without even the implied warranty of 10 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 ## GNU General Public License for more details. 12 ## 13 """ 14 Handles the jingle signalling protocol 15 """ 16 17 #TODO: 18 # * things in XEP 0176, including: 19 # - http://xmpp.org/extensions/xep-0176.html#protocol-restarts 20 # - http://xmpp.org/extensions/xep-0176.html#fallback 21 # * XEP 0177 (raw udp) 22 23 # * UI: 24 # - make state and codec informations available to the user 25 # - video integration 26 # * config: 27 # - codecs 28 29 # * figure out why it doesn't work with pidgin: 30 # That's maybe a bug in pidgin: 31 # http://xmpp.org/extensions/xep-0176.html#protocol-checks 32 33 import xmpp 34 import helpers 35 36 from jingle_session import JingleSession, JingleStates 37 from jingle_rtp import JingleAudio, JingleVideo 38 3941 """ 42 This object depends on that it is a part of Connection class. 43 """ 4415546 # dictionary: sessionid => JingleSession object 47 self.__sessions = {} 48 49 # dictionary: (jid, iq stanza id) => JingleSession object, 50 # one time callbacks 51 self.__iq_responses = {}5254 """ 55 Remove a jingle session from a jingle stanza dispatcher 56 """ 57 if sid in self.__sessions: 58 #FIXME: Move this elsewhere? 59 for content in self.__sessions[sid].contents.values(): 60 content.destroy() 61 self.__sessions[sid].callbacks = [] 62 del self.__sessions[sid]6365 """ 66 The jingle stanza dispatcher 67 68 Route jingle stanza to proper JingleSession object, or create one if it 69 is a new session. 70 71 TODO: Also check if the stanza isn't an error stanza, if so route it 72 adequatelly. 73 """ 74 # get data 75 jid = helpers.get_full_jid_from_iq(stanza) 76 id = stanza.getID() 77 78 if (jid, id) in self.__iq_responses.keys(): 79 self.__iq_responses[(jid, id)].on_stanza(stanza) 80 del self.__iq_responses[(jid, id)] 81 raise xmpp.NodeProcessed 82 83 jingle = stanza.getTag('jingle') 84 if not jingle: return 85 sid = jingle.getAttr('sid') 86 87 # do we need to create a new jingle object 88 if sid not in self.__sessions: 89 #TODO: tie-breaking and other things... 90 newjingle = JingleSession(con=self, weinitiate=False, jid=jid, sid=sid) 91 self.__sessions[sid] = newjingle 92 93 # we already have such session in dispatcher... 94 self.__sessions[sid].on_stanza(stanza) 95 # Delete invalid/unneeded sessions 96 if sid in self.__sessions and self.__sessions[sid].state == JingleStates.ended: 97 self.delete_jingle_session(sid) 98 99 raise xmpp.NodeProcessed100102 if self.get_jingle_session(jid, media='audio'): 103 return self.get_jingle_session(jid, media='audio').sid 104 jingle = self.get_jingle_session(jid, media='video') 105 if jingle: 106 jingle.add_content('voice', JingleAudio(jingle)) 107 else: 108 jingle = JingleSession(self, weinitiate=True, jid=jid) 109 self.__sessions[jingle.sid] = jingle 110 jingle.add_content('voice', JingleAudio(jingle)) 111 jingle.start_session() 112 return jingle.sid113115 if self.get_jingle_session(jid, media='video'): 116 return self.get_jingle_session(jid, media='video').sid 117 jingle = self.get_jingle_session(jid, media='audio') 118 if jingle: 119 jingle.add_content('video', JingleVideo(jingle)) 120 else: 121 jingle = JingleSession(self, weinitiate=True, jid=jid) 122 self.__sessions[jingle.sid] = jingle 123 jingle.add_content('video', JingleVideo(jingle)) 124 jingle.start_session() 125 return jingle.sid126 127129 if sid: 130 return (session for session in self.__sessions.values() if session.sid == sid) 131 sessions = (session for session in self.__sessions.values() if session.peerjid == jid) 132 if media: 133 if media not in ('audio', 'video'): 134 return tuple() 135 else: 136 return (session for session in sessions if session.get_content(media)) 137 else: 138 return sessions139 140142 if sid: 143 if sid in self.__sessions: 144 return self.__sessions[sid] 145 else: 146 return None 147 elif media: 148 if media not in ('audio', 'video'): 149 return None 150 for session in self.__sessions.values(): 151 if session.peerjid == jid and session.get_content(media): 152 return session 153 154 return None
| Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Thu Aug 12 02:08:07 2010 | http://epydoc.sourceforge.net |