use NEC to handle jingle-disconnected events

This commit is contained in:
Yann Leboulanger 2010-10-29 16:49:53 +02:00
parent 7e4166c288
commit 58feae6cee
3 changed files with 40 additions and 26 deletions

View file

@ -1133,3 +1133,13 @@ class JingleConnectedReceivedEvent(nec.NetworkIncomingEvent):
self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid) self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid)
self.sid = self.jingle_session.sid self.sid = self.jingle_session.sid
return True return True
class JingleDisconnectedReceivedEvent(nec.NetworkIncomingEvent):
name = 'jingle-disconnected-received'
base_network_events = []
def generate(self):
self.fjid = self.jingle_session.peerjid
self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid)
self.sid = self.jingle_session.sid
return True

View file

@ -368,8 +368,9 @@ class JingleSession(object):
if (creator, name) in self.contents: if (creator, name) in self.contents:
content = self.contents[(creator, name)] content = self.contents[(creator, name)]
# TODO: this will fail if content is not an RTP content # TODO: this will fail if content is not an RTP content
self.connection.dispatch('JINGLE_DISCONNECTED', gajim.nec.push_incoming_event(JingleDisconnectedReceivedEvent(
(self.peerjid, self.sid, content.media, 'removed')) None, conn=self.connection, jingle_session=self,
media=content.media, reason='removed'))
content.destroy() content.destroy()
if not self.contents: if not self.contents:
reason = xmpp.Node('reason') reason = xmpp.Node('reason')
@ -482,8 +483,9 @@ class JingleSession(object):
else: else:
# TODO # TODO
text = reason text = reason
self.connection.dispatch('JINGLE_DISCONNECTED', gajim.nec.push_incoming_event(JingleDisconnectedReceivedEvent(None,
(self.peerjid, self.sid, None, text)) conn=self.connection, jingle_session=self, media=None,
reason=text))
def __broadcast_all(self, stanza, jingle, error, action): def __broadcast_all(self, stanza, jingle, error, action):
""" """
@ -634,8 +636,9 @@ class JingleSession(object):
else: else:
text = reason text = reason
self.connection.delete_jingle_session(self.sid) self.connection.delete_jingle_session(self.sid)
self.connection.dispatch('JINGLE_DISCONNECTED', gajim.nec.push_incoming_event(JingleDisconnectedReceivedEvent(None,
(self.peerjid, self.sid, None, text)) conn=self.connection, jingle_session=self, media=None,
reason=text))
def __content_add(self, content): def __content_add(self, content):
# TODO: test # TODO: test
@ -659,8 +662,9 @@ class JingleSession(object):
self.__append_content(jingle, content) self.__append_content(jingle, content)
self.connection.connection.send(stanza) self.connection.connection.send(stanza)
# TODO: this will fail if content is not an RTP content # TODO: this will fail if content is not an RTP content
self.connection.dispatch('JINGLE_DISCONNECTED', gajim.nec.push_incoming_event(JingleDisconnectedReceivedEvent(None,
(self.peerjid, self.sid, content.media, 'rejected')) conn=self.connection, jingle_session=self, media=content.media,
reason='rejected'))
def __content_modify(self): def __content_modify(self):
assert self.state != JingleStates.ended assert self.state != JingleStates.ended
@ -671,8 +675,9 @@ class JingleSession(object):
self.__append_content(jingle, content) self.__append_content(jingle, content)
self.connection.connection.send(stanza) self.connection.connection.send(stanza)
# TODO: this will fail if content is not an RTP content # TODO: this will fail if content is not an RTP content
self.connection.dispatch('JINGLE_DISCONNECTED', gajim.nec.push_incoming_event(JingleDisconnectedReceivedEvent(None,
(self.peerjid, self.sid, content.media, 'removed')) conn=self.connection, jingle_session=self, media=content.media,
reason='removed'))
def content_negotiated(self, media): def content_negotiated(self, media):
gajim.nec.push_incoming_event(JingleConnectedReceivedEvent(None, gajim.nec.push_incoming_event(JingleConnectedReceivedEvent(None,

View file

@ -1555,26 +1555,24 @@ class Interface:
else: else:
ctrl.set_video_state('connected', obj.sid) ctrl.set_video_state('connected', obj.sid)
def handle_event_jingle_disconnected(self, account, data): def handle_event_jingle_disconnected(self, obj):
# ('JINGLE_DISCONNECTED', account, (peerjid, sid, reason)) # ('JINGLE_DISCONNECTED', account, (peerjid, sid, reason))
peerjid, sid, media, reason = data account = obj.conn.name
jid = gajim.get_jid_without_resource(peerjid) ctrl = (self.msg_win_mgr.get_control(obj.fjid, account)
resource = gajim.get_resource_from_jid(peerjid) or self.msg_win_mgr.get_control(obj.jid, account))
ctrl = (self.msg_win_mgr.get_control(peerjid, account)
or self.msg_win_mgr.get_control(jid, account))
if ctrl: if ctrl:
if media is None: if obj.media is None:
ctrl.stop_jingle(sid=sid, reason=reason) ctrl.stop_jingle(sid=obj.sid, reason=obj.reason)
elif media == 'audio': elif obj.media == 'audio':
ctrl.set_audio_state('stop', sid=sid, reason=reason) ctrl.set_audio_state('stop', sid=obj.sid, reason=obj.reason)
elif media == 'video': elif obj.media == 'video':
ctrl.set_video_state('stop', sid=sid, reason=reason) ctrl.set_video_state('stop', sid=obj.sid, reason=obj.reason)
dialog = dialogs.VoIPCallReceivedDialog.get_dialog(peerjid, sid) dialog = dialogs.VoIPCallReceivedDialog.get_dialog(obj.fjid, obj.sid)
if dialog: if dialog:
if media is None: if obj.media is None:
dialog.dialog.destroy() dialog.dialog.destroy()
else: else:
dialog.remove_contents((media, )) dialog.remove_contents((obj.media, ))
def handle_event_jingle_error(self, account, data): def handle_event_jingle_error(self, account, data):
# ('JINGLE_ERROR', account, (peerjid, sid, reason)) # ('JINGLE_ERROR', account, (peerjid, sid, reason))
@ -1890,7 +1888,6 @@ class Interface:
'INSECURE_SSL_CONNECTION': \ 'INSECURE_SSL_CONNECTION': \
[self.handle_event_insecure_ssl_connection], [self.handle_event_insecure_ssl_connection],
'INSECURE_PASSWORD': [self.handle_event_insecure_password], 'INSECURE_PASSWORD': [self.handle_event_insecure_password],
'JINGLE_DISCONNECTED': [self.handle_event_jingle_disconnected],
'JINGLE_ERROR': [self.handle_event_jingle_error], 'JINGLE_ERROR': [self.handle_event_jingle_error],
'PEP_RECEIVED': [self.handle_event_pep_received], 'PEP_RECEIVED': [self.handle_event_pep_received],
'CAPS_RECEIVED': [self.handle_event_caps_received], 'CAPS_RECEIVED': [self.handle_event_caps_received],
@ -1903,6 +1900,8 @@ class Interface:
'http-auth-received': [self.handle_event_http_auth], 'http-auth-received': [self.handle_event_http_auth],
'iq-error-received': [self.handle_event_iq_error], 'iq-error-received': [self.handle_event_iq_error],
'jingle-connected-received': [self.handle_event_jingle_connected], 'jingle-connected-received': [self.handle_event_jingle_connected],
'jingle-disconnected-received': [
self.handle_event_jingle_disconnected],
'jingle-request-received': [self.handle_event_jingle_incoming], 'jingle-request-received': [self.handle_event_jingle_incoming],
'last-result-received': [self.handle_event_last_status_time], 'last-result-received': [self.handle_event_last_status_time],
'muc-admin-received': [self.handle_event_gc_affiliation], 'muc-admin-received': [self.handle_event_gc_affiliation],