Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        private static ContentServerClient.StorageSession GetSteam2StorageSession(IPEndPoint [] contentServers, ContentServerClient csClient, int depotId, int depotVersion)
        {
            ContentServerClient.StorageSession session = null;
            if (csClient.IsConnected && contentServers.Contains(lastSteam2ContentServer))
            {
                try
                {
                    session = csClient.OpenStorage((uint)depotId, (uint)depotVersion, (uint)Config.CellID, null, false);

                    return(session);
                }
                catch (Steam2Exception)
                {
                    csClient.Disconnect();
                }
            }

            int tries = 0;
            int counterSocket = 0, counterSteam2 = 0;

            for (int i = 0; ; i++)
            {
                IPEndPoint endpoint = contentServers[i % contentServers.Length];

                try
                {
                    csClient.Connect(endpoint);
                    session = csClient.OpenStorage((uint)depotId, (uint)depotVersion, (uint)Config.CellID, GetSteam2Credentials((uint)depotId), true);
                    lastSteam2ContentServer = endpoint;
                    break;
                }
                catch (SocketException)
                {
                    counterSocket++;
                }
                catch (Steam2Exception)
                {
                    csClient.Disconnect();
                    counterSteam2++;
                }

                if (((i + 1) % contentServers.Length) == 0)
                {
                    if (++tries > MAX_CONNECT_RETRIES)
                    {
                        Console.WriteLine("\nGiving up finding Steam2 content server.");
                        return(null);
                    }

                    Console.WriteLine("\nSearching for content servers... (socket error: {0}, steam2 error: {1})", counterSocket, counterSteam2);
                    counterSocket = 0;
                    counterSteam2 = 0;
                    Thread.Sleep(1000);
                }
            }
            return(session);
        }
Ejemplo n.º 3
0
        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();
        }