From 9ecc8c06572d6f6359f39974247ff43a3c942796 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 1 Nov 2009 09:55:52 +0000 Subject: [PATCH] Shutdown sequence cleanup. Dispose tabs on shutdown. Check if NetcomSync is invocable before using it. Added client signatures (not used anywhere atm) git-svn-id: https://radegast.googlecode.com/svn/trunk@403 f7a694da-4d33-11de-9ad6-1127a62b9fcd --- Radegast/Core/ClientSignatures.cs | 76 ++++ Radegast/Core/RadegastInstance.cs | 4 - Radegast/GUI/Consoles/AnimDetail.cs | 29 +- Radegast/GUI/Consoles/AnimTab.Designer.cs | 9 + Radegast/GUI/Consoles/AnimTab.cs | 8 - Radegast/GUI/Consoles/TabsConsole.Designer.cs | 15 + Radegast/GUI/Consoles/TabsConsole.cs | 50 ++- Radegast/GUI/Dialogs/MainForm.Designer.cs | 37 +- Radegast/GUI/Dialogs/MainForm.cs | 31 +- Radegast/Netcom/RadegastNetcom/SLNetCom.cs | 30 +- Radegast/Properties/Resources.Designer.cs | 31 ++ Radegast/Properties/Resources.resx | 3 + Radegast/Radegast.csproj | 2 + Radegast/Resources/client_signatures.txt | 537 ++++++++++++++++++++++++++ 14 files changed, 774 insertions(+), 88 deletions(-) create mode 100644 Radegast/Core/ClientSignatures.cs create mode 100644 Radegast/Resources/client_signatures.txt diff --git a/Radegast/Core/ClientSignatures.cs b/Radegast/Core/ClientSignatures.cs new file mode 100644 index 0000000..3af4b5e --- /dev/null +++ b/Radegast/Core/ClientSignatures.cs @@ -0,0 +1,76 @@ +// +// Radegast Metaverse Client +// Copyright (c) 2009, Radegast Development Team +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the application "Radegast", nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// $Id: IMTextManager.cs 361 2009-10-24 15:04:57Z latifer $ +// +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Reflection; +using OpenMetaverse; +using OpenMetaverse.StructuredData; + +namespace Radegast +{ + public class ClientSignatures + { + public static Dictionary Signatures { get; private set; } + + static ClientSignatures() + { + Signatures = new Dictionary(); + + try + { + OSDMap clients = (OSDMap)OSDParser.DeserializeLLSDXml(Properties.Resources.client_signatures); + + foreach (KeyValuePair kvp in clients) + { + UUID sig; + + if (UUID.TryParse(kvp.Key, out sig)) + { + if (kvp.Value.Type == OSDType.Map) + { + OSDMap client = (OSDMap)kvp.Value; + if (client.ContainsKey("name")) + { + Signatures.Add(sig, client["name"].AsString()); + } + } + } + } + } + catch + { + Logger.Log("Failed to parse client signatures.", Helpers.LogLevel.Warning); + } + } + } +} diff --git a/Radegast/Core/RadegastInstance.cs b/Radegast/Core/RadegastInstance.cs index 91a7462..3ef5dc7 100644 --- a/Radegast/Core/RadegastInstance.cs +++ b/Radegast/Core/RadegastInstance.cs @@ -90,9 +90,6 @@ namespace Radegast public string InventoryCacheFileName { get { return Path.Combine(ClientDir, "inventory.cache"); } } - private string animCacheDir; - public string AnimCacheDir { get { return animCacheDir; } } - private string globalLogFile; public string GlobalLogFile { get { return globalLogFile; } } @@ -560,7 +557,6 @@ namespace Radegast userDir = System.Environment.CurrentDirectory; }; - animCacheDir = Path.Combine(userDir, @"anim_cache"); globalLogFile = Path.Combine(userDir, Properties.Resources.ProgramName + ".log"); globalSettings = new Settings(Path.Combine(userDir, "settings.xml")); } diff --git a/Radegast/GUI/Consoles/AnimDetail.cs b/Radegast/GUI/Consoles/AnimDetail.cs index caf6717..b513fc8 100644 --- a/Radegast/GUI/Consoles/AnimDetail.cs +++ b/Radegast/GUI/Consoles/AnimDetail.cs @@ -45,6 +45,7 @@ namespace Radegast private int n; private List friends; private FriendInfo friend; + private byte[] animData; public AnimDetail(RadegastInstance instance, Avatar av, UUID anim, int n) { @@ -62,9 +63,10 @@ namespace Radegast private void AnimDetail_Load(object sender, EventArgs e) { - if (File.Exists(instance.AnimCacheDir + "/" + anim + ".fail")) + if (Animations.ToDictionary().ContainsKey(anim)) { Visible = false; + Dispose(); return; } @@ -81,13 +83,6 @@ namespace Radegast cbFriends.Items.Add(f); } - if (File.Exists(instance.AnimCacheDir + "/" + anim + ".sla")) - { - pnlSave.Visible = true; - return; - } - - instance.Client.Assets.RequestAsset(anim, AssetType.Animation, true, Assets_OnAssetReceived); } @@ -105,8 +100,7 @@ namespace Radegast { try { - byte[] data = File.ReadAllBytes(instance.AnimCacheDir + "/" + anim + ".sla"); - File.WriteAllBytes(dlg.FileName, data); + File.WriteAllBytes(dlg.FileName, animData); } catch (Exception ex) { @@ -119,25 +113,21 @@ namespace Radegast { if (InvokeRequired) { - Invoke(new MethodInvoker(delegate() - { - Assets_OnAssetReceived(transfer, asset); - })); + Invoke(new MethodInvoker(() => Assets_OnAssetReceived(transfer, asset))); return; } if (transfer.Success) { Logger.Log("Animation " + anim + " download success " + asset.AssetData.Length + " bytes.", Helpers.LogLevel.Debug); - File.WriteAllBytes(instance.AnimCacheDir + "/" + anim + ".sla", asset.AssetData); pnlSave.Visible = true; + animData = asset.AssetData; } else { Logger.Log("Animation " + anim + " download failed.", Helpers.LogLevel.Debug); - FileStream f = File.Create(instance.AnimCacheDir + "/" + anim + ".fail"); - f.Close(); Visible = false; + Dispose(); } } @@ -155,8 +145,9 @@ namespace Radegast private void btnSend_Click(object sender, EventArgs e) { - byte[] data = File.ReadAllBytes(instance.AnimCacheDir + "/" + anim + ".sla"); - instance.Client.Inventory.RequestCreateItemFromAsset(data, boxAnimName.Text, "(No description)", AssetType.Animation, InventoryType.Animation, instance.Client.Inventory.FindFolderForType(AssetType.Animation), On_ItemCreated); + if (animData == null) return; + + instance.Client.Inventory.RequestCreateItemFromAsset(animData, boxAnimName.Text, "(No description)", AssetType.Animation, InventoryType.Animation, instance.Client.Inventory.FindFolderForType(AssetType.Animation), On_ItemCreated); lblStatus.Text = "Uploading..."; cbFriends.Enabled = false; } diff --git a/Radegast/GUI/Consoles/AnimTab.Designer.cs b/Radegast/GUI/Consoles/AnimTab.Designer.cs index c426282..2e21148 100644 --- a/Radegast/GUI/Consoles/AnimTab.Designer.cs +++ b/Radegast/GUI/Consoles/AnimTab.Designer.cs @@ -46,6 +46,15 @@ namespace Radegast if (disposing && (components != null)) { components.Dispose(); } + + if (disposing) + { + foreach (System.Windows.Forms.Control c in Controls) + { + if (!c.IsDisposed) + c.Dispose(); + } + } base.Dispose(disposing); } diff --git a/Radegast/GUI/Consoles/AnimTab.cs b/Radegast/GUI/Consoles/AnimTab.cs index 777c451..83d9406 100644 --- a/Radegast/GUI/Consoles/AnimTab.cs +++ b/Radegast/GUI/Consoles/AnimTab.cs @@ -44,7 +44,6 @@ namespace Radegast private Avatar av; private List seenAnim = new List(); private int n = 0; - private static bool checkedDir = false; public AnimTab(RadegastInstance instance, Avatar av) { @@ -88,13 +87,6 @@ namespace Radegast private void AnimTab_Load(object sender, EventArgs e) { - if (!checkedDir) { - checkedDir = true; - if (!Directory.Exists(instance.AnimCacheDir)) - { - Directory.CreateDirectory(instance.AnimCacheDir); - } - } } } } diff --git a/Radegast/GUI/Consoles/TabsConsole.Designer.cs b/Radegast/GUI/Consoles/TabsConsole.Designer.cs index 9b2de17..a88acbf 100644 --- a/Radegast/GUI/Consoles/TabsConsole.Designer.cs +++ b/Radegast/GUI/Consoles/TabsConsole.Designer.cs @@ -47,6 +47,21 @@ namespace Radegast { components.Dispose(); } + + if (disposing) + { + lock (tabs) + { + System.Collections.Generic.List tabNames = new System.Collections.Generic.List(tabs.Keys); + for (int i = 0; i < tabNames.Count; i++) + { + if (tabNames[i] != "chat") + ForceCloseTab(tabNames[i]); + } + ForceCloseTab("chat"); + } + } + base.Dispose(disposing); } diff --git a/Radegast/GUI/Consoles/TabsConsole.cs b/Radegast/GUI/Consoles/TabsConsole.cs index 5cef849..ad8f1e9 100644 --- a/Radegast/GUI/Consoles/TabsConsole.cs +++ b/Radegast/GUI/Consoles/TabsConsole.cs @@ -176,7 +176,7 @@ namespace Radegast if (tabs.ContainsKey("login")) { if (selectedTab.Name == "login") - tabs["chat"].Select(); + SelectDefaultTab(); ForceCloseTab("login"); } @@ -188,7 +188,7 @@ namespace Radegast { DisposeOnlineTabs(); - tabs["chat"].Select(); + SelectDefaultTab(); DisplayNotificationInChat("Logged out."); } @@ -198,8 +198,7 @@ namespace Radegast if (e.Reason == NetworkManager.DisconnectType.ClientInitiated) return; DisposeOnlineTabs(); - - tabs["chat"].Select(); + SelectDefaultTab(); DisplayNotificationInChat("Disconnected: " + e.Message, ChatBufferTextStyle.Error); } @@ -308,6 +307,14 @@ namespace Radegast } /// + /// Make default tab (chat) active + /// + public void SelectDefaultTab() + { + if (TabExists("chat")) + tabs["chat"].Select(); + } + /// /// Displays notification in the main chat tab /// /// Message to be printed in the chat tab @@ -458,18 +465,21 @@ namespace Radegast /// private void DisposeOnlineTabs() { - ForceCloseTab("voice"); - - // Mono crashes if we try to open map for the second time - if (!instance.MonoRuntime) - ForceCloseTab("map"); - else - tabs["map"].Hide(); - - ForceCloseTab("search"); - ForceCloseTab("inventory"); - ForceCloseTab("groups"); - ForceCloseTab("friends"); + lock (tabs) + { + ForceCloseTab("voice"); + + // Mono crashes if we try to open map for the second time + if (!instance.MonoRuntime) + ForceCloseTab("map"); + else if (TabExists("map")) + tabs["map"].Hide(); + + ForceCloseTab("search"); + ForceCloseTab("inventory"); + ForceCloseTab("groups"); + ForceCloseTab("friends"); + } } private void ForceCloseTab(string name) @@ -594,7 +604,7 @@ namespace Radegast if (selectedTab != null && selectedTab == tab) { tab.Deselect(); - tabs["chat"].Select(); + SelectDefaultTab(); } } @@ -602,10 +612,10 @@ namespace Radegast { RadegastTab tab = (RadegastTab)sender; - if (selectedTab != null && selectedTab == tab) + if (selectedTab != null && selectedTab == tab && tab.Name != "chat") { tab.Deselect(); - tabs["chat"].Select(); + SelectDefaultTab(); } tabs.Remove(tab.Name); @@ -903,7 +913,7 @@ namespace Radegast { if (!selectedTab.AllowDetach) return; RadegastTab tab = selectedTab; - tabs["chat"].Select(); + SelectDefaultTab(); tab.Detach(instance); } diff --git a/Radegast/GUI/Dialogs/MainForm.Designer.cs b/Radegast/GUI/Dialogs/MainForm.Designer.cs index 79e09ed..b5555cd 100644 --- a/Radegast/GUI/Dialogs/MainForm.Designer.cs +++ b/Radegast/GUI/Dialogs/MainForm.Designer.cs @@ -83,6 +83,7 @@ namespace Radegast this.tmnuPrefs = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); this.tmnuExit = new System.Windows.Forms.ToolStripMenuItem(); + this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.tbtnWorld = new System.Windows.Forms.ToolStripDropDownButton(); this.tmnuControlFly = new System.Windows.Forms.ToolStripMenuItem(); this.tmnuControlAlwaysRun = new System.Windows.Forms.ToolStripMenuItem(); @@ -112,8 +113,8 @@ namespace Radegast this.tbtnMap = new System.Windows.Forms.ToolStripButton(); this.tbnObjects = new System.Windows.Forms.ToolStripButton(); this.lblTime = new System.Windows.Forms.ToolStripLabel(); - this.tbtnVoice = new System.Windows.Forms.ToolStripButton(); this.tbtnMedia = new System.Windows.Forms.ToolStripButton(); + this.tbtnVoice = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.tbtnHelp = new System.Windows.Forms.ToolStripDropDownButton(); this.keyboardShortcutsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -182,7 +183,8 @@ namespace Radegast this.reconnectToolStripMenuItem, this.tmnuPrefs, this.toolStripMenuItem2, - this.tmnuExit}); + this.tmnuExit, + this.testToolStripMenuItem}); this.tbtnSLeek.Image = global::Radegast.Properties.Resources.computer_16; this.tbtnSLeek.ImageTransparentColor = System.Drawing.Color.Magenta; this.tbtnSLeek.Name = "tbtnSLeek"; @@ -251,6 +253,14 @@ namespace Radegast this.tmnuExit.Text = "E&xit"; this.tmnuExit.Click += new System.EventHandler(this.tmnuExit_Click); // + // testToolStripMenuItem + // + this.testToolStripMenuItem.Name = "testToolStripMenuItem"; + this.testToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.testToolStripMenuItem.Text = "Test"; + this.testToolStripMenuItem.Visible = false; + this.testToolStripMenuItem.Click += new System.EventHandler(this.testToolStripMenuItem_Click); + // // tbtnWorld // this.tbtnWorld.AutoToolTip = false; @@ -513,17 +523,6 @@ namespace Radegast this.lblTime.Size = new System.Drawing.Size(30, 22); this.lblTime.Text = "--:--"; // - // tbtnVoice - // - this.tbtnVoice.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.tbtnVoice.Enabled = false; - this.tbtnVoice.Image = ((System.Drawing.Image)(resources.GetObject("tbtnVoice.Image"))); - this.tbtnVoice.ImageTransparentColor = System.Drawing.Color.Magenta; - this.tbtnVoice.Name = "tbtnVoice"; - this.tbtnVoice.Size = new System.Drawing.Size(40, 22); - this.tbtnVoice.Text = "Voice"; - this.tbtnVoice.Click += new System.EventHandler(this.tbtnVoice_Click); - // // tbtnMedia // this.tbtnMedia.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; @@ -536,6 +535,17 @@ namespace Radegast this.tbtnMedia.Visible = false; this.tbtnMedia.Click += new System.EventHandler(this.tbtnMedia_Click); // + // tbtnVoice + // + this.tbtnVoice.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.tbtnVoice.Enabled = false; + this.tbtnVoice.Image = ((System.Drawing.Image)(resources.GetObject("tbtnVoice.Image"))); + this.tbtnVoice.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tbtnVoice.Name = "tbtnVoice"; + this.tbtnVoice.Size = new System.Drawing.Size(40, 22); + this.tbtnVoice.Text = "Voice"; + this.tbtnVoice.Click += new System.EventHandler(this.tbtnVoice_Click); + // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; @@ -842,6 +852,7 @@ namespace Radegast public System.Windows.Forms.ToolStripMenuItem reconnectToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem keyboardShortcutsToolStripMenuItem; private System.Windows.Forms.ToolStripButton tbtnVoice; + public System.Windows.Forms.ToolStripMenuItem testToolStripMenuItem; } } diff --git a/Radegast/GUI/Dialogs/MainForm.cs b/Radegast/GUI/Dialogs/MainForm.cs index ac7de28..d00153c 100644 --- a/Radegast/GUI/Dialogs/MainForm.cs +++ b/Radegast/GUI/Dialogs/MainForm.cs @@ -42,6 +42,7 @@ using System.Web; using Radegast.Netcom; using OpenMetaverse; using OpenMetaverse.StructuredData; +using OpenMetaverse.Assets; namespace Radegast { @@ -234,6 +235,8 @@ namespace Radegast private void DisplayAutoReconnectForm() { + if (IsDisposed) return; + if (InvokeRequired) { BeginInvoke(new MethodInvoker(DisplayAutoReconnectForm)); @@ -259,7 +262,7 @@ namespace Radegast )) { Name = "Reconnect Delay Thread", - IsBackground = false + IsBackground = true } ).Start(); } @@ -898,18 +901,6 @@ namespace Radegast private void cleanCacheToolStripMenuItem_Click(object sender, EventArgs e) { client.Assets.Cache.Clear(); - DirectoryInfo di = new DirectoryInfo(instance.AnimCacheDir); - FileInfo[] files = di.GetFiles(); - - int num = 0; - foreach (FileInfo file in files) - { - file.Delete(); - ++num; - } - - Logger.Log("Wiped out " + num + " files from the anim cache directory.", Helpers.LogLevel.Debug); - } private void rebakeTexturesToolStripMenuItem_Click(object sender, EventArgs e) @@ -1265,6 +1256,20 @@ namespace Radegast } } } + + // Menu item for testing out stuff + private void testToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (KeyValuePair kvp in Sounds.ToDictionary()) + { + client.Assets.RequestAsset(kvp.Key, AssetType.Sound, true, (AssetDownload transfer, Asset asset) => + { + System.Console.WriteLine("Sound '{0}' download success: {1}", transfer.AssetID, transfer.Success); + } + ); + } + } + #endregion } } \ No newline at end of file diff --git a/Radegast/Netcom/RadegastNetcom/SLNetCom.cs b/Radegast/Netcom/RadegastNetcom/SLNetCom.cs index 430948e..1f34916 100644 --- a/Radegast/Netcom/RadegastNetcom/SLNetCom.cs +++ b/Radegast/Netcom/RadegastNetcom/SLNetCom.cs @@ -58,7 +58,7 @@ namespace Radegast.Netcom // NetcomSync is used for raising certain events on the // GUI/main thread. Useful if you're modifying GUI controls // in the client app when responding to those events. - private ISynchronizeInvoke netcomSync; + private Control netcomSync; #region ClientConnected event /// The event subscribers, null of no subscribers @@ -127,6 +127,14 @@ namespace Radegast.Netcom RegisterClientEvents(client); } + private bool CanSyncInvoke + { + get + { + return netcomSync != null && !netcomSync.IsDisposed && netcomSync.IsHandleCreated && netcomSync.InvokeRequired; + } + } + public void Dispose() { if (client != null) @@ -137,7 +145,7 @@ namespace Radegast.Netcom void Self_IM(object sender, InstantMessageEventArgs e) { - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnInstantMessageRaise(OnInstantMessageReceived), new object[] { e }); else OnInstantMessageReceived(e); @@ -149,7 +157,7 @@ namespace Radegast.Netcom { loggedIn = true; client.Self.RequestBalance(); - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) { netcomSync.BeginInvoke(new ClientConnectedRaise(OnClientConnected), new object[] { EventArgs.Empty }); } @@ -161,7 +169,7 @@ namespace Radegast.Netcom LoginProgressEventArgs ea = new LoginProgressEventArgs(e.Status, e.Message); - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnClientLoginRaise(OnClientLoginStatus), new object[] { e }); else OnClientLoginStatus(e); @@ -171,7 +179,7 @@ namespace Radegast.Netcom { loggedIn = false; - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnClientLogoutRaise(OnClientLoggedOut), new object[] { EventArgs.Empty }); else OnClientLoggedOut(EventArgs.Empty); @@ -182,7 +190,7 @@ namespace Radegast.Netcom if (e.Status == TeleportStatus.Finished || e.Status == TeleportStatus.Failed) teleporting = false; - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnTeleportStatusRaise(OnTeleportStatusChanged), new object[] { e }); else OnTeleportStatusChanged(e); @@ -190,7 +198,7 @@ namespace Radegast.Netcom private void Self_ChatFromSimulator(object sender, ChatEventArgs e) { - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnChatRaise(OnChatReceived), new object[] { e }); else OnChatReceived(e); @@ -200,7 +208,7 @@ namespace Radegast.Netcom { loggedIn = false; - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnClientDisconnectRaise(OnClientDisconnected), new object[] { e }); else OnClientDisconnected(e); @@ -208,7 +216,7 @@ namespace Radegast.Netcom void Self_MoneyBalance(object sender, BalanceEventArgs e) { - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnMoneyBalanceRaise(OnMoneyBalanceUpdated), new object[] { e }); else OnMoneyBalanceUpdated(e); @@ -216,7 +224,7 @@ namespace Radegast.Netcom void Self_AlertMessage(object sender, AlertMessageEventArgs e) { - if (netcomSync != null && netcomSync.InvokeRequired) + if (CanSyncInvoke) netcomSync.BeginInvoke(new OnAlertMessageRaise(OnAlertMessageReceived), new object[] { e }); else OnAlertMessageReceived(e); @@ -368,7 +376,7 @@ namespace Radegast.Netcom set { loginOptions = value; } } - public ISynchronizeInvoke NetcomSync + public Control NetcomSync { get { return netcomSync; } set { netcomSync = value; } diff --git a/Radegast/Properties/Resources.Designer.cs b/Radegast/Properties/Resources.Designer.cs index ed56156..c7498ff 100644 --- a/Radegast/Properties/Resources.Designer.cs +++ b/Radegast/Properties/Resources.Designer.cs @@ -116,6 +116,37 @@ namespace Radegast.Properties { } } + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?> + ///<!-- $Id$ --> + ///<llsd> + /// <map> + /// <key>0bcd5f5d-a4ce-9ea4-f9e8-15132653b3d8</key> + /// <map> + /// <key>color</key> + /// <array> + /// <real>2</real> + /// <real>1</real> + /// + /// <real>1.6000000238418579</real> + /// <real>1</real> + /// </array> + /// <key>multiple</key> + /// <real>2</real> + /// <key>name</key> + /// + /// <string>MoyMix</string> + /// </map> + /// <key>0f6723d2-5b23-6b58-08ab-308112b33786</key> + /// <map> + /// <key>color</key> [rest of string was truncated]";. + /// + public static string client_signatures { + get { + return ResourceManager.GetString("client_signatures", resourceCulture); + } + } + public static System.Drawing.Bitmap computer_16 { get { object obj = ResourceManager.GetObject("computer_16", resourceCulture); diff --git a/Radegast/Properties/Resources.resx b/Radegast/Properties/Resources.resx index e2d963a..afb84fe 100644 --- a/Radegast/Properties/Resources.resx +++ b/Radegast/Properties/Resources.resx @@ -367,4 +367,7 @@ http://update.radegastclient.org/svc/get_latest + + ../Resources/client_signatures.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + \ No newline at end of file diff --git a/Radegast/Radegast.csproj b/Radegast/Radegast.csproj index f19e357..7a733e4 100644 --- a/Radegast/Radegast.csproj +++ b/Radegast/Radegast.csproj @@ -93,6 +93,7 @@ + @@ -1041,6 +1042,7 @@ + PreserveNewest diff --git a/Radegast/Resources/client_signatures.txt b/Radegast/Resources/client_signatures.txt new file mode 100644 index 0000000..b3ca73f --- /dev/null +++ b/Radegast/Resources/client_signatures.txt @@ -0,0 +1,537 @@ + + + + + 0bcd5f5d-a4ce-9ea4-f9e8-15132653b3d8 + + color + + 2 + 1 + + 1.6000000238418579 + 1 + + multiple + 2 + name + + MoyMix + + 0f6723d2-5b23-6b58-08ab-308112b33786 + + color + + 0 + + 2 + 2 + 1 + + multiple + 2 + + name + CryoLife + + 11ad2452-ce54-8d65-7c23-05589b59f516 + + color + + + 0 + 0.5 + 1 + 1 + + multiple + + 1 + name + VerticalLife + + 1c29480c-c608-df87-28bb-964fb64c5366 + + color + + + 1.6000000238418579 + 1.6000000238418579 + 0.80000001192092896 + 1 + + multiple + + 2 + name + Gemini + + 2a9a406c-f448-68f2-4e38-878f8c46c190 + + color + + + 1 + 0.89999997615814209 + 0.69999998807907104 + 1 + + multiple + + 1 + name + Meerkat + + 2c9c1e0b-e5d1-263e-16b1-7fc6d169f3d6 + + color + + + 0 + 1 + 1 + 1 + + multiple + + 1 + name + PhoxSL + + 3ab7e2fa-9572-ef36-1a30-d855dbea4f92 + + color + + + 0 + 0.5 + 1 + 1 + + multiple + + 1 + name + VerticalLife + + 4da16427-d81e-e816-f346-aaf4741b8056 + + color + + + 2 + 2 + 2 + 2 + + multiple + + 2 + name + iLife + + 4e8dcf80-336b-b1d8-ef3e-08dacf015a0f + + color + + + 0 + 0 + 2 + 1 + + multiple + + 2 + name + Sapphire + + 5262d71a-88f7-ef40-3b15-00ea148ab4b5 + + color + + + 1.6000000238418579 + 1.6000000238418579 + 0.80000001192092896 + 1 + + multiple + + 2 + name + Gemini.Bot + + 58a8b7ec-1455-7162-5d96-d3c3ead2ed71 + + color + + + 0 + 0.5 + 1 + 1 + + multiple + + 1 + name + VerticalLife + + 5aa5c70d-d787-571b-0495-4fc1bdef1500 + + color + + + 2 + 0 + 0 + 1 + + multiple + + 2 + name + LGG proxy + + 77662f23-c77a-9b4d-5558-26b757b2144c + + color + + + 0.60000002384185791 + 0.20000000298023224 + 0.80000001192092896 + 1 + + multiple + + 1 + name + PSL + + 7c4d47a3-0c51-04d1-fa47-e4f3ac12f59b + + color + + + 2 + 2 + 2 + 1 + + multiple + + 2 + name + Kung Fu + + 8183e823-c443-2142-6eb6-2ab763d4f81c + + color + + + 0 + 0 + 1 + 1 + + multiple + + 1 + name + Day Oh proxy + + 81b3e921-ee31-aa57-ff9b-ec1f28e41da1 + + color + + + 1.2000000476837158 + 1.2000000476837158 + 0.80000001192092896 + 2 + + multiple + + 2 + name + Infinity + + 841ef25b-3b90-caf9-ea3d-5649e755db65 + + color + + + 0 + 0.5 + 1 + 1 + + multiple + + 1 + name + VerticalLife + + 872c0005-3095-0967-866d-11cd71115c22 + + color + + + 0 + 1 + 2 + 3 + + multiple + + 3 + name + <-- Fag + + 9422e9d7-7b11-83e4-6262-4a8db4716a3b + + color + + + 2 + 0 + 2 + 1 + + multiple + + 2 + name + BetaLife + + 9ba526b6-f43d-6b60-42de-ce62a25ee7fb + + color + + + 1 + 1 + 1 + 1 + + multiple + + 0 + name + nolife + + adcbe893-7643-fd12-f61c-0b39717e2e32 + + color + + + 1 + 0.5 + 0.80000001192092896 + 1 + + multiple + + 1 + name + tyk3n + + b6820989-bf42-ff59-ddde-fd3fd3a74fe4 + + color + + + 1 + 0.89999997615814209 + 0.69999998807907104 + 1 + + multiple + + 1 + name + Meerkat + + c252d89d-6f7c-7d90-f430-d140d2e3fbbe + + color + + + 1 + 0 + 0 + 1 + + multiple + + 1 + name + VLife + + c5b570ca-bb7e-3c81-afd1-f62646b20014 + + color + + + 2 + 2 + 2 + 1 + + multiple + + 2 + name + Kung Fu + + ccb509cf-cc69-e569-38f1-5086c687afd1 + + color + + + 1.6000000238418579 + 0.20000000298023224 + 0.80000001192092896 + 2 + + multiple + + 2 + name + Ruby + + ccda2b3b-e72c-a112-e126-fee238b67218 + + color + + + 0 + 2 + 0 + 1 + + multiple + + 2 + name + Emerald + + d3eb4a5f-aec5-4bcb-b007-cce9efe89d37 + + color + + + 0 + 0.60000002384185791 + 0 + 2 + + multiple + + 2 + name + rivlife + + e52d21f7-3c8b-819f-a3db-65c432295dac + + color + + + 0 + 2 + 2 + 1 + + multiple + + 2 + name + CryoLife + + e734563e-1c31-2a35-3ed5-8552c807439f + + color + + + 0 + 0.5 + 1 + 1 + + multiple + + 1 + name + VerticalLife + + f3fd74a6-fee7-4b2f-93ae-ddcb5991da04 + + color + + + 0.60000002384185791 + 0.20000000298023224 + 0.80000001192092896 + 1 + + multiple + + 1 + name + PSL + + f5a48821-9a98-d09e-8d6a-50cc08ba9a47 + + color + + + 2 + 2 + 0 + 1 + + multiple + + 2 + name + NeilLife + + f5feab57-bde5-2074-97af-517290213eaa + + color + + + 0.36000001430511475 + 0.36000001430511475 + 0.36000001430511475 + 1 + + multiple + + 0 + name + Onyx + + ffce04ff-5303-4909-a044-d37af7ab0b0e + + color + + + 1 + 0.5 + 0 + 1 + + multiple + + 1 + name + Corgi + + isComplete + true + + + -- 2.11.0