public SpringScanner(SpringPaths springPaths) { this.springPaths = springPaths; MetaData = new MetaDataCache(springPaths, this); foreach (var folder in springPaths.DataDirectories) { var modsPath = Utils.MakePath(folder, "games"); if (Directory.Exists(modsPath)) { modsWatchers.Add(new FileSystemWatcher(modsPath)); } var mapsPath = Utils.MakePath(folder, "maps"); if (Directory.Exists(mapsPath)) { mapsWatchers.Add(new FileSystemWatcher(mapsPath)); } var packagesPath = Utils.MakePath(folder, "packages"); if (Directory.Exists(packagesPath)) { packagesWatchers.Add(new FileSystemWatcher(packagesPath)); } } SetupWatcherEvents(mapsWatchers); SetupWatcherEvents(modsWatchers); SetupWatcherEvents(packagesWatchers); service.RegisterResourceCompleted += HandleServiceRegisterResourceCompleted; Directory.CreateDirectory(springPaths.Cache); cachePath = Utils.MakePath(springPaths.Cache, "ScannerCache.dat"); Directory.CreateDirectory(Utils.MakePath(springPaths.Cache, "Resources")); }
public void UpdateMission(ZkDataContext db, Mission mission, Mod modInfo) { var file = mission.Mutator.ToArray(); var tempName = Path.GetTempFileName() + ".zip"; File.WriteAllBytes(tempName, file); using (var zf = new ZipFile(tempName)) { zf.UpdateEntry("modinfo.lua", Encoding.UTF8.GetBytes(GetModInfo(mission.NameWithVersion, mission.Mod, mission.Name, "ZK"))); // FIXME hardcoded crap FixScript(mission, zf, "script.txt"); var script = FixScript(mission, zf, GlobalConst.MissionScriptFileName); modInfo.MissionScript = script; //modInfo.ShortName = mission.Name; modInfo.Name = mission.NameWithVersion; zf.Save(); } mission.Mutator = new Binary(File.ReadAllBytes(tempName)); mission.Script = Regex.Replace(mission.Script, "GameType=([^;]+);", (m) => { return(string.Format("GameType={0};", mission.NameWithVersion)); }); File.Delete(tempName); var resource = db.Resources.FirstOrDefault(x => x.MissionID == mission.MissionID); if (resource == null) { resource = new Resource() { DownloadCount = 0, TypeID = ZkData.ResourceType.Mod }; db.Resources.InsertOnSubmit(resource); } resource.InternalName = mission.NameWithVersion; resource.MissionID = mission.MissionID; resource.ResourceDependencies.Clear(); resource.ResourceDependencies.Add(new ResourceDependency() { NeedsInternalName = mission.Map }); resource.ResourceDependencies.Add(new ResourceDependency() { NeedsInternalName = mission.Mod }); resource.ResourceContentFiles.Clear(); // generate torrent var tempFile = Path.Combine(Path.GetTempPath(), mission.SanitizedFileName); File.WriteAllBytes(tempFile, mission.Mutator.ToArray()); var creator = new TorrentCreator(); creator.Path = tempFile; var torrentStream = new MemoryStream(); creator.Create(torrentStream); try { File.Delete(tempFile); } catch { } var md5 = Hash.HashBytes(mission.Mutator.ToArray()).ToString(); resource.ResourceContentFiles.Add(new ResourceContentFile() { FileName = mission.SanitizedFileName, Length = mission.Mutator.Length, LinkCount = 1, Links = string.Format(MissionFileUrl, mission.MissionID), Md5 = md5 }); var sh = resource.ResourceSpringHashes.SingleOrDefault(x => x.SpringVersion == mission.SpringVersion); if (sh == null) { sh = new ResourceSpringHash(); resource.ResourceSpringHashes.Add(sh); } sh.SpringVersion = mission.SpringVersion; sh.SpringHash = 0; var basePath = ConfigurationManager.AppSettings["ResourcePath"] ?? @"c:\projekty\zero-k.info\www\resources\"; File.WriteAllBytes(string.Format(@"{2}\{0}_{1}.torrent", resource.InternalName.EscapePath(), md5, basePath), torrentStream.ToArray()); File.WriteAllBytes(string.Format(@"{1}\{0}.metadata.xml.gz", resource.InternalName.EscapePath(), basePath), MetaDataCache.SerializeAndCompressMetaData(modInfo)); File.WriteAllBytes(string.Format(@"c:\projekty\zero-k.info\www\img\missions\{0}.png", mission.MissionID, basePath), mission.Image.ToArray()); }
void PerformUnitSyncOperation(WorkItem workItem) { Trace.TraceInformation("PerformUnitSyncOperation"); VerifyUnitSync(); if (unitSync == null) { Trace.TraceError("Skipping file after unitsync loading errors: {0}", workItem.CacheItem.ShortPath); CacheMarkFailedUnitSync(workItem.CacheItem.ShortPath); return; } var info = GetUnitSyncData(workItem.CacheItem.FileName); //upon completion of any work: dispose unitsync. It can be re-initialize again later by VerifyUnitSync() if (unitSync != null && GetWorkCost() < 1) { try { unitSync.Dispose(); unitSync = null; } catch (Exception ex) { Trace.TraceWarning("Error disposing unitsync: {0}", ex); } } if (info != null) { workItem.CacheItem.InternalName = info.Name; workItem.CacheItem.ResourceType = info is Map ? ResourceType.Map : ResourceType.Mod; var hashes = new List <SpringHashEntry>(); if (workItem.CacheItem.SpringHash != null) { hashes.AddRange(workItem.CacheItem.SpringHash.Where(x => x.SpringVersion != springPaths.SpringVersion)); } hashes.Add(new SpringHashEntry() { SpringHash = info.Checksum, SpringVersion = springPaths.SpringVersion }); workItem.CacheItem.SpringHash = hashes.ToArray(); CacheItemAdd(workItem.CacheItem); var serializedData = MetaDataCache.SerializeAndCompressMetaData(info); var map = info as Map; object userState = null; try { var creator = new TorrentCreator(); creator.Path = GetFullPath(workItem); var ms = new MemoryStream(); creator.Create(ms); byte[] minimap = null; byte[] metalMap = null; byte[] heightMap = null; if (map != null) { minimap = map.Minimap.ToBytes(ImageSize); metalMap = map.Metalmap.ToBytes(ImageSize); heightMap = map.Heightmap.ToBytes(ImageSize); userState = new MapRegisteredEventArgs(info.Name, map, minimap, metalMap, heightMap, serializedData); } var mod = info as Mod; if (mod != null) { userState = new KeyValuePair <Mod, byte[]>(mod, serializedData); } Trace.TraceInformation("uploading {0} to server", info.Name); service.RegisterResourceAsync(PlasmaServiceVersion, springPaths.SpringVersion, workItem.CacheItem.Md5.ToString(), workItem.CacheItem.Length, info is Map ? ResourceType.Map : ResourceType.Mod, workItem.CacheItem.FileName, info.Name, info.Checksum, serializedData, mod != null ? mod.Dependencies : null, minimap, metalMap, heightMap, ms.ToArray(), userState); Interlocked.Increment(ref itemsSending); } catch (Exception e) { Trace.TraceError("Error registering new resource {0}: {1}", workItem.CacheItem.ShortPath, e); } } else { Trace.TraceError("Could not unitsync file {0}", workItem.CacheItem.ShortPath); CacheMarkFailedUnitSync(workItem.CacheItem.ShortPath); } return; }