From 78d4478d5eeb7f5b3f9ac7546708ad13ef4cf388 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Nov 2006 22:43:28 +0000 Subject: [PATCH] Fixed put_file to coorectly handle an infile whose position is not at the start of the file. It now correctly copies from the current position of infile. Also added progree reporting to put_file --- libprs500/communicate.py | 44 +++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/libprs500/communicate.py b/libprs500/communicate.py index 354c52c1b5..f47d62981e 100755 --- a/libprs500/communicate.py +++ b/libprs500/communicate.py @@ -488,7 +488,6 @@ class PRS500Device(object): @return: A list of tuples. Each tuple has form ("location", free space, total space) """ data = [] - if self.report_progress: self.report_progress(-1) for path in ("/Data/", "a:/", "b:/"): res = self._send_validated_command(FreeSpaceQuery(path),timeout=5000) # Timeout needs to be increased as it takes time to read card buffer_size = 16 + res.data[2] @@ -508,7 +507,10 @@ class PRS500Device(object): @safe def touch(self, path, end_session=True): - """ Create a file at path """ + """ + Create a file at path + @todo: Open file for reading if it exists so that mod time is updated + """ if path.endswith("/") and len(path) > 1: path = path[:-1] exists, file = self._exists(path) if exists and file.is_dir: @@ -521,6 +523,11 @@ class PRS500Device(object): @safe def put_file(self, infile, path, end_session=True): + """ + Put infile onto the devoce at path + @param infile: An open file object + @param path: The path on the device at which to put infile. It should point to an existing directory. + """ exists, dest = self._exists(path) if exists: if not dest.is_dir: raise PathError("Cannot write to " + path + " as it already exists") @@ -537,18 +544,24 @@ class PRS500Device(object): if res.code != 0: raise ProtocolError("Unable to open " + path + " for writing. Response code: " + hex(res.code)) id = self._bulk_read(20, data_type=IdAnswer, command_number=FileOpen.NUMBER)[0].id - pos = 0 + pos = infile.tell() + infile.seek(0,2) + bytes = infile.tell() - pos + start_pos = pos + infile.seek(pos) while data_left: data = array('B') try: data.fromfile(infile, chunk_size) except EOFError: data_left = False - res = self._send_validated_command(FileIO(id, pos, len(data), mode=FileIO.WNUMBER)) + res = self._send_validated_command(FileIO(id, pos, len(data), mode=FileIO.WNUMBER)) if res.code != 0: raise ProtocolError("Unable to write to " + path + ". Response code: " + hex(res.code)) self._bulk_write(data) pos += len(data) + if self.report_progress: + self.report_progress( int(100*(pos-start_pos)/(1.*bytes)) ) self._send_validated_command(FileClose(id)) # Ignore res.code as cant do anything if close fails file = self.path_properties(path, end_session=False) if file.file_size != pos: @@ -600,18 +613,8 @@ class PRS500Device(object): Important fields in each dictionary are "title", "author", "path" and "thumbnail". The third and fourth elements are the temporary files that hold main.xml and cache.xml """ - main_xml = TemporaryFile() - media = self.get_file("/Data/database/cache/media.xml", main_xml, end_session=False) - parser = make_parser() - parser.setFeature(feature_namespaces, 0) - finder = FindBooks() - parser.setContentHandler(finder) - main_xml.seek(0) - parser.parse(main_xml) - books = finder.books - root = "a:/" - cache_xml = TemporaryFile() - cbooks = [] + main_xml, cache_xml = TemporaryFile(), TemporaryFile() + self.get_file("/Data/database/cache/media.xml", main_xml, end_session=False) try: self.get_file("a:/Sony Reader/database/cache.xml", cache_xml, end_session=False) except PathError: @@ -620,6 +623,15 @@ class PRS500Device(object): root = "b:/" except PathError: pass + parser = make_parser() + parser.setFeature(feature_namespaces, 0) + finder = FindBooks() + parser.setContentHandler(finder) + main_xml.seek(0) + parser.parse(main_xml) + books = finder.books + root = "a:/" + cbooks = [] if cache_xml.tell() > 0: finder = FindBooks(type="cache", root=root) cache_xml.seek(0)