diff --git a/OpenMetaverse/NetworkManager.cs b/OpenMetaverse/NetworkManager.cs index 5654c73..f294fcb 100644 --- a/OpenMetaverse/NetworkManager.cs +++ b/OpenMetaverse/NetworkManager.cs @@ -646,6 +646,39 @@ namespace OpenMetaverse } } + /// + /// Begins the non-blocking logout. Makes sure that the LoggedOut event is + /// called even if the server does not send a logout reply, and Shutdown() + /// is properly called. + /// + public void BeginLogout() + { + // Wait for a logout response (by way of the LoggedOut event. If the + // response is received, shutdown will be fired in the callback. + // Otherwise we fire it manually with a NetworkTimeout type after LOGOUT_TIMEOUT + System.Timers.Timer timeout = new System.Timers.Timer(); + + EventHandler callback = delegate(object sender, LoggedOutEventArgs e) { + Shutdown(DisconnectType.ClientInitiated); + timeout.Stop(); + }; + + LoggedOut += callback; + + timeout.Interval = Client.Settings.LOGOUT_TIMEOUT; + timeout.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e) { + timeout.Stop(); + Shutdown(DisconnectType.NetworkTimeout); + OnLoggedOut(new LoggedOutEventArgs(new List())); + }; + timeout.Start(); + + // Send the packet requesting a clean logout + RequestLogout(); + + LoggedOut -= callback; + } + /// /// Initiate a blocking logout request. This will return when the logout /// handshake has completed or when Settings.LOGOUT_TIMEOUT