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