Yann Leboulanger pushed to branch gajim_0.16 at gajim / gajim

Commits:
470c0e86 by Andrey Gursky at 2016-12-15T23:52:38+01:00
finish jingle file transfer session for files without hash

- - - - -
efc9c5b5 by Andrey Gursky at 2016-12-16T00:33:59+01:00
finish jingle file transfer session if file couldn't be verified

- - - - -
8cd423fa by Andrey Gursky at 2016-12-16T01:36:17+01:00
add event for jingle session initiation if we're initiator

- - - - -
005451ca by Yann Leboulanger at 2016-12-16T21:23:13+01:00
Merge branch 'file_transfer_related' into 'gajim_0.16'

Correctly end jingle session when file transfer doesn't terminate correctly

See merge request !5
- - - - -


3 changed files:

- src/common/connection_handlers_events.py
- src/common/jingle_ft.py
- src/gui_interface.py


Changes:

=====================================
src/common/connection_handlers_events.py
=====================================
--- a/src/common/connection_handlers_events.py
+++ b/src/common/connection_handlers_events.py
@@ -1657,6 +1657,20 @@ class AnonymousAuthEvent(nec.NetworkIncomingEvent):
     name = 'anonymous-auth'
     base_network_events = []
 
+class JingleSessionInitiateSendingEvent(nec.NetworkOutgoingEvent, HelperEvent):
+    name = 'jingle-session-initiate-sending'
+    base_network_events = []
+
+    def init(self):
+        self.jingle_content = None
+        self.FT_content = None
+
+    def generate(self):
+        self.get_id()
+        self.fjid = self.conn._ft_get_from(self.stanza)
+        self.jid = gajim.get_jid_without_resource(self.fjid)
+        return True
+
 class JingleRequestReceivedEvent(nec.NetworkIncomingEvent):
     name = 'jingle-request-received'
     base_network_events = []


=====================================
src/common/jingle_ft.py
=====================================
--- a/src/common/jingle_ft.py
+++ b/src/common/jingle_ft.py
@@ -31,7 +31,8 @@ from common.jingle_ftstates import StateCandReceived, 
JingleTransportSocks5, \
 from common.jingle_transport import TransportType
 from jingle_content import contents, JingleContent
 from common import helpers
-from common.connection_handlers_events import FileRequestReceivedEvent
+from common.connection_handlers_events import FileRequestReceivedEvent, \
+    JingleSessionInitiateSendingEvent
 import threading
 import logging
 
@@ -140,7 +141,10 @@ class JingleFileTransfer(JingleContent):
             self.session.accept_session()
 
     def __on_session_initiate_sent(self, stanza, content, error, action):
-        pass
+        log.debug("Jingle FT session initiate sending")
+        gajim.nec.push_outgoing_event(JingleSessionInitiateSendingEvent(None,
+            conn=self.session.connection, stanza=stanza, 
jingle_content=content,
+            FT_content=self))
 
     def __send_hash(self):
         # Send hash in a session info


=====================================
src/gui_interface.py
=====================================
--- a/src/gui_interface.py
+++ b/src/gui_interface.py
@@ -970,32 +970,32 @@ class Interface:
         session = gajim.connections[account].get_jingle_session(jid=None,
             sid=file_props.sid)
         ft_win = self.instances['file_transfers']
-        if not file_props.hash_:
-            # We disn't get the hash, sender probably don't support that
-            jid = unicode(file_props.sender)
-            self.popup_ft_result(account, jid, file_props)
-            ft_win.set_status(file_props, 'ok')
         h = Hashes()
+        hash_ = None
         try:
             file_ = open(file_props.file_name, 'rb')
+            hash_ = h.calculateHash(file_props.algo, file_)
+            file_.close()
         except:
-            return
-        hash_ = h.calculateHash(file_props.algo, file_)
-        file_.close()
+            pass
         # If the hash we received and the hash of the file are the same,
         # then the file is not corrupt
         jid = unicode(file_props.sender)
-        if file_props.hash_ == hash_:
+        if hash_ and file_props.hash_ == hash_:
             gobject.idle_add(self.popup_ft_result, account, jid, file_props)
             gobject.idle_add(ft_win.set_status, file_props, 'ok')
+            # End jingle session
+            if session:
+                session.end_session()
         else:
             # wrong hash, we need to get the file again!
             file_props.error = -10
             gobject.idle_add(self.popup_ft_result, account, jid, file_props)
             gobject.idle_add(ft_win.set_status, file_props, 'hash_error')
-        # End jingle session
-        if session:
-            session.end_session()
+            # End jingle session
+            # TODO: send media-error
+            if session:
+                session.end_session()
 
     def handle_event_file_rcv_completed(self, account, file_props):
         ft = self.instances['file_transfers']
@@ -1009,14 +1009,25 @@ class Interface:
         if file_props.stalled or file_props.paused:
             return
 
-        if file_props.type_ == 'r' and file_props.hash_: # we receive a file
+        if file_props.type_ == 'r': # we receive a file
             gajim.socks5queue.remove_receiver(file_props.sid, True, True)
-            # we compare hashes
             if file_props.session_type == 'jingle':
-                # Compare hashes in a new thread
-                self.hashThread = Thread(target=self.__compare_hashes,
-                    args=(account, file_props))
-                self.hashThread.start()
+                if file_props.hash_:
+                    # We compare hashes in a new thread
+                    self.hashThread = Thread(target=self.__compare_hashes,
+                        args=(account, file_props))
+                    self.hashThread.start()
+                else:
+                    # We disn't get the hash, sender probably don't support 
that
+                    jid = unicode(file_props.sender)
+                    self.popup_ft_result(account, jid, file_props)
+                    ft.set_status(file_props, 'ok')
+                    session = 
gajim.connections[account].get_jingle_session(jid=None,
+                        sid=file_props.sid)
+                    # End jingle session
+                    # TODO: only if there are no other parallel downloads in 
this session
+                    if session:
+                        session.end_session()
         else: # we send a file
             jid = unicode(file_props.receiver)
             gajim.socks5queue.remove_sender(file_props.sid, True, True)



View it on GitLab: 
https://dev.gajim.org/gajim/gajim/compare/6d866b14248a0c9d2fbde72d19a733d71412e4d1...005451ca95d88bc181e76bda7bc4f5c4c86ffac8
_______________________________________________
Commits mailing list
Commits@gajim.org
https://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to