A few fixes for mediamanager file handling and service file saving, most notably for #730459, also >2GiB service files are possible, but user is asked if he wants to include >50Mib files.

bzr-revno: 1367
This commit is contained in:
Mattias Põldaru 2011-03-10 20:29:44 +01:00 committed by Andreas Preikschat
commit c6b28c61cf
2 changed files with 72 additions and 44 deletions

View File

@ -349,11 +349,11 @@ class MediaManagerItem(QtGui.QWidget):
Validates whether an image still exists and, if it does, is the Validates whether an image still exists and, if it does, is the
thumbnail representation of the image up to date. thumbnail representation of the image up to date.
""" """
if not os.path.exists(image): if not os.path.exists(unicode(image)):
return False return False
if os.path.exists(thumb): if os.path.exists(thumb):
imageDate = os.stat(image).st_mtime imageDate = os.stat(unicode(image)).st_mtime
thumbDate = os.stat(thumb).st_mtime thumbDate = os.stat(unicode(thumb)).st_mtime
# If image has been updated rebuild icon # If image has been updated rebuild icon
if imageDate > thumbDate: if imageDate > thumbDate:
self.iconFromFile(image, thumb) self.iconFromFile(image, thumb)

View File

@ -415,47 +415,75 @@ class ServiceManager(QtGui.QWidget):
""" """
if not self.fileName(): if not self.fileName():
return self.saveFileAs() return self.saveFileAs()
else: path_file_name = unicode(self.fileName())
fileName = self.fileName() (path, file_name) = os.path.split(path_file_name)
log.debug(u'ServiceManager.saveFile - %s' % fileName) (basename, extension) = os.path.splitext(file_name)
SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, service_file_name = basename + '.osd'
split_filename(fileName)[0]) log.debug(u'ServiceManager.saveFile - %s' % path_file_name)
service = [] SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection,
serviceFileName = fileName.replace(u'.osz', u'.osd') path)
zip = None service = []
file = None write_list = []
try: total_size = 0
write_list = [] for item in self.serviceItems:
zip = zipfile.ZipFile(unicode(fileName), 'w') service.append({u'serviceitem':
for item in self.serviceItems: item[u'service_item'].get_service_repr()})
service.append({u'serviceitem': \ if not item[u'service_item'].uses_file():
item[u'service_item'].get_service_repr()}) continue
if item[u'service_item'].uses_file(): for frame in item[u'service_item'].get_frames():
for frame in item[u'service_item'].get_frames(): if item[u'service_item'].is_image():
if item[u'service_item'].is_image(): path_from = frame[u'path']
path_from = frame[u'path'] else:
else: path_from = os.path.join(frame[u'path'], frame[u'title'])
path_from = unicode(os.path.join( # Only write a file once
frame[u'path'], if path_from in write_list:
frame[u'title'])) continue
# On write a file once file_size = os.path.getsize(path_from)
if not path_from in write_list: size_limit = 52428800 # 50MiB
write_list.append(path_from) #if file_size > size_limit:
zip.write(path_from.encode(u'utf-8')) # # File exeeds size_limit bytes, ask user
file = open(serviceFileName, u'wb') # message = unicode(translate('OpenLP.ServiceManager',
cPickle.dump(service, file) # 'Do you want to include \n%.1f MB file "%s"\n'
file.close() # 'into the service file?\nThis may take some time.\n\n'
zip.write(serviceFileName.encode(u'utf-8')) # 'Please note that you need to\ntake care of that file'
except IOError: # ' yourself,\nif you leave it out.')) % \
log.exception(u'Failed to save service to disk') # (file_size/1048576, os.path.split(path_from)[1])
finally: # ans = QtGui.QMessageBox.question(self.mainwindow,
if file: # translate('OpenLP.ServiceManager', 'Including Large '
file.close() # 'File'), message, QtGui.QMessageBox.StandardButtons(
if zip: # QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel),
zip.close() # QtGui.QMessageBox.Ok)
delete_file(serviceFileName) # if ans == QtGui.QMessageBox.Cancel:
self.mainwindow.addRecentFile(fileName) # continue
self.setModified(False) 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 = None
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')
return False
finally:
if zip:
zip.close()
self.mainwindow.addRecentFile(path_file_name)
self.setModified(False)
return True return True
def saveFileAs(self): def saveFileAs(self):