using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.Security; using Jellyfish.Virtu.Properties; namespace Jellyfish.Virtu.Services { public abstract class StorageService : MachineService { protected StorageService(Machine machine) : base(machine) { } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] public bool Load(string fileName, Action reader) { try { DebugService.WriteMessage("Loading file '{0}'", fileName); OnLoad(fileName, reader); } catch (Exception ex) { DebugService.WriteMessage(ex.ToString()); return false; } return true; } #if !WINDOWS [SecuritySafeCritical] #endif [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] public static bool LoadFile(string fileName, Action reader) { if (reader == null) { throw new ArgumentNullException("reader"); } try { DebugService.Default.WriteMessage("Loading file '{0}'", fileName); using (var stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { reader(stream); } } catch (Exception ex) { DebugService.Default.WriteMessage(ex.ToString()); return false; } return true; } #if !WINDOWS [SecuritySafeCritical] #endif [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] public static bool LoadFile(FileInfo fileInfo, Action reader) { if (fileInfo == null) { throw new ArgumentNullException("fileInfo"); } if (reader == null) { throw new ArgumentNullException("reader"); } try { DebugService.Default.WriteMessage("Loading file '{0}'", fileInfo.Name); using (var stream = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) { reader(stream); } } catch (Exception ex) { DebugService.Default.WriteMessage(ex.ToString()); return false; } return true; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] public static bool LoadResource(string resourceName, Action reader) { if (reader == null) { throw new ArgumentNullException("reader"); } try { DebugService.Default.WriteMessage("Loading resource '{0}'", resourceName); using (var stream = GetResourceStream(resourceName)) { reader(stream); } } catch (Exception ex) { DebugService.Default.WriteMessage(ex.ToString()); return false; } return true; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] public bool Save(string fileName, Action writer) { try { DebugService.WriteMessage("Saving file '{0}'", fileName); OnSave(fileName, writer); } catch (Exception ex) { DebugService.WriteMessage(ex.ToString()); return false; } return true; } #if !WINDOWS [SecuritySafeCritical] #endif [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] public static bool SaveFile(string fileName, Action writer) { if (writer == null) { throw new ArgumentNullException("writer"); } try { DebugService.Default.WriteMessage("Saving file '{0}'", fileName); using (var stream = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { writer(stream); } } catch (Exception ex) { DebugService.Default.WriteMessage(ex.ToString()); return false; } return true; } #if !WINDOWS [SecuritySafeCritical] #endif [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] public static bool SaveFile(FileInfo fileInfo, Action writer) { if (fileInfo == null) { throw new ArgumentNullException("fileInfo"); } if (writer == null) { throw new ArgumentNullException("writer"); } try { DebugService.Default.WriteMessage("Saving file '{0}'", fileInfo.Name); using (var stream = fileInfo.Open(FileMode.Create, FileAccess.Write, FileShare.None)) { writer(stream); } } catch (Exception ex) { DebugService.Default.WriteMessage(ex.ToString()); return false; } return true; } protected abstract void OnLoad(string fileName, Action reader); protected abstract void OnSave(string fileName, Action writer); private static Stream GetResourceStream(string resourceName) { resourceName = "Jellyfish.Virtu." + resourceName.Replace('/', '.'); var resourceStream = typeof(StorageService).Assembly.GetManifestResourceStream(resourceName); if (resourceStream == null) { throw new FileNotFoundException(string.Format(CultureInfo.CurrentUICulture, Strings.ResourceNotFound, resourceName)); } return resourceStream; } } }