From 562a88a9934f532c08d67a4c4070405c40f0626f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 8 Mar 2011 09:38:25 +0200 Subject: [PATCH 1/9] Fixes #730459 and 4 unreported bugs. --- openlp/core/lib/mediamanageritem.py | 6 +++--- openlp/core/ui/servicemanager.py | 32 ++++++++++++++--------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index e3bb4ae0f..ceaad2d46 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -349,11 +349,11 @@ class MediaManagerItem(QtGui.QWidget): Validates whether an image still exists and, if it does, is the thumbnail representation of the image up to date. """ - if not os.path.exists(image): + if not os.path.exists(unicode(image)): return False if os.path.exists(thumb): - imageDate = os.stat(image).st_mtime - thumbDate = os.stat(thumb).st_mtime + imageDate = os.stat(unicode(image)).st_mtime + thumbDate = os.stat(unicode(thumb)).st_mtime # If image has been updated rebuild icon if imageDate > thumbDate: self.iconFromFile(image, thumb) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 3cdf25c7a..555441f96 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -416,36 +416,37 @@ class ServiceManager(QtGui.QWidget): if not self.fileName(): return self.saveFileAs() else: - fileName = self.fileName() - log.debug(u'ServiceManager.saveFile - %s' % fileName) + path_file_name = unicode(self.fileName()) + (path, file_name) = os.path.split(path_file_name) + basename = file_name[0:file_name.rfind(u'.')-1] + file_name = basename + '.osz' + service_file_name = basename + '.osd' + log.debug(u'ServiceManager.saveFile - %s' % path_file_name) SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, - split_filename(fileName)[0]) + path) service = [] - serviceFileName = fileName.replace(u'.osz', u'.osd') zip = None file = None try: write_list = [] - zip = zipfile.ZipFile(unicode(fileName), 'w') + zip = zipfile.ZipFile(path_file_name, 'w') for item in self.serviceItems: - service.append({u'serviceitem': \ + service.append({u'serviceitem': item[u'service_item'].get_service_repr()}) if item[u'service_item'].uses_file(): for frame in item[u'service_item'].get_frames(): if item[u'service_item'].is_image(): path_from = frame[u'path'] else: - path_from = unicode(os.path.join( - frame[u'path'], - frame[u'title'])) + path_from = os.path.join(frame[u'path'], + frame[u'title']) # On write a file once if not path_from in write_list: write_list.append(path_from) - zip.write(path_from.encode(u'utf-8')) - file = open(serviceFileName, u'wb') - cPickle.dump(service, file) - file.close() - zip.write(serviceFileName.encode(u'utf-8')) + zip.write(path_from, + path_from.encode(u'utf-8')) + zip.writestr(service_file_name.encode(u'utf-8'), + cPickle.dumps(service)) except IOError: log.exception(u'Failed to save service to disk') finally: @@ -453,8 +454,7 @@ class ServiceManager(QtGui.QWidget): file.close() if zip: zip.close() - delete_file(serviceFileName) - self.mainwindow.addRecentFile(fileName) + self.mainwindow.addRecentFile(path_file_name) self.setModified(False) return True From 216cc407c6372110b58e12130a6f9f7bdf28d044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 8 Mar 2011 11:32:37 +0200 Subject: [PATCH 2/9] Now able to write >2GiB service files (haven't tested opening these),\n on IOError not-saved * asterisk will remain in place,\nbefore adding >50GiB files, user is asked first. --- openlp/core/ui/servicemanager.py | 58 +++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 555441f96..93d24a567 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -419,17 +419,15 @@ class ServiceManager(QtGui.QWidget): path_file_name = unicode(self.fileName()) (path, file_name) = os.path.split(path_file_name) basename = file_name[0:file_name.rfind(u'.')-1] - file_name = basename + '.osz' service_file_name = basename + '.osd' log.debug(u'ServiceManager.saveFile - %s' % path_file_name) SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, path) service = [] zip = None - file = None try: write_list = [] - zip = zipfile.ZipFile(path_file_name, 'w') + total_size = 0 for item in self.serviceItems: service.append({u'serviceitem': item[u'service_item'].get_service_repr()}) @@ -440,20 +438,54 @@ class ServiceManager(QtGui.QWidget): else: path_from = os.path.join(frame[u'path'], frame[u'title']) - # On write a file once + # Only write a file once if not path_from in write_list: - write_list.append(path_from) - zip.write(path_from, - path_from.encode(u'utf-8')) + file_size = os.path.getsize(path_from) + size_limit = 52428800 # 50MiB + if file_size > size_limit: + # File exeeds size_limit bytes, ask user + message = unicode(self.trUtf8('Do you want' + ' to include \n%.1f MiB file "%s"\n' + 'into the service file?\n' + 'This may take some time.\n\n' + 'Please note that you need to\n' + 'take care of that file yourself.')) %\ + (file_size/1048576, + os.path.split(path_from)[1]) + ans = QtGui.QMessageBox.question(self, + self.trUtf8('Including Large File'), + message, + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok|\ + QtGui.QMessageBox.Cancel), + QtGui.QMessageBox.Ok) + if ans == QtGui.QMessageBox.Ok: + write_list.append(path_from) + total_size += file_size + else: + write_list.append(path_from) + total_size += file_size + log.debug(u'ServiceManager.saveFile - ZIP contents size is %i' + ' bytes' % total_size) + service_content = cPickle.dumps(service) + # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be + # extracted using unzip in UNIX. + allow_zip_64 = (total_size > 2147483648 + len(service_content)) + log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % + allow_zip_64) + zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, + allow_zip_64) + # We first add service contents. + # We save ALL filenames into ZIP using UTF-8. zip.writestr(service_file_name.encode(u'utf-8'), - cPickle.dumps(service)) + service_content) + # Finally add all the listed media files. + for path_from in write_list: + zip.write(path_from, path_from.encode(u'utf-8')) + zip.close() except IOError: log.exception(u'Failed to save service to disk') - finally: - if file: - file.close() - if zip: - zip.close() + return False self.mainwindow.addRecentFile(path_file_name) self.setModified(False) return True From 25dbf271f68ec848df9908eee3cbf841d9a9fa8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Tue, 8 Mar 2011 12:16:09 +0200 Subject: [PATCH 3/9] Cleanup --- openlp/core/ui/servicemanager.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 93d24a567..164147c06 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -444,16 +444,20 @@ class ServiceManager(QtGui.QWidget): size_limit = 52428800 # 50MiB if file_size > size_limit: # File exeeds size_limit bytes, ask user - message = unicode(self.trUtf8('Do you want' - ' to include \n%.1f MiB file "%s"\n' + message = unicode(translate( + 'OpenLP.ServiceManager', 'Do you want' + ' to include \n%.1f MB file "%s"\n' 'into the service file?\n' 'This may take some time.\n\n' 'Please note that you need to\n' - 'take care of that file yourself.')) %\ + 'take care of that file yourself,\n' + 'if you leave it out.')) %\ (file_size/1048576, os.path.split(path_from)[1]) - ans = QtGui.QMessageBox.question(self, - self.trUtf8('Including Large File'), + ans = QtGui.QMessageBox.question( + self.mainwindow, + translate('OpenLP.ServiceManager', + 'Including Large File'), message, QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Ok|\ From c7a435951df7d6eefcadc05ed37a09dd11358cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 09:17:58 +0200 Subject: [PATCH 4/9] Better code, as suggested and a few suggested fixes as well. --- openlp/core/ui/servicemanager.py | 142 ++++++++++++++----------------- 1 file changed, 66 insertions(+), 76 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 164147c06..703c5ebc4 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -415,84 +415,74 @@ class ServiceManager(QtGui.QWidget): """ if not self.fileName(): return self.saveFileAs() - else: - path_file_name = unicode(self.fileName()) - (path, file_name) = os.path.split(path_file_name) - basename = file_name[0:file_name.rfind(u'.')-1] - service_file_name = basename + '.osd' - log.debug(u'ServiceManager.saveFile - %s' % path_file_name) - SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, - path) - service = [] - zip = None - try: - write_list = [] - total_size = 0 - for item in self.serviceItems: - service.append({u'serviceitem': - item[u'service_item'].get_service_repr()}) - if item[u'service_item'].uses_file(): - for frame in item[u'service_item'].get_frames(): - if item[u'service_item'].is_image(): - path_from = frame[u'path'] - else: - path_from = os.path.join(frame[u'path'], - frame[u'title']) - # Only write a file once - if not path_from in write_list: - file_size = os.path.getsize(path_from) - size_limit = 52428800 # 50MiB - if file_size > size_limit: - # File exeeds size_limit bytes, ask user - message = unicode(translate( - 'OpenLP.ServiceManager', 'Do you want' - ' to include \n%.1f MB file "%s"\n' - 'into the service file?\n' - 'This may take some time.\n\n' - 'Please note that you need to\n' - 'take care of that file yourself,\n' - 'if you leave it out.')) %\ - (file_size/1048576, - os.path.split(path_from)[1]) - ans = QtGui.QMessageBox.question( - self.mainwindow, - translate('OpenLP.ServiceManager', - 'Including Large File'), - message, - QtGui.QMessageBox.StandardButtons( - QtGui.QMessageBox.Ok|\ - QtGui.QMessageBox.Cancel), - QtGui.QMessageBox.Ok) - if ans == QtGui.QMessageBox.Ok: - write_list.append(path_from) - total_size += file_size - else: - write_list.append(path_from) - total_size += file_size - log.debug(u'ServiceManager.saveFile - ZIP contents size is %i' - ' bytes' % total_size) - service_content = cPickle.dumps(service) - # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be - # extracted using unzip in UNIX. - allow_zip_64 = (total_size > 2147483648 + len(service_content)) - log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % - allow_zip_64) - zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, - allow_zip_64) - # We first add service contents. - # We save ALL filenames into ZIP using UTF-8. - zip.writestr(service_file_name.encode(u'utf-8'), - service_content) - # Finally add all the listed media files. - for path_from in write_list: - zip.write(path_from, path_from.encode(u'utf-8')) - zip.close() - except IOError: - log.exception(u'Failed to save service to disk') - return False + path_file_name = unicode(self.fileName()) + (path, file_name) = os.path.split(path_file_name) + basename = file_name[0:file_name.rfind(u'.')-1] + service_file_name = basename + '.osd' + log.debug(u'ServiceManager.saveFile - %s' % path_file_name) + SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, + path) + service = [] + write_list = [] + total_size = 0 + for item in self.serviceItems: + service.append({u'serviceitem': + item[u'service_item'].get_service_repr()}) + if not item[u'service_item'].uses_file(): + continue + for frame in item[u'service_item'].get_frames(): + if item[u'service_item'].is_image(): + path_from = frame[u'path'] + else: + path_from = os.path.join(frame[u'path'], frame[u'title']) + # Only write a file once + if path_from in write_list: + continue + file_size = os.path.getsize(path_from) + size_limit = 52428800 # 50MiB + if file_size > size_limit: + # File exeeds size_limit bytes, ask user + message = unicode(translate('OpenLP.ServiceManager', + 'Do you want to include \n%.1f MB file "%s"\n' + 'into the service file?\nThis may take some time.\n\n' + 'Please note that you need to\ntake care of that file ' + 'yourself,\nif you leave it out.')) % \ + (file_size/1048576, os.path.split(path_from)[1]) + ans = QtGui.QMessageBox.question(self.mainwindow, + translate('OpenLP.ServiceManager', 'Including Large ' + 'File'), message, QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), + QtGui.QMessageBox.Ok) + if ans == QtGui.QMessageBox.Cancel: + continue + write_list.append(path_from) + total_size += file_size + log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % + total_size) + service_content = cPickle.dumps(service) + # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be + # extracted using unzip in UNIX. + allow_zip_64 = (total_size > 2147483648 + len(service_content)) + log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % + allow_zip_64) + try: + zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, + allow_zip_64) + # First we add service contents. + # We save ALL filenames into ZIP using UTF-8. + zip.writestr(service_file_name.encode(u'utf-8'), + service_content) + # Finally add all the listed media files. + for path_from in write_list: + zip.write(path_from, path_from.encode(u'utf-8')) + except IOError: + log.exception(u'Failed to save service to disk') + finally: + zip.close() self.mainwindow.addRecentFile(path_file_name) self.setModified(False) - return True + return True + return False def saveFileAs(self): """ From f710746a5597ce77c09aef668c65ead4a9c8aeb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 20:02:21 +0200 Subject: [PATCH 5/9] Returns now done right. Commented out dialog part, which needs more work --- openlp/core/ui/servicemanager.py | 35 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 703c5ebc4..ff7c077e2 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -413,6 +413,7 @@ class ServiceManager(QtGui.QWidget): """ Save the current Service file. """ + success = True if not self.fileName(): return self.saveFileAs() path_file_name = unicode(self.fileName()) @@ -440,21 +441,21 @@ class ServiceManager(QtGui.QWidget): continue file_size = os.path.getsize(path_from) size_limit = 52428800 # 50MiB - if file_size > size_limit: - # File exeeds size_limit bytes, ask user - message = unicode(translate('OpenLP.ServiceManager', - 'Do you want to include \n%.1f MB file "%s"\n' - 'into the service file?\nThis may take some time.\n\n' - 'Please note that you need to\ntake care of that file ' - 'yourself,\nif you leave it out.')) % \ - (file_size/1048576, os.path.split(path_from)[1]) - ans = QtGui.QMessageBox.question(self.mainwindow, - translate('OpenLP.ServiceManager', 'Including Large ' - 'File'), message, QtGui.QMessageBox.StandardButtons( - QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), - QtGui.QMessageBox.Ok) - if ans == QtGui.QMessageBox.Cancel: - continue + #if file_size > size_limit: + # # File exeeds size_limit bytes, ask user + # message = unicode(translate('OpenLP.ServiceManager', + # 'Do you want to include \n%.1f MB file "%s"\n' + # 'into the service file?\nThis may take some time.\n\n' + # 'Please note that you need to\ntake care of that file' + # ' yourself,\nif you leave it out.')) % \ + # (file_size/1048576, os.path.split(path_from)[1]) + # ans = QtGui.QMessageBox.question(self.mainwindow, + # translate('OpenLP.ServiceManager', 'Including Large ' + # 'File'), message, QtGui.QMessageBox.StandardButtons( + # QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), + # QtGui.QMessageBox.Ok) + # if ans == QtGui.QMessageBox.Cancel: + # continue write_list.append(path_from) total_size += file_size log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % @@ -477,12 +478,12 @@ class ServiceManager(QtGui.QWidget): zip.write(path_from, path_from.encode(u'utf-8')) except IOError: log.exception(u'Failed to save service to disk') + success = False finally: zip.close() self.mainwindow.addRecentFile(path_file_name) self.setModified(False) - return True - return False + return success def saveFileAs(self): """ From 32034dea950bd0840c23c8b961a82f456779455e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 20:08:06 +0200 Subject: [PATCH 6/9] Just to make more sense. --- openlp/core/ui/servicemanager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index ff7c077e2..fb3664769 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -482,6 +482,7 @@ class ServiceManager(QtGui.QWidget): finally: zip.close() self.mainwindow.addRecentFile(path_file_name) + if success: self.setModified(False) return success From 89187ffadecc48d0bd4d10c72dd7480f00119fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 20:22:07 +0200 Subject: [PATCH 7/9] Neater again. --- openlp/core/ui/servicemanager.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index fb3664769..9951c8295 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -413,7 +413,6 @@ class ServiceManager(QtGui.QWidget): """ Save the current Service file. """ - success = True if not self.fileName(): return self.saveFileAs() path_file_name = unicode(self.fileName()) @@ -478,13 +477,13 @@ class ServiceManager(QtGui.QWidget): zip.write(path_from, path_from.encode(u'utf-8')) except IOError: log.exception(u'Failed to save service to disk') - success = False + zip.close() + return False finally: zip.close() self.mainwindow.addRecentFile(path_file_name) - if success: self.setModified(False) - return success + return True def saveFileAs(self): """ From f1174469543a36b3e6860bc4b36b8339e2bf2cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Wed, 9 Mar 2011 21:22:52 +0200 Subject: [PATCH 8/9] I hope it finally is right. --- openlp/core/ui/servicemanager.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9951c8295..73ca4b9ca 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -465,6 +465,7 @@ class ServiceManager(QtGui.QWidget): allow_zip_64 = (total_size > 2147483648 + len(service_content)) log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % allow_zip_64) + zip = None try: zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, allow_zip_64) @@ -477,13 +478,13 @@ class ServiceManager(QtGui.QWidget): zip.write(path_from, path_from.encode(u'utf-8')) except IOError: log.exception(u'Failed to save service to disk') - zip.close() return False finally: - zip.close() - self.mainwindow.addRecentFile(path_file_name) - self.setModified(False) - return True + if zip: + zip.close() + self.mainwindow.addRecentFile(path_file_name) + self.setModified(False) + return True def saveFileAs(self): """ From 010adf3f254e9779b2b83116362aa5f2ea9ce2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20P=C3=B5ldaru?= Date: Thu, 10 Mar 2011 20:31:34 +0200 Subject: [PATCH 9/9] Improve readability a bit, as Meths suggested. --- openlp/core/ui/servicemanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 73ca4b9ca..fa2bc50f5 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -417,7 +417,7 @@ class ServiceManager(QtGui.QWidget): return self.saveFileAs() path_file_name = unicode(self.fileName()) (path, file_name) = os.path.split(path_file_name) - basename = file_name[0:file_name.rfind(u'.')-1] + (basename, extension) = os.path.splitext(file_name) service_file_name = basename + '.osd' log.debug(u'ServiceManager.saveFile - %s' % path_file_name) SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection,