static string[] GetExcludeList(ContentServerClient.StorageSession session, Steam2Manifest manifest) { string[] excludeList = null; for (int x = 0; x < manifest.Nodes.Count; ++x) { var dirEntry = manifest.Nodes[x]; if (dirEntry.Name == "exclude.lst" && dirEntry.FullName.StartsWith("reslists" + Path.DirectorySeparatorChar) && (dirEntry.Attributes & Steam2Manifest.Node.Attribs.EncryptedFile) == 0) { string excludeFile = Encoding.UTF8.GetString(session.DownloadFile(dirEntry)); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { excludeFile = excludeFile.Replace('/', Path.DirectorySeparatorChar); } else { excludeFile = excludeFile.Replace('\\', Path.DirectorySeparatorChar); } excludeList = excludeFile.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); break; } } return(excludeList); }
private static void DownloadSteam2(int depotId, int depotVersion, string installDir) { Console.Write("Finding content servers..."); IPEndPoint[] contentServers = GetStorageServer(depotId, depotVersion, Config.CellID); if (contentServers == null || contentServers.Length == 0) { Console.WriteLine("\nError: Unable to find any Steam2 content servers for depot {0}, version {1}", depotId, depotVersion); return; } Console.WriteLine(" Done!"); Console.Write("Downloading depot manifest..."); string txtManifest = Path.Combine(installDir, "manifest.txt"); ContentServerClient csClient = new ContentServerClient(); ContentServerClient.StorageSession session = GetSteam2StorageSession(contentServers, csClient, depotId, depotVersion); if (session == null) { return; } Steam2Manifest manifest = null; Steam2ChecksumData checksums = null; List <int> NodesToDownload = new List <int>(); StringBuilder manifestBuilder = new StringBuilder(); byte[] cryptKey = CDRManager.GetDepotEncryptionKey(depotId, depotVersion); string[] excludeList = null; using ( session ) { manifest = session.DownloadManifest(); Console.WriteLine(" Done!"); if (!Config.DownloadManifestOnly) { // Skip downloading checksums if we're only interested in manifests. Console.Write("Downloading depot checksums..."); checksums = session.DownloadChecksums(); Console.WriteLine(" Done!"); } if (Config.UsingExclusionList) { excludeList = GetExcludeList(session, manifest); } } csClient.Disconnect(); if (!Config.DownloadManifestOnly) { Console.WriteLine("Building list of files to download and checking existing files..."); } // Build a list of files that need downloading. for (int x = 0; x < manifest.Nodes.Count; ++x) { var dirEntry = manifest.Nodes[x]; string downloadPath = Path.Combine(installDir, dirEntry.FullName.ToLower()); if (Config.DownloadManifestOnly) { if (dirEntry.FileID == -1) { continue; } manifestBuilder.Append(string.Format("{0}\n", dirEntry.FullName)); continue; } if (Config.UsingExclusionList && IsFileExcluded(dirEntry.FullName, excludeList)) { continue; } if (!TestIsFileIncluded(dirEntry.FullName)) { continue; } string path = Path.GetDirectoryName(downloadPath); if (path != "" && !Directory.Exists(path)) { Directory.CreateDirectory(path); } if (dirEntry.FileID == -1) { if (!Directory.Exists(downloadPath)) { // this is a directory, so lets just create it Directory.CreateDirectory(downloadPath); } continue; } FileInfo fi = new FileInfo(downloadPath); if (fi.Exists) { float perc = (( float )x / ( float )manifest.Nodes.Count) * 100.0f; Console.WriteLine("{0,6:#00.00}%\t{1}", perc, downloadPath); // Similar file, let's check checksums if (fi.Length == dirEntry.SizeOrCount && Util.ValidateFileChecksums(fi, checksums.GetFileChecksums(dirEntry.FileID))) { // checksums OK continue; } // Unlink the current file before we download a new one. // This will keep symbolic/hard link targets from being overwritten. fi.Delete(); } NodesToDownload.Add(x); } if (Config.DownloadManifestOnly) { File.WriteAllText(txtManifest, manifestBuilder.ToString()); return; } session = GetSteam2StorageSession(contentServers, csClient, depotId, depotVersion); if (session == null) { return; } using ( session ) { Console.WriteLine("Downloading selected files."); for (int x = 0; x < NodesToDownload.Count; ++x) { var dirEntry = manifest.Nodes[NodesToDownload[x]]; string downloadPath = Path.Combine(installDir, dirEntry.FullName.ToLower()); float perc = (( float )x / ( float )NodesToDownload.Count) * 100.0f; Console.WriteLine("{0,6:#00.00}%\t{1}", perc, downloadPath); var file = session.DownloadFile(dirEntry, ContentServerClient.StorageSession.DownloadPriority.High, cryptKey); File.WriteAllBytes(downloadPath, file); } } csClient.Disconnect(); }