From b20e054d55a7fcdf84460d002d47574f997884b9 Mon Sep 17 00:00:00 2001 From: Jefry Lagrange <jefry.reyes@gmail.com> Date: Wed, 29 Aug 2012 15:06:04 -0400 Subject: [PATCH] set and retrieve information about the files transfered --- src/common/file_props.py | 1 + src/common/jingle.py | 15 +++++++++++++++ src/common/jingle_content.py | 15 ++++++++------- src/common/jingle_ft.py | 7 +++++++ src/common/jingle_session.py | 16 ++++++++++++++++ 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/common/file_props.py b/src/common/file_props.py index 48f8b6d6d3..8cf8e1d5a9 100644 --- a/src/common/file_props.py +++ b/src/common/file_props.py @@ -116,6 +116,7 @@ class FileProp(object): # full file path self.file_name = None self.name = None + self.date = None self.desc = None self.offset = None self.sender = None diff --git a/src/common/jingle.py b/src/common/jingle.py index 07eaa6fcf6..c96fc5e3db 100644 --- a/src/common/jingle.py +++ b/src/common/jingle.py @@ -55,6 +55,7 @@ class ConnectionJingle(object): # dictionary: (jid, iq stanza id) => JingleSession object, # one time callbacks self.__iq_responses = {} + self.files = [] def delete_jingle_session(self, sid): """ @@ -192,6 +193,20 @@ class ConnectionJingle(object): else: return sessions + def set_files_info(self, file_): + # Saves information about the files we have transfered in case they need + # to be requested again. + self.files.append(file_) + + def get_files_info(self, hash_=None, name=None): + if hash_: + for f in self.files: + if f['hash'] == hash_: + return f + elif name: + for f in self.files: + if f['name'] == name: + return f def get_jingle_session(self, jid, sid=None, media=None): if sid: diff --git a/src/common/jingle_content.py b/src/common/jingle_content.py index c5ca6395f9..815afadbe5 100644 --- a/src/common/jingle_content.py +++ b/src/common/jingle_content.py @@ -165,12 +165,10 @@ class JingleContent(object): def _fill_content(self, content): description_node = xmpp.simplexml.Node( tag=xmpp.NS_JINGLE_FILE_TRANSFER + ' description') - if self.session.werequest: simode = xmpp.simplexml.Node(tag='request') else: simode = xmpp.simplexml.Node(tag='offer') - file_tag = simode.setTag('file', namespace=xmpp.NS_FILE) if self.file_props.name: node = xmpp.simplexml.Node(tag='name') @@ -188,15 +186,20 @@ class JingleContent(object): else: # if the file is less than 10 mb, then it is small # lets calculate it right away - if int(self.file_props.size) < 10000000: + if int(self.file_props.size) < 10000000 and not \ + self.file_props.hash_: h = self._calcHash() file_tag.addChild(node=h) + file_info = {'name' : self.file_props.name, + 'hash' : self.file_props.hash_, + 'size' : self.file_props.size, + 'date' : self.file_props.date + } + self.session.connection.set_files_info(file_info) desc = file_tag.setTag('desc') if self.file_props.desc: desc.setData(self.file_props.desc) - description_node.addChild(node=simode) - if self.use_security: security = xmpp.simplexml.Node( tag=xmpp.NS_JINGLE_XTLS + ' security') @@ -206,10 +209,8 @@ class JingleContent(object): method.setAttr('name', m) security.addChild(node=method) content.addChild(node=security) - content.addChild(node=description_node) - def destroy(self): self.callbacks = None del self.session.contents[(self.creator, self.name)] diff --git a/src/common/jingle_ft.py b/src/common/jingle_ft.py index 25d1d0b4fa..fbd6c02345 100644 --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -128,6 +128,13 @@ class JingleFileTransfer(JingleContent): payload=[self._calcHash()])]) checksum.setNamespace(xmpp.NS_JINGLE_FILE_TRANSFER) self.session.__session_info(checksum ) + file_info = {'name' : self.file_props.name, + 'hash' : self.file_props.hash_, + 'size' : self.file_props.size, + 'date' : self.file_props.date + } + self.session.connection.set_files_info(file_info) + def _calcHash(self): # Caculates the hash and returns a xep-300 hash stanza diff --git a/src/common/jingle_session.py b/src/common/jingle_session.py index 41d0d56cd2..861b1a6d43 100644 --- a/src/common/jingle_session.py +++ b/src/common/jingle_session.py @@ -511,6 +511,22 @@ class JingleSession(object): self.__ack(stanza, jingle, error, action) self._session_terminate(reason) raise xmpp.NodeProcessed + else: + # Stop if we don't have the requested file + request = \ + jingle.getTag('content').getTag('description').getTag('request') + if request: + h = request.getTag('file').getTag('hash') + n = request.getTag('file').getTag('name') + if h: + file_info = self.connection.get_files_info(hash_=h) + elif n: + file_info = self.connection.get_files_info(name=n) + if not file_info: + # Send 404 error? + log.warning('The peer ' + self.peerjid + \ + ' is requesting a ' + \ + 'file that we dont have') # If there's no content we understand... if not contents: # TODO: http://xmpp.org/extensions/xep-0166.html#session-terminate -- GitLab