using System; using System.Runtime.Serialization; using System.Text; using System.ServiceModel; using System.IO; using PatcherServer.Helper; namespace PatcherServer.Services { [DataContract] public class PatchFileInfo : IDisposable { public static PatchFileInfo CreateForTorrent(string config, long version) { StringBuilder builder = new StringBuilder(); builder.Append(config); builder.Append('-'); builder.Append(version); builder.Append(".torrent"); PatchFileInfo info = new PatchFileInfo(); info.ConfigName = config; info.Version = version; info.FileByteStream = new FileStream(Path.Combine(DataProvider.TorrentfilesFolder, builder.ToString()), FileMode.Open); info.Length = ((FileStream) info.FileByteStream).Length; return info; } public static string GetPathToTorrent(string config, long version) { StringBuilder builder = new StringBuilder(); builder.Append(config); builder.Append('-'); builder.Append(version); builder.Append(".torrent"); return Path.Combine(DataProvider.TorrentfilesFolder, builder.ToString()); } [DataMember] public string ConfigName; [DataMember] public long Version; [DataMember] public long Length; [DataMember] public System.IO.Stream FileByteStream; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool b) { if (b) { if (FileByteStream != null) { FileByteStream.Close(); FileByteStream = null; } } } public string GetFileName() { StringBuilder builder = new StringBuilder(); builder.Append(this.ConfigName); builder.Append('-'); builder.Append(this.Version); builder.Append(".spf"); return builder.ToString(); } public void Download(string folder) { string outputPath = Path.Combine(folder, GetFileName()); using (var outStream = new FileStream(outputPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { byte[] buffer = new byte[BufferLen]; int readLen = 0; while ((readLen = FileByteStream.Read(buffer, 0, BufferLen)) > 0) { outStream.Write(buffer, 0, readLen); } outStream.Close(); FileByteStream.Close(); } } private const int BufferLen = 65000; } [MessageContract] public class FileTranmission { public const int BUFFER_SIZE = 4096; [MessageHeader] public string Config; [MessageHeader] public long Version; [MessageHeader] public long Length; [MessageBodyMember] public Stream ByteStream; public void Download(string path) { FileStream stream; if(File.Exists(path)) stream = new FileStream(path, FileMode.Truncate); else stream = File.Create(path); long totalWritten = 0; long readed = 0; byte[] buffer = new byte[BUFFER_SIZE]; while (totalWritten < Length) { readed = ByteStream.Read(buffer, 0, BUFFER_SIZE); stream.Write(buffer, 0, (int) readed); totalWritten += readed; } stream.Close(); } public string GetPatchFileName() { return GetNameBase().Append(".spf").ToString(); } public string GetTorrentFileName() { return GetNameBase().Append(".torrent").ToString(); } public StringBuilder GetNameBase() { StringBuilder builder = new StringBuilder(); builder.Append(this.Config); builder.Append('-'); builder.Append(this.Version); return builder; } } [MessageContract] public class PatchFileRequest { [MessageHeader] public long Version; [MessageBodyMember] public string Config; } }