From 5bc21f183a1626709b12db81976c36322f39b354 Mon Sep 17 00:00:00 2001 From: azuisleet Date: Wed, 1 Feb 2012 05:23:37 -0700 Subject: [PATCH] Refactored DepotDownloader to use CallbackManager --- DepotDownloader/ContentDownloader.cs | 18 +- DepotDownloader/Steam3Session.cs | 263 ++++++++++++++------------- 2 files changed, 150 insertions(+), 131 deletions(-) diff --git a/DepotDownloader/ContentDownloader.cs b/DepotDownloader/ContentDownloader.cs index 9668faa1..636800c3 100644 --- a/DepotDownloader/ContentDownloader.cs +++ b/DepotDownloader/ContentDownloader.cs @@ -294,7 +294,7 @@ namespace DepotDownloader steam3Credentials = steam3.WaitForCredentials(); - if (!steam3Credentials.HasSessionToken) + if (!steam3Credentials.IsValid) { Console.WriteLine("Unable to get steam3 credentials."); return; @@ -311,7 +311,7 @@ namespace DepotDownloader private static ContentServerClient.Credentials GetSteam2Credentials(uint appId) { - if (steam3 == null || !steam3Credentials.HasSessionToken) + if (steam3 == null || !steam3Credentials.IsValid) { return null; } @@ -443,7 +443,7 @@ namespace DepotDownloader List serverList = steam3.steamClient.GetServersOfType(EServerType.CS); List cdnServers = null; - int tries = 0, counterDeferred = 0, counterCDN = 0; + int tries = 0, counterDeferred = 0; for(int i = 0; ; i++ ) { @@ -452,9 +452,8 @@ namespace DepotDownloader cdnServers = CDNClient.FetchServerList(new CDNClient.ClientEndPoint(endpoint.Address.ToString(), endpoint.Port), Config.CellID); if (cdnServers == null) counterDeferred++; - else if (cdnServers.Count == 0) counterCDN++; - if (cdnServers != null && cdnServers.Count > 0) + if (cdnServers != null && cdnServers.Count((ep) => { return ep.Type == "CS"; }) > 0) break; if (((i+1) % serverList.Count) == 0) @@ -465,9 +464,8 @@ namespace DepotDownloader return; } - Console.Write("\nSearching for content servers... (deferred: {0}, CDN: {1})", counterDeferred, counterCDN); + Console.Write("\nSearching for content servers... (deferred: {0})", counterDeferred); counterDeferred = 0; - counterCDN = 0; Thread.Sleep(1000); } } @@ -481,11 +479,13 @@ namespace DepotDownloader Console.WriteLine(" Done!"); Console.Write("Downloading depot manifest..."); + List cdnEndpoints = cdnServers.Where((ep) => { return ep.Type == "CDN"; }).ToList(); + List csEndpoints = cdnServers.Where((ep) => { return ep.Type == "CS"; }).ToList(); CDNClient cdnClient = null; - foreach (var server in cdnServers) + foreach (var server in csEndpoints) { - CDNClient client = new CDNClient(cdnServers[0], steam3.AppTickets[(uint)depotId]); + CDNClient client = new CDNClient(server, steam3.AppTickets[(uint)depotId]); if (client.Connect()) { diff --git a/DepotDownloader/Steam3Session.cs b/DepotDownloader/Steam3Session.cs index ecc33010..0dd79ac4 100644 --- a/DepotDownloader/Steam3Session.cs +++ b/DepotDownloader/Steam3Session.cs @@ -13,9 +13,13 @@ namespace DepotDownloader { public class Credentials { - public bool HasSessionToken { get; set; } public ulong SessionToken { get; set; } public byte[] Steam2Ticket { get; set; } + + public bool IsValid + { + get { return SessionToken > 0 && Steam2Ticket != null; } + } } public ReadOnlyCollection Licenses @@ -34,6 +38,8 @@ namespace DepotDownloader SteamUser steamUser; SteamApps steamApps; + CallbackManager callbacks; + bool bConnected; bool bAborted; DateTime connectTime; @@ -65,6 +71,13 @@ namespace DepotDownloader this.steamUser = this.steamClient.GetHandler(); this.steamApps = this.steamClient.GetHandler(); + this.callbacks = new CallbackManager(this.steamClient); + + this.callbacks.Register(new Callback(ConnectedCallback)); + this.callbacks.Register(new Callback(LogOnCallback)); + this.callbacks.Register(new Callback(SessionTokenCallback)); + this.callbacks.Register(new Callback(LicenseListCallback)); + Console.Write( "Connecting to Steam3..." ); Connect(); @@ -72,55 +85,106 @@ namespace DepotDownloader public Credentials WaitForCredentials() { + if (credentials.IsValid || bAborted) + return credentials; + do { - HandleCallbacks(); + WaitForCallbacks(); } - while (!bAborted && (credentials.SessionToken == 0 || credentials.Steam2Ticket == null)); + while (!bAborted && !credentials.IsValid); return credentials; } public void RequestAppInfo(uint appId) { - if (bAborted || AppInfo.ContainsKey(appId)) + if (AppInfo.ContainsKey(appId) || bAborted) return; - steamApps.GetAppInfo( new uint[] { appId } ); + Action cbMethod = appInfo => + { + foreach (var app in appInfo.Apps) + { + Console.WriteLine("Got AppInfo for {0}: {1}", app.AppID, app.Status); + AppInfo.Add(app.AppID, app); - do + KeyValue depots; + if (app.Sections.TryGetValue(EAppInfoSection.Depots, out depots)) + { + if (depots[app.AppID.ToString()]["OverridesCDDB"].AsBoolean(false)) + { + AppInfoOverridesCDR[app.AppID] = true; + } + } + } + }; + + using (JobCallback appInfoCallback = new JobCallback(steamApps.GetAppInfo(appId), cbMethod, callbacks)) { - HandleCallbacks(); + do + { + WaitForCallbacks(); + } + while (!appInfoCallback.Completed && !bAborted); } - while (!bAborted && !AppInfo.ContainsKey(appId)); } public void RequestAppTicket(uint appId) { - if (bAborted || AppTickets.ContainsKey(appId)) + if (AppTickets.ContainsKey(appId) || bAborted) return; - steamApps.GetAppOwnershipTicket(appId); + Action cbMethod = appTicket => + { + if (appTicket.Result != EResult.OK) + { + Console.WriteLine("Unable to get appticket for {0}: {1}", appTicket.AppID, appTicket.Result); + Abort(); + } + else + { + Console.WriteLine("Got appticket for {0}!", appTicket.AppID); + AppTickets[appTicket.AppID] = appTicket.Ticket; + } + }; - do + using (JobCallback appTicketCallback = new JobCallback(steamApps.GetAppOwnershipTicket(appId), cbMethod, callbacks)) { - HandleCallbacks(); + do + { + WaitForCallbacks(); + } + while (!appTicketCallback.Completed && !bAborted); } - while (!bAborted && !AppTickets.ContainsKey(appId)); } public void RequestDepotKey(uint depotId) { - if (bAborted || DepotKeys.ContainsKey(depotId)) + if (DepotKeys.ContainsKey(depotId) || bAborted) return; - steamApps.GetDepotDecryptionKey(depotId); + Action cbMethod = depotKey => + { + Console.WriteLine("Got depot key for {0} result: {1}", depotKey.DepotID, depotKey.Result); - do + if (depotKey.Result != EResult.OK) + { + Abort(); + return; + } + + DepotKeys[depotKey.DepotID] = depotKey.DepotKey; + }; + + using (JobCallback depotKeyCallback = new JobCallback(steamApps.GetDepotDecryptionKey(depotId), cbMethod, callbacks)) { - HandleCallbacks(); + do + { + WaitForCallbacks(); + } + while (!depotKeyCallback.Completed && !bAborted); } - while (!bAborted && !DepotKeys.ContainsKey(depotId)); } void Connect() @@ -142,128 +206,83 @@ namespace DepotDownloader bConnected = false; } - void HandleCallbacks() - { - while ( true ) - { - var callback = steamClient.WaitForCallback( true, TimeSpan.FromSeconds( 1 ) ); - - TimeSpan diff = DateTime.Now - connectTime; - - if (diff > STEAM3_TIMEOUT && !bConnected) - { - Abort(); - break; - } - - if ( callback == null ) - break; - if ( callback.IsType() ) - { - Console.WriteLine( " Done!" ); - bConnected = true; - steamUser.LogOn( logonDetails ); + private void WaitForCallbacks() + { + callbacks.RunWaitCallbacks( TimeSpan.FromSeconds(1) ); - Console.Write( "Logging '{0}' into Steam3...", logonDetails.Username ); - } - else if ( callback.IsType() ) - { - var msg = callback as SteamUser.LoggedOnCallback; + TimeSpan diff = DateTime.Now - connectTime; - if ( msg.Result == EResult.AccountLogonDenied ) - { - Console.WriteLine( "This account is protected by Steam Guard. Please enter the authentication code sent to your email address." ); - Console.Write( "Auth Code: " ); + if (diff > STEAM3_TIMEOUT && !bConnected) + { + Console.WriteLine("Timeout connecting to Steam3."); + Abort(); - logonDetails.AuthCode = Console.ReadLine(); + return; + } + } - Console.Write( "Retrying Steam3 connection..." ); - Connect(); - continue; - } - else if ( msg.Result != EResult.OK ) - { - Console.WriteLine( "Unable to login to Steam3: {0}", msg.Result ); - Abort(); - break; - } + private void ConnectedCallback(SteamClient.ConnectedCallback connected) + { + Console.WriteLine(" Done!"); + bConnected = true; + steamUser.LogOn(logonDetails); - Console.WriteLine( " Done!" ); + Console.Write("Logging '{0}' into Steam3...", logonDetails.Username); + } - Console.WriteLine( "Got Steam2 Ticket!" ); - credentials.Steam2Ticket = msg.Steam2Ticket; + private void LogOnCallback(SteamUser.LoggedOnCallback loggedOn) + { + if (loggedOn.Result == EResult.AccountLogonDenied) + { + Console.WriteLine("This account is protected by Steam Guard. Please enter the authentication code sent to your email address."); + Console.Write("Auth Code: "); - if (ContentDownloader.Config.CellID == 0) - { - Console.WriteLine( "Using Steam3 suggest CellID: " + msg.CellID ); - ContentDownloader.Config.CellID = (int)msg.CellID; - } - } - else if (callback.IsType()) - { - var msg = callback as SteamApps.AppOwnershipTicketCallback; + logonDetails.AuthCode = Console.ReadLine(); - if ( msg.Result != EResult.OK ) - { - Console.WriteLine( "Unable to get appticket for {0}: {1}", msg.AppID, msg.Result ); - Abort(); - break; - } + Console.Write("Retrying Steam3 connection..."); + Connect(); - Console.WriteLine( "Got appticket for {0}!", msg.AppID ); - AppTickets[msg.AppID] = msg.Ticket; + return; + } + else if (loggedOn.Result != EResult.OK) + { + Console.WriteLine("Unable to login to Steam3: {0}", loggedOn.Result); + Abort(); - } - else if (callback.IsType()) - { - var msg = callback as SteamUser.SessionTokenCallback; + return; + } - Console.WriteLine( "Got session token!" ); - credentials.SessionToken = msg.SessionToken; - credentials.HasSessionToken = true; - } - else if (callback.IsType()) - { - var msg = callback as SteamApps.LicenseListCallback; + Console.WriteLine(" Done!"); - if ( msg.Result != EResult.OK ) - { - Console.WriteLine( "Unable to get license list: {0} ", msg.Result ); - Abort(); - break; - } + Console.WriteLine("Got Steam2 Ticket!"); + credentials.Steam2Ticket = loggedOn.Steam2Ticket; - Console.WriteLine( "Got {0} licenses for account!", msg.LicenseList.Count ); - Licenses = msg.LicenseList; - } - else if (callback.IsType>()) - { - var msg = callback as SteamClient.JobCallback; + if (ContentDownloader.Config.CellID == 0) + { + Console.WriteLine("Using Steam3 suggest CellID: " + loggedOn.CellID); + ContentDownloader.Config.CellID = (int)loggedOn.CellID; + } + } - foreach (var app in msg.Callback.Apps) - { - Console.WriteLine("Got AppInfo for {0}: {1}", app.AppID, app.Status); - AppInfo.Add(app.AppID, app); + private void SessionTokenCallback(SteamUser.SessionTokenCallback sessionToken) + { + Console.WriteLine("Got session token!"); + credentials.SessionToken = sessionToken.SessionToken; + } - KeyValue depots; - if ( app.Sections.TryGetValue( EAppInfoSection.Depots, out depots ) ) - { - if ( depots[ app.AppID.ToString() ][ "OverridesCDDB" ].AsBoolean( false ) ) - { - AppInfoOverridesCDR[ app.AppID ] = true; - } - } - } - } - else if (callback.IsType()) - { - var msg = callback as SteamApps.DepotKeyCallback; + private void LicenseListCallback(SteamApps.LicenseListCallback licenseList) + { + if (licenseList.Result != EResult.OK) + { + Console.WriteLine("Unable to get license list: {0} ", licenseList.Result); + Abort(); - Console.WriteLine("Got depot key for {0} result: {1}", msg.DepotID, msg.Result); - DepotKeys[msg.DepotID] = msg.DepotKey; - } + return; } + + Console.WriteLine("Got {0} licenses for account!", licenseList.LicenseList.Count); + Licenses = licenseList.LicenseList; } }