Changeset 520 in Corrade


Ignore:
Timestamp:
Apr 8, 2017, 12:06:38 AM (6 months ago)
Author:
office
Message:
  • Release 9.161 - major fixes, feature additions and optimizations.
  • Issues concerning inventory operations have been addressed and the functionality has been restored (thanks chakkichakki).
  • A new command "compilescript" has been added that will make Corrade attempt to compile an user-supplied string and return any potential error message or success in case the script could be compiled successfully. This command would allow you, for instance, to couple or favorite IDE to Corrade and use Corrade as a lexer to check the supplied LSL syntax by attempting to compile the script.
  • A new command "getestateinfodata" has been added that will return requested estate info information.
  • A new command "scriptreset" has been added that will make Corrade reset scripts inside a primitive - individually, or all the scripts in the primitive by using the "all" parameter.
  • Fixed a potential annoyance with the Configurator not displaying the language selection properly (thanks Ghost).
  • Fixed an issue with dynamically re-loading the configuration file that may have corrupted state.
  • Sped up group and inventory operations by slimming down the locks further.
  • Fixed an issue with groups not being cached properly due to loose conversions between UUIDs and strings.
  • Fixed issues with Corrade not being able to properly set and unset the scripted agent status.
Files:
3 added
72 edited

Legend:

Unmodified
Added
Removed
  • Configurator/CorradeConfiguratorForm.Designer.cs

    r499 r520  
    3434            this.Tabs = new System.Windows.Forms.TabControl();
    3535            this.ClientTabPage = new System.Windows.Forms.TabPage();
     36            this.groupBox96 = new System.Windows.Forms.GroupBox();
     37            this.pictureBox109 = new System.Windows.Forms.PictureBox();
     38            this.EnableMultipleSimulators = new System.Windows.Forms.CheckBox();
    3639            this.groupBox63 = new System.Windows.Forms.GroupBox();
    3740            this.ClientLanguage = new System.Windows.Forms.ComboBox();
     
    243246            this.HordePeerSharedSecret = new System.Windows.Forms.TextBox();
    244247            this.LogsTabPage = new System.Windows.Forms.TabPage();
     248            this.groupBox95 = new System.Windows.Forms.GroupBox();
     249            this.pictureBox66 = new System.Windows.Forms.PictureBox();
     250            this.OpenMetaverseLogFile = new System.Windows.Forms.TextBox();
     251            this.OpenMetaverseLogFileEnabled = new System.Windows.Forms.CheckBox();
    245252            this.groupBox6 = new System.Windows.Forms.GroupBox();
    246253            this.pictureBox94 = new System.Windows.Forms.PictureBox();
     
    482489            this.ExperienceLevel = new System.Windows.Forms.ComboBox();
    483490            this.LoadTCPNotificationsServerCertificateFileDialog = new System.Windows.Forms.OpenFileDialog();
    484             this.groupBox95 = new System.Windows.Forms.GroupBox();
    485             this.pictureBox66 = new System.Windows.Forms.PictureBox();
    486             this.OpenMetaverseLogFile = new System.Windows.Forms.TextBox();
    487             this.OpenMetaverseLogFileEnabled = new System.Windows.Forms.CheckBox();
    488             this.groupBox96 = new System.Windows.Forms.GroupBox();
    489             this.pictureBox109 = new System.Windows.Forms.PictureBox();
    490             this.EnableMultipleSimulators = new System.Windows.Forms.CheckBox();
    491491            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
    492492            this.Tabs.SuspendLayout();
    493493            this.ClientTabPage.SuspendLayout();
     494            this.groupBox96.SuspendLayout();
     495            ((System.ComponentModel.ISupportInitialize)(this.pictureBox109)).BeginInit();
    494496            this.groupBox63.SuspendLayout();
    495497            ((System.ComponentModel.ISupportInitialize)(this.pictureBox50)).BeginInit();
     
    629631            ((System.ComponentModel.ISupportInitialize)(this.pictureBox102)).BeginInit();
    630632            this.LogsTabPage.SuspendLayout();
     633            this.groupBox95.SuspendLayout();
     634            ((System.ComponentModel.ISupportInitialize)(this.pictureBox66)).BeginInit();
    631635            this.groupBox6.SuspendLayout();
    632636            ((System.ComponentModel.ISupportInitialize)(this.pictureBox94)).BeginInit();
     
    749753            ((System.ComponentModel.ISupportInitialize)(this.pictureBox32)).BeginInit();
    750754            this.Status.SuspendLayout();
    751             this.groupBox95.SuspendLayout();
    752             ((System.ComponentModel.ISupportInitialize)(this.pictureBox66)).BeginInit();
    753             this.groupBox96.SuspendLayout();
    754             ((System.ComponentModel.ISupportInitialize)(this.pictureBox109)).BeginInit();
    755755            this.SuspendLayout();
    756756            //
     
    811811            this.ClientTabPage.Text = "Client";
    812812            this.ClientTabPage.UseVisualStyleBackColor = true;
     813            //
     814            // groupBox96
     815            //
     816            this.groupBox96.Controls.Add(this.pictureBox109);
     817            this.groupBox96.Controls.Add(this.EnableMultipleSimulators);
     818            this.groupBox96.Location = new System.Drawing.Point(12, 188);
     819            this.groupBox96.Name = "groupBox96";
     820            this.groupBox96.Size = new System.Drawing.Size(126, 58);
     821            this.groupBox96.TabIndex = 13;
     822            this.groupBox96.TabStop = false;
     823            this.groupBox96.Text = "Multiple Simulators";
     824            //
     825            // pictureBox109
     826            //
     827            this.pictureBox109.Cursor = System.Windows.Forms.Cursors.Help;
     828            this.pictureBox109.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox109.Image")));
     829            this.pictureBox109.Location = new System.Drawing.Point(95, 22);
     830            this.pictureBox109.Name = "pictureBox109";
     831            this.pictureBox109.Size = new System.Drawing.Size(20, 20);
     832            this.pictureBox109.TabIndex = 11;
     833            this.pictureBox109.TabStop = false;
     834            this.toolTip1.SetToolTip(this.pictureBox109, resources.GetString("pictureBox109.ToolTip"));
     835            //
     836            // EnableMultipleSimulators
     837            //
     838            this.EnableMultipleSimulators.AutoSize = true;
     839            this.EnableMultipleSimulators.Checked = true;
     840            this.EnableMultipleSimulators.CheckState = System.Windows.Forms.CheckState.Checked;
     841            this.EnableMultipleSimulators.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
     842            this.EnableMultipleSimulators.Location = new System.Drawing.Point(15, 24);
     843            this.EnableMultipleSimulators.Name = "EnableMultipleSimulators";
     844            this.EnableMultipleSimulators.Size = new System.Drawing.Size(68, 17);
     845            this.EnableMultipleSimulators.TabIndex = 0;
     846            this.EnableMultipleSimulators.Text = "Enabled";
     847            this.EnableMultipleSimulators.UseVisualStyleBackColor = true;
    813848            //
    814849            // groupBox63
     
    32543289            this.LogsTabPage.UseVisualStyleBackColor = true;
    32553290            //
     3291            // groupBox95
     3292            //
     3293            this.groupBox95.Controls.Add(this.pictureBox66);
     3294            this.groupBox95.Controls.Add(this.OpenMetaverseLogFile);
     3295            this.groupBox95.Controls.Add(this.OpenMetaverseLogFileEnabled);
     3296            this.groupBox95.Location = new System.Drawing.Point(7, 64);
     3297            this.groupBox95.Name = "groupBox95";
     3298            this.groupBox95.Size = new System.Drawing.Size(659, 52);
     3299            this.groupBox95.TabIndex = 5;
     3300            this.groupBox95.TabStop = false;
     3301            this.groupBox95.Text = "OpenMetaverse Log File";
     3302            //
     3303            // pictureBox66
     3304            //
     3305            this.pictureBox66.Cursor = System.Windows.Forms.Cursors.Help;
     3306            this.pictureBox66.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox66.Image")));
     3307            this.pictureBox66.Location = new System.Drawing.Point(633, 21);
     3308            this.pictureBox66.Name = "pictureBox66";
     3309            this.pictureBox66.Size = new System.Drawing.Size(20, 20);
     3310            this.pictureBox66.TabIndex = 4;
     3311            this.pictureBox66.TabStop = false;
     3312            this.toolTip1.SetToolTip(this.pictureBox66, "The path to the log file written by the OpenMetaverse\r\nlibrary that Corrade uses " +
     3313        "for the interraction with the\r\ngrid that Corrade connects to.\r\n");
     3314            //
     3315            // OpenMetaverseLogFile
     3316            //
     3317            this.OpenMetaverseLogFile.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
     3318            this.OpenMetaverseLogFile.Location = new System.Drawing.Point(6, 19);
     3319            this.OpenMetaverseLogFile.Name = "OpenMetaverseLogFile";
     3320            this.OpenMetaverseLogFile.Size = new System.Drawing.Size(553, 20);
     3321            this.OpenMetaverseLogFile.TabIndex = 1;
     3322            //
     3323            // OpenMetaverseLogFileEnabled
     3324            //
     3325            this.OpenMetaverseLogFileEnabled.AutoSize = true;
     3326            this.OpenMetaverseLogFileEnabled.Checked = true;
     3327            this.OpenMetaverseLogFileEnabled.CheckState = System.Windows.Forms.CheckState.Checked;
     3328            this.OpenMetaverseLogFileEnabled.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
     3329            this.OpenMetaverseLogFileEnabled.Location = new System.Drawing.Point(565, 22);
     3330            this.OpenMetaverseLogFileEnabled.Name = "OpenMetaverseLogFileEnabled";
     3331            this.OpenMetaverseLogFileEnabled.Size = new System.Drawing.Size(62, 17);
     3332            this.OpenMetaverseLogFileEnabled.TabIndex = 0;
     3333            this.OpenMetaverseLogFileEnabled.Text = "Enable";
     3334            this.toolTip1.SetToolTip(this.OpenMetaverseLogFileEnabled, "Whether to enable the Corrade log file.");
     3335            this.OpenMetaverseLogFileEnabled.UseVisualStyleBackColor = true;
     3336            //
    32563337            // groupBox6
    32573338            //
     
    58745955            this.LoadTCPNotificationsServerCertificateFileDialog.Filter = "Pfx Certificate (*.pfx)|*.pfx|All files (*.*)|*.*";
    58755956            //
    5876             // groupBox95
    5877             //
    5878             this.groupBox95.Controls.Add(this.pictureBox66);
    5879             this.groupBox95.Controls.Add(this.OpenMetaverseLogFile);
    5880             this.groupBox95.Controls.Add(this.OpenMetaverseLogFileEnabled);
    5881             this.groupBox95.Location = new System.Drawing.Point(7, 64);
    5882             this.groupBox95.Name = "groupBox95";
    5883             this.groupBox95.Size = new System.Drawing.Size(659, 52);
    5884             this.groupBox95.TabIndex = 5;
    5885             this.groupBox95.TabStop = false;
    5886             this.groupBox95.Text = "OpenMetaverse Log File";
    5887             //
    5888             // pictureBox66
    5889             //
    5890             this.pictureBox66.Cursor = System.Windows.Forms.Cursors.Help;
    5891             this.pictureBox66.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox66.Image")));
    5892             this.pictureBox66.Location = new System.Drawing.Point(633, 21);
    5893             this.pictureBox66.Name = "pictureBox66";
    5894             this.pictureBox66.Size = new System.Drawing.Size(20, 20);
    5895             this.pictureBox66.TabIndex = 4;
    5896             this.pictureBox66.TabStop = false;
    5897             this.toolTip1.SetToolTip(this.pictureBox66, "The path to the log file written by the OpenMetaverse\r\nlibrary that Corrade uses " +
    5898         "for the interraction with the\r\ngrid that Corrade connects to.\r\n");
    5899             //
    5900             // OpenMetaverseLogFile
    5901             //
    5902             this.OpenMetaverseLogFile.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    5903             this.OpenMetaverseLogFile.Location = new System.Drawing.Point(6, 19);
    5904             this.OpenMetaverseLogFile.Name = "OpenMetaverseLogFile";
    5905             this.OpenMetaverseLogFile.Size = new System.Drawing.Size(553, 20);
    5906             this.OpenMetaverseLogFile.TabIndex = 1;
    5907             //
    5908             // OpenMetaverseLogFileEnabled
    5909             //
    5910             this.OpenMetaverseLogFileEnabled.AutoSize = true;
    5911             this.OpenMetaverseLogFileEnabled.Checked = true;
    5912             this.OpenMetaverseLogFileEnabled.CheckState = System.Windows.Forms.CheckState.Checked;
    5913             this.OpenMetaverseLogFileEnabled.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    5914             this.OpenMetaverseLogFileEnabled.Location = new System.Drawing.Point(565, 22);
    5915             this.OpenMetaverseLogFileEnabled.Name = "OpenMetaverseLogFileEnabled";
    5916             this.OpenMetaverseLogFileEnabled.Size = new System.Drawing.Size(62, 17);
    5917             this.OpenMetaverseLogFileEnabled.TabIndex = 0;
    5918             this.OpenMetaverseLogFileEnabled.Text = "Enable";
    5919             this.toolTip1.SetToolTip(this.OpenMetaverseLogFileEnabled, "Whether to enable the Corrade log file.");
    5920             this.OpenMetaverseLogFileEnabled.UseVisualStyleBackColor = true;
    5921             //
    5922             // groupBox96
    5923             //
    5924             this.groupBox96.Controls.Add(this.pictureBox109);
    5925             this.groupBox96.Controls.Add(this.EnableMultipleSimulators);
    5926             this.groupBox96.Location = new System.Drawing.Point(12, 188);
    5927             this.groupBox96.Name = "groupBox96";
    5928             this.groupBox96.Size = new System.Drawing.Size(126, 58);
    5929             this.groupBox96.TabIndex = 13;
    5930             this.groupBox96.TabStop = false;
    5931             this.groupBox96.Text = "Multiple Simulators";
    5932             //
    5933             // pictureBox109
    5934             //
    5935             this.pictureBox109.Cursor = System.Windows.Forms.Cursors.Help;
    5936             this.pictureBox109.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox109.Image")));
    5937             this.pictureBox109.Location = new System.Drawing.Point(95, 22);
    5938             this.pictureBox109.Name = "pictureBox109";
    5939             this.pictureBox109.Size = new System.Drawing.Size(20, 20);
    5940             this.pictureBox109.TabIndex = 11;
    5941             this.pictureBox109.TabStop = false;
    5942             this.toolTip1.SetToolTip(this.pictureBox109, resources.GetString("pictureBox109.ToolTip"));
    5943             //
    5944             // EnableMultipleSimulators
    5945             //
    5946             this.EnableMultipleSimulators.AutoSize = true;
    5947             this.EnableMultipleSimulators.Checked = true;
    5948             this.EnableMultipleSimulators.CheckState = System.Windows.Forms.CheckState.Checked;
    5949             this.EnableMultipleSimulators.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    5950             this.EnableMultipleSimulators.Location = new System.Drawing.Point(15, 24);
    5951             this.EnableMultipleSimulators.Name = "EnableMultipleSimulators";
    5952             this.EnableMultipleSimulators.Size = new System.Drawing.Size(68, 17);
    5953             this.EnableMultipleSimulators.TabIndex = 0;
    5954             this.EnableMultipleSimulators.Text = "Enabled";
    5955             this.EnableMultipleSimulators.UseVisualStyleBackColor = true;
    5956             //
    59575957            // CorradeConfiguratorForm
    59585958            //
     
    59815981            this.Tabs.ResumeLayout(false);
    59825982            this.ClientTabPage.ResumeLayout(false);
     5983            this.groupBox96.ResumeLayout(false);
     5984            this.groupBox96.PerformLayout();
     5985            ((System.ComponentModel.ISupportInitialize)(this.pictureBox109)).EndInit();
    59835986            this.groupBox63.ResumeLayout(false);
    59845987            this.groupBox63.PerformLayout();
     
    61746177            ((System.ComponentModel.ISupportInitialize)(this.pictureBox102)).EndInit();
    61756178            this.LogsTabPage.ResumeLayout(false);
     6179            this.groupBox95.ResumeLayout(false);
     6180            this.groupBox95.PerformLayout();
     6181            ((System.ComponentModel.ISupportInitialize)(this.pictureBox66)).EndInit();
    61766182            this.groupBox6.ResumeLayout(false);
    61776183            this.groupBox6.PerformLayout();
     
    63376343            this.Status.ResumeLayout(false);
    63386344            this.Status.PerformLayout();
    6339             this.groupBox95.ResumeLayout(false);
    6340             this.groupBox95.PerformLayout();
    6341             ((System.ComponentModel.ISupportInitialize)(this.pictureBox66)).EndInit();
    6342             this.groupBox96.ResumeLayout(false);
    6343             this.groupBox96.PerformLayout();
    6344             ((System.ComponentModel.ISupportInitialize)(this.pictureBox109)).EndInit();
    63456345            this.ResumeLayout(false);
    63466346            this.PerformLayout();
  • Configurator/CorradeConfiguratorForm.cs

    r514 r520  
    6767            // language
    6868            mainForm.ClientLanguageAdvertise.Checked = corradeConfiguration.AdvertiseClientLanguage;
    69             var configuredLanguage = mainForm.ClientLanguage.Items.OfType<ListViewItem>().FirstOrDefault(o => string.Equals(o.Text, corradeConfiguration.ClientLanguage));
    70             switch (mainForm.ClientLanguage.Items.IndexOf(configuredLanguage))
    71             {
    72                 case -1:
    73                     var englishLanguage = mainForm.ClientLanguage.Items.OfType<ListViewItem>().FirstOrDefault(o => string.Equals(o.Text, @"en"));
    74                     mainForm.ClientLanguage.SelectedIndex = mainForm.ClientLanguage.Items.IndexOf(englishLanguage);
    75                     mainForm.ClientLanguage.SelectedItem = englishLanguage;
     69            switch (string.IsNullOrEmpty(corradeConfiguration.ClientLanguage))
     70            {
     71                case true:
     72                    mainForm.ClientLanguage.Text = @"en";
    7673                    break;
    7774
    7875                default:
    79                     mainForm.ClientLanguage.SelectedItem = configuredLanguage;
    80                     mainForm.ClientLanguage.SelectedIndex = mainForm.ClientLanguage.Items.IndexOf(configuredLanguage);
     76                    mainForm.ClientLanguage.Text = corradeConfiguration.ClientLanguage;
    8177                    break;
    8278            }
     
    9187                ? -2
    9288                : corradeConfiguration.ExitCodeAbnormal;
    93             mainForm.ClientIdentificationTag.Text = corradeConfiguration.ClientIdentificationTag;
     89            mainForm.ClientIdentificationTag.Text = corradeConfiguration.ClientIdentificationTag.ToString();
    9490
    9591            // logs
     
    460456
    461457                default:
    462                     corradeConfiguration.ClientLanguage = ((CultureInfo)((ListViewItem)mainForm.ClientLanguage.SelectedItem).Tag).TwoLetterISOLanguageName;
     458                    corradeConfiguration.ClientLanguage = mainForm.ClientLanguage.Text;
    463459                    break;
    464460            }
     
    10321028               GroupName.Text = group.Name;
    10331029               GroupPassword.Text = group.Password;
    1034                GroupUUID.Text = group.UUID;
     1030               GroupUUID.Text = group.UUID.ToString();
    10351031               GroupWorkers.Text = group.Workers.ToString();
    10361032               GroupSchedules.Text = group.Schedules.ToString();
     
    10631059                           .GetEnumValueFromName<Configuration.Notifications>(
    10641060                               (string)GroupNotifications.Items[i]))
    1065                                        /*!(group.NotificationMask &
    1066                                          (ulong)
    1067                                              Reflection.GetEnumValueFromName<Configuration.Notifications>(
    1068                                                  (string) GroupNotifications.Items[i]))
    1069                                            .Equals(0)*/)
     1061                                                   /*!(group.NotificationMask &
     1062                                                     (ulong)
     1063                                                         Reflection.GetEnumValueFromName<Configuration.Notifications>(
     1064                                                             (string) GroupNotifications.Items[i]))
     1065                                                       .Equals(0)*/)
    10701066                   {
    10711067                       case true:
     
    17241720               foreach (var language in CultureInfo.GetCultures(CultureTypes.AllCultures).Where(o => !(o.CultureTypes & CultureTypes.UserCustomCulture).Equals(CultureTypes.UserCustomCulture)))
    17251721               {
    1726                    mainForm.ClientLanguage.Items.Add(new ListViewItem { Text = language.TwoLetterISOLanguageName, Tag = language });
    1727                }
    1728                mainForm.ClientLanguage.DisplayMember = "Text";
     1722                   mainForm.ClientLanguage.Items.Add(language.TwoLetterISOLanguageName);
     1723               }
    17291724           }));
    17301725
  • Configurator/Properties/AssemblyInfo.cs

    r514 r520  
    3838// [assembly: AssemblyVersion("1.0.*")]
    3939
    40 [assembly: AssemblyVersion("1.87.*")]
     40[assembly: AssemblyVersion("1.88.*")]
  • Corrade/Corrade.cs

    r514 r520  
    164164        private static TcpListener TCPListener;
    165165
    166         private static readonly CorradeHTTPServer CorradeHTTPServer = new CorradeHTTPServer
    167         {
    168             AuthenticationSchemes = AuthenticationSchemes.Anonymous | AuthenticationSchemes.Basic
    169         };
    170 
    171         private static readonly NucleusHTTPServer NucleusHTTPServer = new NucleusHTTPServer();
     166        private static CorradeHTTPServer CorradeHTTPServer;
     167
     168        private static NucleusHTTPServer NucleusHTTPServer;
    172169
    173170        private static LoginParams Login;
     
    505502                    .ForAll(o =>
    506503                    {
    507                         lock (Locks.ClientInstanceGroupsLock)
    508                         {
    509                             var GroupBanEvent = new ManualResetEvent(false);
    510                             Client.Groups.RequestBanAction(o.Group,
    511                                 GroupBanAction.Unban, o.SoftBans.Select(p => p.Agent).ToArray(),
    512                                 (sender, args) => { GroupBanEvent.Set(); });
    513                             if (!GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    514                             {
    515                                 Feedback(
    516                                     Reflection.GetDescriptionFromEnumValue(
    517                                         Enumerations.ConsoleMessage.UNABLE_TO_LIFT_HARD_SOFT_BAN),
    518                                     Reflection.GetDescriptionFromEnumValue(
    519                                         Enumerations.ScriptError.TIMEOUT_MODIFYING_GROUP_BAN_LIST));
    520                             }
     504                        var GroupBanEvent = new ManualResetEvent(false);
     505                        Client.Groups.RequestBanAction(o.Group,
     506                            GroupBanAction.Unban, o.SoftBans.Select(p => p.Agent).ToArray(),
     507                            (sender, args) => { GroupBanEvent.Set(); });
     508                        if (!GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     509                        {
     510                            Feedback(
     511                                Reflection.GetDescriptionFromEnumValue(
     512                                    Enumerations.ConsoleMessage.UNABLE_TO_LIFT_HARD_SOFT_BAN),
     513                                Reflection.GetDescriptionFromEnumValue(
     514                                    Enumerations.ScriptError.TIMEOUT_MODIFYING_GROUP_BAN_LIST));
    521515                        }
    522516                    });
     
    10281022        {
    10291023            int itemsLoaded;
    1030             lock (Locks.ClientInstanceInventoryLock)
    1031             {
    1032                 itemsLoaded = Client.Inventory.Store.RestoreFromDisk(Path.Combine(CORRADE_CONSTANTS.CACHE_DIRECTORY,
     1024            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     1025            itemsLoaded = Client.Inventory.Store.RestoreFromDisk(Path.Combine(CORRADE_CONSTANTS.CACHE_DIRECTORY,
    10331026                    CORRADE_CONSTANTS.INVENTORY_CACHE_FILE));
    1034             }
     1027            Locks.ClientInstanceInventoryLock.ExitWriteLock();
    10351028
    10361029            Feedback(
     
    10471040                CORRADE_CONSTANTS.INVENTORY_CACHE_FILE);
    10481041            int itemsSaved;
    1049             lock (Locks.ClientInstanceInventoryLock)
    1050             {
    1051                 itemsSaved = Client.Inventory.Store.Items.Count;
    1052                 Client.Inventory.Store.SaveToDisk(path);
    1053             }
     1042            Locks.ClientInstanceInventoryLock.EnterReadLock();
     1043            itemsSaved = Client.Inventory.Store.Items.Count;
     1044            Client.Inventory.Store.SaveToDisk(path);
     1045            Locks.ClientInstanceInventoryLock.ExitReadLock();
    10541046
    10551047            Feedback(
     
    21512143            if (Environment.UserInteractive)
    21522144                return;
    2153             switch (OpenMetaverse.Utils.GetRunningPlatform())
    2154             {
    2155                 case OpenMetaverse.Utils.Platform.Windows:
     2145            switch (Utils.GetRunningPlatform())
     2146            {
     2147                case Utils.Platform.Windows:
    21562148                    try
    21572149                    {
     
    28522844                    var prefix = string.Format("http://+:{0}/", initialNucleusPort);
    28532845                    // Start Nucleus without authentication.
    2854                     NucleusHTTPServer.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
    2855                     // Disable caching.
    2856                     NucleusHTTPServer.SuggestNoCaching = true;
     2846                    NucleusHTTPServer = new NucleusHTTPServer
     2847                    {
     2848                        AuthenticationSchemes = AuthenticationSchemes.Anonymous,
     2849                        // Disable caching.
     2850                        SuggestNoCaching = true
     2851                    };
    28572852                    NucleusHTTPServer.Start(new[] { prefix });
    28582853                    ConsoleCancelEventHandler ConsoleCancelKeyPress = (sender, args) =>
     
    28602855                        try
    28612856                        {
    2862                             NucleusHTTPServer.Stop();
     2857                            NucleusHTTPServer?.Stop();
    28632858                        }
    28642859                        catch (Exception)
     
    28712866                        try
    28722867                        {
    2873                             NucleusHTTPServer.Stop();
     2868                            NucleusHTTPServer?.Stop();
    28742869                        }
    28752870                        catch (Exception)
     
    28822877                    if (Environment.UserInteractive)
    28832878                    {
    2884                         if (OpenMetaverse.Utils.GetRunningPlatform().Equals(OpenMetaverse.Utils.Runtime.Windows))
     2879                        if (Utils.GetRunningPlatform().Equals(Utils.Platform.Windows))
    28852880                        {
    28862881                            // Setup native console handler.
     
    29242919                    // Wait for the Corrade configuration to be created.
    29252920                    watchConfiguration.WaitForChanged(WatcherChangeTypes.Created);
    2926                     // Wait for all transfers to complete.
    2927                     //NucleusHTTPServer.TransfersCompletedEvent.WaitOne();
    29282921                    // Attempt to acquire an exclusive lock on the configuration file.
    29292922                    lock (ConfigurationFileLock)
     
    29602953                        consoleSpinner.Dispose();
    29612954                        Console.Clear();
    2962                         if (OpenMetaverse.Utils.GetRunningPlatform().Equals(OpenMetaverse.Utils.Runtime.Windows))
     2955                        if (Utils.GetRunningPlatform().Equals(Utils.Platform.Windows))
    29632956                        {
    29642957                            ConsoleEventHandler -= ConsoleXButton;
     
    29962989
    29972990            // Branch on platform and set-up termination handlers.
    2998             switch (OpenMetaverse.Utils.GetRunningPlatform())
    2999             {
    3000                 case OpenMetaverse.Utils.Platform.Windows:
     2991            switch (Utils.GetRunningPlatform())
     2992            {
     2993                case Utils.Platform.Windows:
    30012994                    if (Environment.UserInteractive)
    30022995                    {
     
    30703063                BasicConfigurator.Configure(rollingFileAppender);
    30713064            }
    3072             switch (OpenMetaverse.Utils.GetRunningPlatform())
    3073             {
    3074                 case OpenMetaverse.Utils.Platform.Windows: // only initialize the event logger on Windows in service mode
     3065            switch (Utils.GetRunningPlatform())
     3066            {
     3067                case Utils.Platform.Windows: // only initialize the event logger on Windows in service mode
    30753068                    if (!Environment.UserInteractive)
    30763069                    {
     
    30933086                    break;
    30943087
    3095                 case OpenMetaverse.Utils.Platform.OSX:
    3096                 case OpenMetaverse.Utils.Platform.Linux:
     3088                case Utils.Platform.OSX:
     3089                case Utils.Platform.Linux:
    30973090                    var sysLogAppender = new LocalSyslogAppender();
    30983091                    var sysLogLayout = new PatternLayout
     
    37883781
    37893782            // Close HTTP server
    3790             if (HttpListener.IsSupported && CorradeHTTPServer.IsRunning)
     3783            if (HttpListener.IsSupported && CorradeHTTPServer != null && CorradeHTTPServer.IsRunning)
    37913784            {
    37923785                Feedback(Reflection.GetDescriptionFromEnumValue(Enumerations.ConsoleMessage.STOPPING_HTTP_SERVER));
    37933786                try
    37943787                {
    3795                     CorradeHTTPServer.Stop();
     3788                    CorradeHTTPServer?.Stop();
    37963789                }
    37973790                catch (Exception ex)
     
    38033796
    38043797            // Close Nucleus server
    3805             if (HttpListener.IsSupported && NucleusHTTPServer.IsRunning)
     3798            if (HttpListener.IsSupported && NucleusHTTPServer != null && NucleusHTTPServer.IsRunning)
    38063799            {
    38073800                Feedback(Reflection.GetDescriptionFromEnumValue(Enumerations.ConsoleMessage.STOPPING_NUCLEUS_SERVER));
    38083801                try
    38093802                {
    3810                     NucleusHTTPServer.Stop();
     3803                    NucleusHTTPServer?.Stop();
    38113804                }
    38123805                catch (Exception ex)
     
    43604353
    43614354            // Accept anything from master avatars.
     4355            InventoryNode node;
    43624356            if (
    43634357                corradeConfiguration.Masters.AsParallel().Select(
     
    43704364                inventoryOffer.Args.Accept = true;
    43714365                // It is accepted, so update the inventory.
    4372                 InventoryNode node;
    43734366                // Find the node.
    4374                 lock (Locks.ClientInstanceInventoryLock)
    4375                 {
    4376                     node = Client.Inventory.Store.GetNodeFor(inventoryOffer.Args.FolderID.Equals(UUID.Zero)
     4367                Locks.ClientInstanceInventoryLock.EnterReadLock();
     4368                node = Client.Inventory.Store.GetNodeFor(inventoryOffer.Args.FolderID.Equals(UUID.Zero)
    43774369                        ? Client.Inventory.FindFolderForType(inventoryOffer.Args.AssetType)
    43784370                        : inventoryOffer.Args.FolderID);
    4379                 }
     4371                Locks.ClientInstanceInventoryLock.ExitReadLock();
    43804372                if (node != null)
    43814373                {
     
    44254417
    44264418            // It is temporary, so update the inventory.
    4427             lock (Locks.ClientInstanceInventoryLock)
    4428             {
    4429                 Client.Inventory.Store.GetNodeFor(inventoryOffer.Args.FolderID.Equals(UUID.Zero)
     4419            Locks.ClientInstanceInventoryLock.EnterReadLock();
     4420            Client.Inventory.Store.GetNodeFor(inventoryOffer.Args.FolderID.Equals(UUID.Zero)
    44304421                    ? Client.Inventory.FindFolderForType(inventoryOffer.Args.AssetType)
    44314422                    : inventoryOffer.Args.FolderID).NeedsUpdate =
    44324423                    true;
    4433             }
     4424            Locks.ClientInstanceInventoryLock.ExitReadLock();
    44344425
    44354426            // Update the inventory.
     
    44494440            // Find the item in the inventory.
    44504441            InventoryBase inventoryBaseItem = null;
    4451             lock (Locks.ClientInstanceInventoryLock)
    4452             {
    4453                 switch (e.Offer.Dialog)
    4454                 {
    4455                     case InstantMessageDialog.TaskInventoryOffered: // from objects
    4456                         var groups = CORRADE_CONSTANTS.InventoryOfferObjectNameRegEx.Match(e.Offer.Message).Groups;
    4457                         inventoryOffer.Name = groups.Count > 0 ? groups[1].Value : e.Offer.Message;
    4458                         break;
    4459 
    4460                     case InstantMessageDialog.InventoryOffered: // from agents
    4461                         if (e.Offer.BinaryBucket.Length.Equals(17))
    4462                         {
    4463                             var itemUUID = new UUID(e.Offer.BinaryBucket, 1);
    4464                             lock (Locks.ClientInstanceInventoryLock)
    4465                             {
    4466                                 if (Client.Inventory.Store.Contains(itemUUID))
    4467                                 {
    4468                                     inventoryBaseItem = Client.Inventory.Store[itemUUID];
    4469                                     // Set the name.
    4470                                     inventoryOffer.Name = inventoryBaseItem.Name;
    4471                                 }
    4472                             }
    4473                         }
    4474                         break;
    4475                 }
     4442            switch (e.Offer.Dialog)
     4443            {
     4444                case InstantMessageDialog.TaskInventoryOffered: // from objects
     4445                    var groups = CORRADE_CONSTANTS.InventoryOfferObjectNameRegEx.Match(e.Offer.Message).Groups;
     4446                    inventoryOffer.Name = groups.Count > 0 ? groups[1].Value : e.Offer.Message;
     4447                    break;
     4448
     4449                case InstantMessageDialog.InventoryOffered: // from agents
     4450                    if (e.Offer.BinaryBucket.Length.Equals(17))
     4451                    {
     4452                        var itemUUID = new UUID(e.Offer.BinaryBucket, 1);
     4453                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     4454                        if (Client.Inventory.Store.Contains(itemUUID))
     4455                        {
     4456                            inventoryBaseItem = Client.Inventory.Store[itemUUID];
     4457                            // Set the name.
     4458                            inventoryOffer.Name = inventoryBaseItem.Name;
     4459                        }
     4460                        Locks.ClientInstanceInventoryLock.ExitReadLock();
     4461                    }
     4462                    break;
    44764463            }
    44774464
     
    44804467                var parentUUID = inventoryBaseItem.ParentUUID;
    44814468                // Assume we do not want the item.
    4482                 lock (Locks.ClientInstanceInventoryLock)
    4483                 {
    4484                     Client.Inventory.Move(
    4485                         inventoryBaseItem,
    4486                         Client.Inventory.Store.Items[Client.Inventory.FindFolderForType(AssetType.TrashFolder)].Data as
    4487                             InventoryFolder);
    4488                     Client.Inventory.Store.GetNodeFor(parentUUID).NeedsUpdate = true;
    4489                     Client.Inventory.Store.GetNodeFor(Client.Inventory.FindFolderForType(AssetType.TrashFolder))
    4490                         .NeedsUpdate = true;
    4491                 }
     4469                Locks.ClientInstanceInventoryLock.EnterWriteLock();
     4470                Client.Inventory.Move(
     4471                    inventoryBaseItem,
     4472                    Client.Inventory.Store.Items[Client.Inventory.FindFolderForType(AssetType.TrashFolder)].Data as
     4473                        InventoryFolder);
     4474                Client.Inventory.Store.GetNodeFor(parentUUID).NeedsUpdate = true;
     4475                Client.Inventory.Store.GetNodeFor(Client.Inventory.FindFolderForType(AssetType.TrashFolder))
     4476                    .NeedsUpdate = true;
     4477                Locks.ClientInstanceInventoryLock.ExitWriteLock();
    44924478
    44934479                // Update the inventory.
     
    45394525            {
    45404526                case true:
    4541                     UUID rootFolderUUID;
    4542                     UUID libraryFolderUUID;
    4543                     lock (Locks.ClientInstanceInventoryLock)
    4544                     {
    4545                         rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
    4546                         libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
    4547                     }
     4527                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     4528                    UUID rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
     4529                    UUID libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
     4530                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    45484531                    if (inventoryBaseItem.UUID.Equals(rootFolderUUID))
    45494532                    {
     
    45654548            {
    45664549                case false: // if the item is to be discarded, then remove the item from inventory
     4550                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
    45674551                    switch (inventoryBaseItem is InventoryFolder)
    45684552                    {
    45694553                        case true:
    4570                             lock (Locks.ClientInstanceInventoryLock)
    4571                             {
    4572                                 Client.Inventory.RemoveFolder(inventoryBaseItem.UUID);
    4573                             }
     4554                            Client.Inventory.RemoveFolder(inventoryBaseItem.UUID);
    45744555                            break;
    45754556
    45764557                        default:
    4577                             lock (Locks.ClientInstanceInventoryLock)
    4578                             {
    4579                                 Client.Inventory.RemoveItem(inventoryBaseItem.UUID);
    4580                             }
     4558                            Client.Inventory.RemoveItem(inventoryBaseItem.UUID);
    45814559                            break;
    45824560                    }
    4583                     lock (Locks.ClientInstanceInventoryLock)
    4584                     {
    4585                         Client.Inventory.Store.GetNodeFor(sourceParentUUID).NeedsUpdate = true;
    4586                         Client.Inventory.Store.GetNodeFor(Client.Inventory.FindFolderForType(AssetType.TrashFolder))
    4587                             .NeedsUpdate = true;
    4588                     }
     4561                    Client.Inventory.Store.GetNodeFor(sourceParentUUID).NeedsUpdate = true;
     4562                    Client.Inventory.Store.GetNodeFor(Client.Inventory.FindFolderForType(AssetType.TrashFolder))
     4563                        .NeedsUpdate = true;
     4564                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    45894565
    45904566                    // Update the inventory.
     
    46124588                case true: // a destination folder was specified
    46134589                    InventoryFolder inventoryFolder = null;
    4614                     lock (Locks.ClientInstanceInventoryLock)
    4615                     {
    4616                         var node = Client.Inventory.Store.GetNodeFor(inventoryOffer.Args.FolderID);
    4617                         if (node != null)
    4618                         {
    4619                             inventoryFolder = node.Data as InventoryFolder;
    4620                         }
    4621                     }
     4590                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     4591                    node = Client.Inventory.Store.GetNodeFor(inventoryOffer.Args.FolderID);
     4592                    if (node != null)
     4593                    {
     4594                        inventoryFolder = node.Data as InventoryFolder;
     4595                    }
     4596                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    46224597                    if (inventoryFolder != null)
    46234598                    {
     
    46254600                        destinationParentUUID = inventoryFolder.ParentUUID;
    46264601
     4602                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
    46274603                        switch (inventoryBaseItem is InventoryFolder)
    46284604                        {
    46294605                            case true: // folders
    4630                                 // if a name was specified, rename the item as well.
     4606                                       // if a name was specified, rename the item as well.
     4607
    46314608                                switch (string.IsNullOrEmpty(inventoryOffer.Name))
    46324609                                {
    46334610                                    case false:
    4634                                         lock (Locks.ClientInstanceInventoryLock)
    4635                                         {
    4636                                             Client.Inventory.MoveFolder(inventoryBaseItem.UUID,
    4637                                                 inventoryFolder.UUID, inventoryOffer.Name);
    4638                                         }
     4611                                        Client.Inventory.MoveFolder(inventoryBaseItem.UUID,
     4612                                            inventoryFolder.UUID, inventoryOffer.Name);
    46394613                                        break;
    46404614
    46414615                                    default:
    4642                                         lock (Locks.ClientInstanceInventoryLock)
    4643                                         {
    4644                                             Client.Inventory.MoveFolder(inventoryBaseItem.UUID,
    4645                                                 inventoryFolder.UUID);
    4646                                         }
     4616                                        Client.Inventory.MoveFolder(inventoryBaseItem.UUID,
     4617                                            inventoryFolder.UUID);
    46474618                                        break;
    46484619                                }
     
    46534624                                {
    46544625                                    case false:
    4655                                         lock (Locks.ClientInstanceInventoryLock)
    4656                                         {
    4657                                             Client.Inventory.Move(inventoryBaseItem, inventoryFolder,
    4658                                                 inventoryOffer.Name);
    4659                                             Client.Inventory.RequestUpdateItem(inventoryBaseItem as InventoryItem);
    4660                                         }
     4626                                        Client.Inventory.Move(inventoryBaseItem, inventoryFolder,
     4627                                            inventoryOffer.Name);
     4628                                        Client.Inventory.RequestUpdateItem(inventoryBaseItem as InventoryItem);
    46614629                                        break;
    46624630
    46634631                                    default:
    4664                                         lock (Locks.ClientInstanceInventoryLock)
    4665                                         {
    4666                                             Client.Inventory.Move(inventoryBaseItem, inventoryFolder);
    4667                                         }
     4632                                        Client.Inventory.Move(inventoryBaseItem, inventoryFolder);
    46684633                                        break;
    46694634                                }
    46704635                                break;
    46714636                        }
    4672                         lock (Locks.ClientInstanceInventoryLock)
    4673                         {
    4674                             Client.Inventory.Store.GetNodeFor(sourceParentUUID).NeedsUpdate = true;
    4675                             Client.Inventory.Store.GetNodeFor(inventoryFolder.UUID).NeedsUpdate = true;
    4676                         }
     4637                        Client.Inventory.Store.GetNodeFor(sourceParentUUID).NeedsUpdate = true;
     4638                        Client.Inventory.Store.GetNodeFor(inventoryFolder.UUID).NeedsUpdate = true;
     4639                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    46774640                    }
    46784641                    break;
     
    46824645                    {
    46834646                        case true: // move inventory folders into the root
    4684                             lock (Locks.ClientInstanceInventoryLock)
     4647                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     4648                            destinationParentUUID = Client.Inventory.Store.RootFolder.UUID;
     4649                            // if a name was specified, rename the item as well.
     4650                            switch (string.IsNullOrEmpty(inventoryOffer.Name))
    46854651                            {
    4686                                 destinationParentUUID = Client.Inventory.Store.RootFolder.UUID;
    4687                                 // if a name was specified, rename the item as well.
     4652                                case false:
     4653                                    Client.Inventory.MoveFolder(
     4654                                        inventoryBaseItem.UUID, Client.Inventory.Store.RootFolder.UUID,
     4655                                        inventoryOffer.Name);
     4656                                    break;
     4657
     4658                                default:
     4659                                    Client.Inventory.MoveFolder(
     4660                                        inventoryBaseItem.UUID, Client.Inventory.Store.RootFolder.UUID);
     4661                                    break;
     4662                            }
     4663                            Client.Inventory.Store.GetNodeFor(sourceParentUUID).NeedsUpdate = true;
     4664                            Client.Inventory.Store.GetNodeFor(Client.Inventory.Store.RootFolder.UUID).NeedsUpdate =
     4665                                true;
     4666                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
     4667                            break;
     4668
     4669                        default: // move items to their respective asset folder type
     4670                            InventoryFolder destinationFolder = null;
     4671                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     4672                            node =
     4673                                Client.Inventory.Store.GetNodeFor(
     4674                                    Client.Inventory.FindFolderForType(inventoryOffer.Args.AssetType));
     4675                            Locks.ClientInstanceInventoryLock.ExitReadLock();
     4676                            if (node != null)
     4677                            {
     4678                                destinationFolder = node.Data as InventoryFolder;
     4679                            }
     4680                            if (destinationFolder != null)
     4681                            {
     4682                                destinationParentUUID = destinationFolder.ParentUUID;
     4683                                Locks.ClientInstanceInventoryLock.EnterWriteLock();
    46884684                                switch (string.IsNullOrEmpty(inventoryOffer.Name))
    46894685                                {
    46904686                                    case false:
    4691                                         Client.Inventory.MoveFolder(
    4692                                             inventoryBaseItem.UUID, Client.Inventory.Store.RootFolder.UUID,
     4687                                        Client.Inventory.Move(inventoryBaseItem, destinationFolder,
    46934688                                            inventoryOffer.Name);
     4689                                        Client.Inventory.RequestUpdateItem(inventoryBaseItem as InventoryItem);
    46944690                                        break;
    46954691
    46964692                                    default:
    4697                                         Client.Inventory.MoveFolder(
    4698                                             inventoryBaseItem.UUID, Client.Inventory.Store.RootFolder.UUID);
     4693                                        Client.Inventory.Move(inventoryBaseItem, destinationFolder);
    46994694                                        break;
    47004695                                }
    47014696                                Client.Inventory.Store.GetNodeFor(sourceParentUUID).NeedsUpdate = true;
    4702                                 Client.Inventory.Store.GetNodeFor(Client.Inventory.Store.RootFolder.UUID).NeedsUpdate =
    4703                                     true;
    4704                             }
    4705                             break;
    4706 
    4707                         default: // move items to their respective asset folder type
    4708                             lock (Locks.ClientInstanceInventoryLock)
    4709                             {
    4710                                 InventoryFolder destinationFolder = null;
    4711                                 var node =
    4712                                     Client.Inventory.Store.GetNodeFor(
    4713                                         Client.Inventory.FindFolderForType(inventoryOffer.Args.AssetType));
    4714                                 if (node != null)
    4715                                 {
    4716                                     destinationFolder = node.Data as InventoryFolder;
    4717                                 }
    4718                                 if (destinationFolder != null)
    4719                                 {
    4720                                     destinationParentUUID = destinationFolder.ParentUUID;
    4721                                     switch (string.IsNullOrEmpty(inventoryOffer.Name))
    4722                                     {
    4723                                         case false:
    4724                                             Client.Inventory.Move(inventoryBaseItem, destinationFolder,
    4725                                                 inventoryOffer.Name);
    4726                                             Client.Inventory.RequestUpdateItem(inventoryBaseItem as InventoryItem);
    4727                                             break;
    4728 
    4729                                         default:
    4730                                             Client.Inventory.Move(inventoryBaseItem, destinationFolder);
    4731                                             break;
    4732                                     }
    4733                                     Client.Inventory.Store.GetNodeFor(sourceParentUUID).NeedsUpdate = true;
    4734                                     Client.Inventory.Store.GetNodeFor(destinationFolder.UUID).NeedsUpdate = true;
    4735                                 }
     4697                                Client.Inventory.Store.GetNodeFor(destinationFolder.UUID).NeedsUpdate = true;
     4698                                Locks.ClientInstanceInventoryLock.ExitWriteLock();
    47364699                            }
    47374700                            break;
     
    49484911
    49494912                                // Get COF.
    4950                                 lock (Locks.ClientInstanceInventoryLock)
    4951                                 {
    4952                                     CurrentOutfitFolder =
     4913                                Locks.ClientInstanceInventoryLock.EnterReadLock();
     4914                                CurrentOutfitFolder =
    49534915                                        Client.Inventory.Store[
    49544916                                            Client.Inventory.FindFolderForType(AssetType.CurrentOutfitFolder)
    49554917                                            ] as
    49564918                                            InventoryFolder;
    4957                                 }
     4919                                Locks.ClientInstanceInventoryLock.ExitReadLock();
    49584920                            }
    49594921                            catch (Exception)
     
    56835645            var commandGroup = GetCorradeGroupFromMessage(args.IM.Message, corradeConfiguration);
    56845646            if (commandGroup == null || commandGroup.Equals(default(Configuration.Group)))
     5647            {
     5648                // Log commands without a valid group.
     5649                Feedback(args.IM.FromAgentID.ToString(),
     5650                    Reflection.GetDescriptionFromEnumValue(Enumerations.ConsoleMessage.UNKNOWN_GROUP));
    56855651                return;
     5652            }
    56865653
    56875654            // Otherwise process the command.
     
    66396606
    66406607                            // Don't start if the HTTP server is already started.
    6641                             if (NucleusHTTPServer.IsRunning)
     6608                            if (NucleusHTTPServer != null && NucleusHTTPServer.IsRunning)
    66426609                            {
    66436610                                try
    66446611                                {
    6645                                     NucleusHTTPServer.Stop();
     6612                                    NucleusHTTPServer?.Stop();
    66466613                                }
    66476614                                catch (Exception ex)
     
    66556622                                    Enumerations.ConsoleMessage.STARTING_NUCLEUS_SERVER),
    66566623                                corradeConfiguration.NucleusServerPrefix);
     6624                            NucleusHTTPServer = new NucleusHTTPServer();
    66576625                            try
    66586626                            {
     
    66736641
    66746642                        default:
    6675                             if (!NucleusHTTPServer.IsRunning)
     6643                            if (NucleusHTTPServer == null || !NucleusHTTPServer.IsRunning)
    66766644                                break;
    66776645                            Feedback(
     
    66806648                            try
    66816649                            {
    6682                                 NucleusHTTPServer.Stop();
     6650                                NucleusHTTPServer?.Stop();
    66836651                            }
    66846652                            catch (Exception ex)
     
    67076675                        case true:
    67086676                            // Don't start if the HTTP server is already started.
    6709                             if (CorradeHTTPServer.IsRunning)
     6677                            if (CorradeHTTPServer != null && CorradeHTTPServer.IsRunning)
    67106678                            {
    67116679                                try
    67126680                                {
    6713                                     CorradeHTTPServer.Stop();
     6681                                    CorradeHTTPServer?.Stop();
    67146682                                }
    67156683                                catch (Exception ex)
     
    67236691                                    Enumerations.ConsoleMessage.STARTING_HTTP_SERVER),
    67246692                                corradeConfiguration.HTTPServerPrefix);
     6693
     6694                            CorradeHTTPServer = new CorradeHTTPServer
     6695                            {
     6696                                AuthenticationSchemes = AuthenticationSchemes.Anonymous | AuthenticationSchemes.Basic
     6697                            };
    67256698                            try
    67266699                            {
     
    67376710
    67386711                        default:
    6739                             if (!CorradeHTTPServer.IsRunning)
     6712                            if (CorradeHTTPServer == null || !CorradeHTTPServer.IsRunning)
    67406713                                break;
    67416714                            Feedback(
     
    67446717                            try
    67456718                            {
    6746                                 CorradeHTTPServer.Stop();
     6719                                CorradeHTTPServer?.Stop();
    67476720                            }
    67486721                            catch (Exception ex)
     
    74787451                                    var GroupRoleMembersReplyEvent = new ManualResetEvent(false);
    74797452                                    var rolesMembers = new List<KeyValuePair<UUID, UUID>>();
    7480                                     var groupRolesMembersRequestUUID = UUID.Zero;
     7453                                    var requestUUID = UUID.Zero;
    74817454                                    EventHandler<GroupRolesMembersReplyEventArgs> GroupRoleMembersEventHandler =
    74827455                                        (s, args) =>
    74837456                                        {
    7484                                             if (!groupRolesMembersRequestUUID.Equals(args.RequestID))
     7457                                            if (!requestUUID.Equals(args.RequestID) || !args.GroupID.Equals(group.Key))
    74857458                                                return;
    74867459                                            rolesMembers = args.RolesMembers;
    74877460                                            GroupRoleMembersReplyEvent.Set();
    74887461                                        };
    7489                                     lock (Locks.ClientInstanceGroupsLock)
     7462                                    Client.Groups.GroupRoleMembersReply += GroupRoleMembersEventHandler;
     7463                                    requestUUID = Client.Groups.RequestGroupRolesMembers(group.Key);
     7464                                    if (
     7465                                        !GroupRoleMembersReplyEvent.WaitOne(
     7466                                            (int)corradeConfiguration.ServicesTimeout,
     7467                                            false))
    74907468                                    {
    7491                                         Client.Groups.GroupRoleMembersReply += GroupRoleMembersEventHandler;
    7492                                         groupRolesMembersRequestUUID = Client.Groups.RequestGroupRolesMembers(group.Key);
    7493                                         if (
    7494                                             !GroupRoleMembersReplyEvent.WaitOne(
    7495                                                 (int)corradeConfiguration.ServicesTimeout,
    7496                                                 false))
    7497                                         {
    7498                                             Client.Groups.GroupRoleMembersReply -= GroupRoleMembersEventHandler;
     7469                                        Client.Groups.GroupRoleMembersReply -= GroupRoleMembersEventHandler;
     7470                                        Feedback(
     7471                                            Reflection.GetDescriptionFromEnumValue(
     7472                                                Enumerations.ConsoleMessage.UNABLE_TO_APPLY_SOFT_BAN),
     7473                                            Reflection.GetDescriptionFromEnumValue(
     7474                                                Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLE_MEMBERS));
     7475                                        return;
     7476                                    }
     7477                                    Client.Groups.GroupRoleMembersReply -= GroupRoleMembersEventHandler;
     7478                                    switch (
     7479                                            !rolesMembers.AsParallel()
     7480                                                .Any(p => p.Key.Equals(targetGroup.OwnerRole) && p.Value.Equals(o)))
     7481                                    {
     7482                                        case true:
     7483                                            rolesMembers.AsParallel().Where(
     7484                                                p => p.Value.Equals(o))
     7485                                                .ForAll(
     7486                                                    p => Client.Groups.RemoveFromRole(group.Key, p.Key,
     7487                                                        o));
     7488                                            break;
     7489
     7490                                        default:
    74997491                                            Feedback(
    75007492                                                Reflection.GetDescriptionFromEnumValue(
    75017493                                                    Enumerations.ConsoleMessage.UNABLE_TO_APPLY_SOFT_BAN),
    75027494                                                Reflection.GetDescriptionFromEnumValue(
    7503                                                     Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLE_MEMBERS));
     7495                                                    Enumerations.ScriptError.CANNOT_EJECT_OWNERS));
    75047496                                            return;
    7505                                         }
    7506                                         Client.Groups.GroupRoleMembersReply -= GroupRoleMembersEventHandler;
    7507                                     }
    7508                                     lock (Locks.ClientInstanceGroupsLock)
    7509                                     {
    7510                                         switch (
    7511                                             !rolesMembers.AsParallel()
    7512                                                 .Any(p => p.Key.Equals(targetGroup.OwnerRole) && p.Value.Equals(o)))
    7513                                         {
    7514                                             case true:
    7515                                                 rolesMembers.AsParallel().Where(
    7516                                                     p => p.Value.Equals(o))
    7517                                                     .ForAll(
    7518                                                         p => Client.Groups.RemoveFromRole(group.Key, p.Key,
    7519                                                             o));
    7520                                                 break;
    7521 
    7522                                             default:
    7523                                                 Feedback(
    7524                                                     Reflection.GetDescriptionFromEnumValue(
    7525                                                         Enumerations.ConsoleMessage.UNABLE_TO_APPLY_SOFT_BAN),
    7526                                                     Reflection.GetDescriptionFromEnumValue(
    7527                                                         Enumerations.ScriptError.CANNOT_EJECT_OWNERS));
    7528                                                 return;
    7529                                         }
    75307497                                    }
    75317498
     
    75927559
    75937560                                                // Now ban the agent.
    7594                                                 lock (Locks.ClientInstanceGroupsLock)
     7561                                                var GroupBanEvent = new ManualResetEvent(false);
     7562                                                Client.Groups.RequestBanAction(group.Key,
     7563                                                    GroupBanAction.Ban, new[] { o },
     7564                                                    (s, a) => { GroupBanEvent.Set(); });
     7565                                                if (
     7566                                                    !GroupBanEvent.WaitOne(
     7567                                                        (int)corradeConfiguration.ServicesTimeout,
     7568                                                        false))
    75957569                                                {
    7596                                                     var GroupBanEvent = new ManualResetEvent(false);
    7597                                                     Client.Groups.RequestBanAction(group.Key,
    7598                                                         GroupBanAction.Ban, new[] { o },
    7599                                                         (s, a) => { GroupBanEvent.Set(); });
    7600                                                     if (
    7601                                                         !GroupBanEvent.WaitOne(
    7602                                                             (int)corradeConfiguration.ServicesTimeout,
    7603                                                             false))
    7604                                                     {
    7605                                                         Feedback(
    7606                                                             Reflection.GetDescriptionFromEnumValue(
    7607                                                                 Enumerations.ConsoleMessage.UNABLE_TO_APPLY_SOFT_BAN),
    7608                                                             Reflection.GetDescriptionFromEnumValue(
    7609                                                                 Enumerations.ScriptError
    7610                                                                     .TIMEOUT_MODIFYING_GROUP_BAN_LIST));
    7611                                                     }
     7570                                                    Feedback(
     7571                                                        Reflection.GetDescriptionFromEnumValue(
     7572                                                            Enumerations.ConsoleMessage.UNABLE_TO_APPLY_SOFT_BAN),
     7573                                                        Reflection.GetDescriptionFromEnumValue(
     7574                                                            Enumerations.ScriptError
     7575                                                                .TIMEOUT_MODIFYING_GROUP_BAN_LIST));
    76127576                                                }
    76137577                                            }
     
    76207584                                    EventHandler<GroupOperationEventArgs> GroupOperationEventHandler = (s, args) =>
    76217585                                    {
     7586                                        if (!args.GroupID.Equals(group.Key))
     7587                                            return;
    76227588                                        succeeded = args.Success;
    76237589                                        GroupEjectEvent.Set();
    76247590                                    };
    7625                                     lock (Locks.ClientInstanceGroupsLock)
     7591                                    Locks.ClientInstanceGroupsLock.EnterWriteLock();
     7592                                    Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
     7593                                    Client.Groups.EjectUser(group.Key, o);
     7594                                    if (!GroupEjectEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    76267595                                    {
    7627                                         Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
    7628                                         Client.Groups.EjectUser(group.Key, o);
    7629                                         if (!GroupEjectEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    7630                                         {
    7631                                             Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
    7632                                             Feedback(
    7633                                                 Reflection.GetDescriptionFromEnumValue(
    7634                                                     Enumerations.ConsoleMessage.UNABLE_TO_APPLY_SOFT_BAN),
    7635                                                 Reflection.GetDescriptionFromEnumValue(
    7636                                                     Enumerations.ScriptError.TIMEOUT_EJECTING_AGENT));
    7637                                             return;
    7638                                         }
    76397596                                        Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
     7597                                        Locks.ClientInstanceGroupsLock.ExitWriteLock();
     7598                                        Feedback(
     7599                                            Reflection.GetDescriptionFromEnumValue(
     7600                                                Enumerations.ConsoleMessage.UNABLE_TO_APPLY_SOFT_BAN),
     7601                                            Reflection.GetDescriptionFromEnumValue(
     7602                                                Enumerations.ScriptError.TIMEOUT_EJECTING_AGENT));
     7603                                        return;
    76407604                                    }
     7605                                    Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
     7606                                    Locks.ClientInstanceGroupsLock.ExitWriteLock();
    76417607                                    if (!succeeded)
    76427608                                    {
  • Corrade/Corrade.csproj

    r517 r520  
    224224      <SubType>Component</SubType>
    225225    </Compile>
     226    <Compile Include="commands\Corrade\CompileScript.cs">
     227      <SubType>Component</SubType>
     228    </Compile>
    226229    <Compile Include="commands\Corrade\CopyNotecardAsset.cs">
    227230      <SubType>Component</SubType>
     
    248251      <SubType>Component</SubType>
    249252    </Compile>
     253    <Compile Include="commands\Corrade\GetEstateInfoData.cs">
     254      <SubType>Component</SubType>
     255    </Compile>
    250256    <Compile Include="commands\Corrade\GetHeartbeatData.cs">
    251257      <SubType>Component</SubType>
     
    273279    </Compile>
    274280    <Compile Include="commands\Corrade\RenameItem.cs">
     281      <SubType>Component</SubType>
     282    </Compile>
     283    <Compile Include="commands\Corrade\ScriptReset.cs">
    275284      <SubType>Component</SubType>
    276285    </Compile>
  • Corrade/Properties/AssemblyInfo.cs

    r517 r520  
    4141//
    4242
    43 [assembly: AssemblyVersion("9.160.*")]
    44 [assembly: AssemblyMetadata("configuration", "1.26")]
     43[assembly: AssemblyVersion("9.161.*")]
     44[assembly: AssemblyMetadata("configuration", "1.27")]
  • Corrade/Source/Command.cs

    r517 r520  
    4747            NONE = 0,
    4848
     49            [Reflection.NameAttribute("mono")]
     50            MONO,
     51
     52            [CommandInputSyntax(
     53                "<command=scriptreset>&<group=<UUID|STRING>>&<password=<STRING>>&<item=<UUID|STRING>>&[range=<FLOAT>]&<entity=<STRING|UUID>>&[callback=<STRING>]"
     54            )]
     55            [CommandPermissionMask(
     56                (ulong)Configuration.Permissions.Inventory
     57                )]
     58            [CorradeCommand("scriptreset")]
     59            [Reflection.NameAttribute("scriptreset")]
     60            SCRIPTRESET,
     61
     62            [CommandInputSyntax(
     63                "<command=compilescript>&<group=<UUID|STRING>>&<password=<STRING>>&<data=<STRING>>&[callback=<STRING>]"
     64                )]
     65            [CommandPermissionMask(
     66                (ulong)Configuration.Permissions.Inventory
     67                )]
     68            [CorradeCommand("compilescript")]
     69            [Reflection.NameAttribute("compilescript")]
     70            COMPILESCRIPT,
     71
     72            [CommandInputSyntax(
     73                "<command=getestateinfodata>&<group=<UUID|STRING>>&<password=<STRING>>&[avatars=<UUID|STRING[,UUID|STRING...]>]&<data=<EstateUpdateInfo[,EstateUpdateInfo...]>&[callback=<STRING>]"
     74            )]
     75            [CommandPermissionMask((ulong)Configuration.Permissions.Land)]
     76            [CorradeCommand("getestateinfodata")]
     77            [Reflection.NameAttribute("getestateinfodata")]
     78            GETESTATEINFODATA,
     79
    4980            [CommandInputSyntax("<command=verify>&<group=<UUID|STRING>>&<password=<STRING>>&<server=<STRING>>&[callback=<STRING>]")]
    5081            [CommandPermissionMask((ulong)Configuration.Permissions.None)]
  • Corrade/Source/Enumerations.cs

    r517 r520  
    23132313            [Command.StatusAttribute(02021)]
    23142314            [Reflection.DescriptionAttribute("invalid version provided")]
    2315             INVALID_VERSION_PROVIDED
     2315            INVALID_VERSION_PROVIDED,
     2316
     2317            [Command.StatusAttribute(54956)]
     2318            [Reflection.DescriptionAttribute("timeout retrieving estate info")]
     2319            TIMEOUT_RETRIEVING_ESTATE_INFO,
     2320
     2321            [Command.StatusAttribute(38271)]
     2322            [Reflection.DescriptionAttribute("script compilation failed")]
     2323            SCRIPT_COMPILATION_FAILED
    23162324        }
    23172325
     
    24452453
    24462454            [Reflection.DescriptionAttribute("could not set scripted agent status")]
    2447             COULD_NOT_SET_SCRIPTED_AGENT_STATUS
     2455            COULD_NOT_SET_SCRIPTED_AGENT_STATUS,
     2456
     2457            [Reflection.DescriptionAttribute("logout failed")]
     2458            LOGOUT_FAILED,
     2459
     2460            [Reflection.DescriptionAttribute("login failed")]
     2461            LOGIN_FAILED
    24482462        }
    24492463    }
  • Corrade/Source/HTTP/CorradeHTTPServer.cs

    r514 r520  
    4242            {
    4343                // For the Windows platform, if Corrade is not run with Administrator privileges, we need to reserve an URL.
    44                 if (OpenMetaverse.Utils.GetRunningPlatform().Equals(OpenMetaverse.Utils.Runtime.Windows) &&
     44                if (Utils.GetRunningPlatform().Equals(Utils.Platform.Windows) &&
    4545                    !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
    4646                {
     
    6262            {
    6363                // For the Windows platform, if Corrade is not run with Administrator privileges, we need to reserve an URL.
    64                 if (OpenMetaverse.Utils.GetRunningPlatform().Equals(OpenMetaverse.Utils.Runtime.Windows) &&
     64                if (Utils.GetRunningPlatform().Equals(Utils.Platform.Windows) &&
    6565                    !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
    6666                {
  • Corrade/Source/HTTP/NucleusHTTPServer.cs

    r514 r520  
    3636namespace Corrade.HTTP
    3737{
    38     internal class NucleusHTTPServer : HTTPServer
     38    internal class NucleusHTTPServer : HTTPServer, IDisposable
    3939    {
    4040        public static readonly Action PurgeNucleus = () =>
     
    6363
    6464        public IEnumerable<string> Prefixes { get; private set; }
     65
     66        public new void Dispose()
     67        {
     68            Stop();
     69        }
    6570
    6671        private static Dictionary<string, CoreFile> LoadNucleus()
     
    138143            {
    139144                // For the Windows platform, if Corrade is not run with Administrator privileges, we need to reserve an URL.
    140                 if (OpenMetaverse.Utils.GetRunningPlatform().Equals(OpenMetaverse.Utils.Runtime.Windows) &&
     145                if (Utils.GetRunningPlatform().Equals(Utils.Platform.Windows) &&
    141146                    !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
    142147                {
     
    176181            {
    177182                // For the Windows platform, if Corrade is not run with Administrator privileges, we need to reserve an URL.
    178                 if (OpenMetaverse.Utils.GetRunningPlatform().Equals(OpenMetaverse.Utils.Runtime.Windows) &&
     183                if (Utils.GetRunningPlatform().Equals(Utils.Platform.Windows) &&
    179184                    !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
    180185                {
  • Corrade/Source/Structures/Agent.cs

    r511 r520  
    88
    99using System.Xml.Serialization;
     10using OpenMetaverse;
    1011using wasSharp;
    1112
     
    2526
    2627        [XmlElement(ElementName = "UUID")]
    27         public string UUID { get; set; }
     28        public UUID UUID { get; set; }
    2829
    2930        public bool Equals(Agent other)
  • Corrade/Source/WebForms/SecondLife/ScriptedAgentStatus.cs

    r514 r520  
    1919    public class ScriptedAgentStatus : IDisposable
    2020    {
    21         private static wasHTTPClient HTTPClient = new wasHTTPClient
    22             (CORRADE_CONSTANTS.USER_AGENT, new CookieContainer(), CORRADE_CONSTANTS.CONTENT_TYPE.WWW_FORM_URLENCODED,
    23                 Corrade.corradeConfiguration.ServicesTimeout);
     21        private static wasHTTPClient HTTPClient;
    2422
    2523        public ScriptedAgentStatus()
    2624        {
     25            HTTPClient = new wasHTTPClient
     26            (CORRADE_CONSTANTS.USER_AGENT, new CookieContainer(), CORRADE_CONSTANTS.CONTENT_TYPE.WWW_FORM_URLENCODED,
     27                Corrade.corradeConfiguration.ServicesTimeout);
     28            Login();
    2729        }
    2830
    2931        public void SetScriptedAgentStatus(bool scripted)
    3032        {
    31             Authenticate();
    32 
    3333            // Retrieve the agent status form.
    3434            var postData = HTTPClient.GET(
     
    6666        public bool IsScriptedAgent()
    6767        {
    68             Authenticate();
    69 
    7068            // Retrieve the agent status.
    7169            var postData = HTTPClient.GET(
     
    9391        }
    9492
    95         private void Authenticate()
     93        private void Logout()
     94        {
     95            // Logout.
     96            var postData = HTTPClient.GET(
     97                "https://secondlife.com/my/account/logout.php");
     98
     99            if (postData.Result == null)
     100                throw new ScriptedAgentStatusException(ScriptedAgentStatusError.LOGOUT_FAILED);
     101        }
     102
     103        private void Login()
    96104        {
    97105            var postData = HTTPClient.POST(
     
    110118
    111119            if (postData.Result == null)
    112                 throw new ScriptedAgentStatusException(ScriptedAgentStatusError.UNABLE_TO_AUTHENTICATE);
     120                throw new ScriptedAgentStatusException(ScriptedAgentStatusError.LOGIN_FAILED);
    113121
    114122            var doc = new HtmlDocument();
     
    118126            var openIDNodes = doc.DocumentNode.SelectNodes("//form[@id='openid_message']/input[@type='hidden']");
    119127            if (openIDNodes == null || !openIDNodes.Any())
    120                 throw new ScriptedAgentStatusException(ScriptedAgentStatusError.UNABLE_TO_AUTHENTICATE);
     128                throw new ScriptedAgentStatusException(ScriptedAgentStatusError.LOGIN_FAILED);
    121129
    122130            var openID =
     
    130138
    131139            if (!openID.Any())
    132                 throw new ScriptedAgentStatusException(ScriptedAgentStatusError.UNABLE_TO_AUTHENTICATE);
     140                throw new ScriptedAgentStatusException(ScriptedAgentStatusError.LOGIN_FAILED);
    133141
    134142            postData =
     
    137145
    138146            if (postData.Result == null)
    139                 throw new ScriptedAgentStatusException(ScriptedAgentStatusError.UNABLE_TO_AUTHENTICATE);
     147                throw new ScriptedAgentStatusException(ScriptedAgentStatusError.LOGIN_FAILED);
    140148        }
    141149
    142150        public void Dispose()
    143151        {
     152            if (HTTPClient != null)
     153            {
     154                Logout();
     155            }
    144156            HTTPClient?.Dispose();
     157            HTTPClient = null;
    145158        }
    146159    }
  • Corrade/commands/Corrade/Activate.cs

    r511 r520  
    6060                        throw new Command.ScriptException(Enumerations.ScriptError.NOT_IN_GROUP);
    6161                    }
    62                     lock (Locks.ClientInstanceGroupsLock)
    63                     {
    64                         Client.Groups.ActivateGroup(groupUUID);
    65                     }
     62                    Client.Groups.ActivateGroup(groupUUID);
    6663                };
    6764        }
  • Corrade/commands/Corrade/AddToRole.cs

    r511 r520  
    104104                            Enumerations.ScriptError.GROUP_MEMBERS_ARE_BY_DEFAULT_IN_THE_EVERYONE_ROLE);
    105105                    }
    106                     lock (Locks.ClientInstanceGroupsLock)
    107                     {
    108                         Client.Groups.AddToRole(groupUUID, roleUUID, agentUUID);
    109                     }
     106                    Client.Groups.AddToRole(groupUUID, roleUUID, agentUUID);
    110107                };
    111108        }
  • Corrade/commands/Corrade/Animation.cs

    r511 r520  
    4242                    {
    4343                        case true:
    44                             lock (Locks.ClientInstanceInventoryLock)
     44                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     45                            if (Client.Inventory.Store.Contains(itemUUID))
    4546                            {
    46                                 if (Client.Inventory.Store.Contains(itemUUID))
    47                                 {
    48                                     inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    49                                 }
     47                                inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    5048                            }
     49                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5150                            break;
    5251
  • Corrade/commands/Corrade/Attach.cs

    r511 r520  
    119119                                            {
    120120                                                case true:
    121                                                     lock (Locks.ClientInstanceInventoryLock)
    122                                                     {
    123                                                         if (Client.Inventory.Store.Contains(itemUUID))
     121                                                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     122                                                    if (Client.Inventory.Store.Contains(itemUUID))
    124123                                                        {
    125124                                                            inventoryItem =
    126125                                                                Client.Inventory.Store[itemUUID] as InventoryItem;
    127126                                                        }
    128                                                     }
     127                                                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    129128                                                    break;
    130129
  • Corrade/commands/Corrade/Ban.cs

    r511 r520  
    180180
    181181                            // ban or unban the avatars
    182                             lock (Locks.ClientInstanceGroupsLock)
    183                             {
    184                                 var GroupBanEvent = new ManualResetEvent(false);
    185                                 switch (action)
    186                                 {
    187                                     case Enumerations.Action.BAN:
    188                                         Client.Groups.RequestBanAction(groupUUID,
    189                                             GroupBanAction.Ban,
    190                                             avatars.Keys.ToArray(), (sender, args) => { GroupBanEvent.Set(); });
    191                                         break;
    192 
    193                                     case Enumerations.Action.UNBAN:
    194                                         Client.Groups.RequestBanAction(groupUUID,
    195                                             GroupBanAction.Unban,
    196                                             avatars.Keys.ToArray(), (sender, args) => { GroupBanEvent.Set(); });
    197                                         break;
    198                                 }
    199                                 if (!GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    200                                 {
    201                                     throw new Command.ScriptException(
    202                                         Enumerations.ScriptError.TIMEOUT_MODIFYING_GROUP_BAN_LIST);
    203                                 }
     182                            var GroupBanEvent = new ManualResetEvent(false);
     183                            switch (action)
     184                            {
     185                                case Enumerations.Action.BAN:
     186                                    Client.Groups.RequestBanAction(groupUUID,
     187                                        GroupBanAction.Ban,
     188                                        avatars.Keys.ToArray(), (sender, args) => { GroupBanEvent.Set(); });
     189                                    break;
     190
     191                                case Enumerations.Action.UNBAN:
     192                                    Client.Groups.RequestBanAction(groupUUID,
     193                                        GroupBanAction.Unban,
     194                                        avatars.Keys.ToArray(), (sender, args) => { GroupBanEvent.Set(); });
     195                                    break;
     196                            }
     197                            if (!GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     198                            {
     199                                throw new Command.ScriptException(
     200                                    Enumerations.ScriptError.TIMEOUT_MODIFYING_GROUP_BAN_LIST);
    204201                            }
    205202
     
    380377                                                    (sender, args) =>
    381378                                                    {
     379                                                        if (!args.GroupID.Equals(groupUUID))
     380                                                            return;
    382381                                                        succeeded = args.Success;
    383382                                                        GroupEjectEvent.Set();
    384383                                                    };
    385                                                 lock (Locks.ClientInstanceGroupsLock)
    386                                                 {
    387                                                     Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
    388                                                     Client.Groups.EjectUser(groupUUID,
    389                                                         o.Value.ID);
    390                                                     GroupEjectEvent.WaitOne(
    391                                                         (int)corradeConfiguration.ServicesTimeout,
    392                                                         false);
    393                                                     Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
    394                                                 }
     384                                                Locks.ClientInstanceGroupsLock.EnterWriteLock();
     385                                                Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
     386                                                Client.Groups.EjectUser(groupUUID,
     387                                                    o.Value.ID);
     388                                                GroupEjectEvent.WaitOne(
     389                                                    (int)corradeConfiguration.ServicesTimeout,
     390                                                    false);
     391                                                Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
     392                                                Locks.ClientInstanceGroupsLock.ExitWriteLock();
    395393                                                // If the eject was not successful, add them to the output.
    396394                                                switch (succeeded)
  • Corrade/commands/Corrade/BatchEject.cs

    r511 r520  
    200200                            }
    201201                            // Demote them.
    202                             lock (Locks.ClientInstanceGroupsLock)
    203                             {
    204                                 groupRolesMembers.AsParallel().Where(
     202                            groupRolesMembers.AsParallel().Where(
    205203                                    p => p.Value.Equals(agentUUID))
    206204                                    .ForAll(
     
    210208                                                agentUUID);
    211209                                        });
    212                             }
    213210                            // And eject them.
    214211                            var GroupEjectEvent = new ManualResetEvent(false);
     
    217214                                (sender, args) =>
    218215                                {
     216                                    if (!args.GroupID.Equals(groupUUID))
     217                                        return;
    219218                                    succeeded = args.Success;
    220219                                    GroupEjectEvent.Set();
    221220                                };
    222                             lock (Locks.ClientInstanceGroupsLock)
    223                             {
    224                                 Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
    225                                 Client.Groups.EjectUser(groupUUID, agentUUID);
    226                                 GroupEjectEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false);
    227                                 Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
    228                             }
     221                            Locks.ClientInstanceGroupsLock.EnterWriteLock();
     222                            Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
     223                            Client.Groups.EjectUser(groupUUID, agentUUID);
     224                            GroupEjectEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false);
     225                            Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
     226                            Locks.ClientInstanceGroupsLock.ExitWriteLock();
    229227                            // If the eject was not successful, add them to the output.
    230228                            switch (succeeded)
  • Corrade/commands/Corrade/BatchInvite.cs

    r511 r520  
    247247                                        }
    248248                                    }
    249                                     lock (Locks.ClientInstanceGroupsLock)
    250                                     {
    251                                         Client.Groups.Invite(groupUUID, roleUUIDs.ToList(),
    252                                             agentUUID);
    253                                     }
     249                                    Client.Groups.Invite(groupUUID, roleUUIDs.ToList(), agentUUID);
    254250                                    break;
    255251                            }
  • Corrade/commands/Corrade/BatchSetInventoryData.cs

    r511 r520  
    4343                                {
    4444                                    case true:
    45                                         lock (Locks.ClientInstanceInventoryLock)
     45                                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     46                                        if (Client.Inventory.Store.Contains(itemUUID))
    4647                                        {
    47                                             if (Client.Inventory.Store.Contains(itemUUID))
    48                                             {
    49                                                 inventoryBase = Client.Inventory.Store[itemUUID];
    50                                             }
     48                                            inventoryBase = Client.Inventory.Store[itemUUID];
    5149                                        }
     50                                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    5251                                        break;
    5352
     
    8382                                        wasInput(KeyValue.Get(wasOutput(Reflection.GetNameFromEnumValue(Command.ScriptKeys.DATA)),
    8483                                            corradeCommandParameters.Message)));
    85                                 lock (Locks.ClientInstanceInventoryLock)
    86                                 {
    87                                     Client.Inventory.RequestUpdateItem(inventoryitem);
    88                                 }
     84                                Locks.ClientInstanceInventoryLock.EnterWriteLock();
     85                                Client.Inventory.RequestUpdateItem(inventoryitem);
     86                                Locks.ClientInstanceInventoryLock.ExitWriteLock();
    8987                            });
    9088                };
  • Corrade/commands/Corrade/ChangeAppearance.cs

    r511 r520  
    4646                    {
    4747                        case true:
    48                             lock (Locks.ClientInstanceInventoryLock)
    49                             {
    50                                 if (Client.Inventory.Store.Contains(folderUUID))
     48                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     49                            if (Client.Inventory.Store.Contains(folderUUID))
    5150                                {
    5251                                    inventoryFolder = Client.Inventory.Store[folderUUID] as InventoryFolder;
    5352                                }
    54                             }
     53                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5554                            break;
    5655
     
    6968                    // Get folder contents.
    7069                    var contents = new List<InventoryBase>();
    71                     lock (Locks.ClientInstanceInventoryLock)
    72                     {
    73                         contents.AddRange(Client.Inventory.Store.GetContents(inventoryFolder));
    74                     }
     70                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     71                    contents.AddRange(Client.Inventory.Store.GetContents(inventoryFolder));
     72                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    7573                    var equipItems = new List<InventoryItem>(contents
    7674                        .AsParallel()
     
    178176                            });
    179177
    180                     lock (Locks.ClientInstanceInventoryLock)
    181                     {
    182                         // Now remove the links.
    183                         Client.Inventory.Remove(removeItems, null);
    184                     }
     178                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     179                    // Now remove the links.
     180                    Client.Inventory.Remove(removeItems, null);
     181                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    185182
    186183                    // Add links to new items.
     
    198195
    199196                    // Update inventory.
    200                     lock (Locks.ClientInstanceInventoryLock)
    201                     {
    202                         Client.Inventory.Store.GetNodeFor(CurrentOutfitFolder.UUID).NeedsUpdate = true;
    203                     }
     197                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     198                    Client.Inventory.Store.GetNodeFor(CurrentOutfitFolder.UUID).NeedsUpdate = true;
     199                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    204200
    205201                    attachments = Inventory.GetAttachments(Client,
  • Corrade/commands/Corrade/CopyNotecardAsset.cs

    r511 r520  
    5959                        {
    6060                            case true:
    61                                 lock (Locks.ClientInstanceInventoryLock)
     61                                Locks.ClientInstanceInventoryLock.EnterReadLock();
     62                                if (Client.Inventory.Store.Contains(notecardUUID))
    6263                                {
    63                                     if (Client.Inventory.Store.Contains(notecardUUID))
    64                                     {
    65                                         inventoryNotecard = Client.Inventory.Store[notecardUUID] as InventoryNotecard;
    66                                     }
     64                                    inventoryNotecard = Client.Inventory.Store[notecardUUID] as InventoryNotecard;
    6765                                }
     66                                Locks.ClientInstanceInventoryLock.ExitReadLock();
    6867                                break;
    6968
     
    9392                        {
    9493                            case true:
    95                                 lock (Locks.ClientInstanceInventoryLock)
     94                                Locks.ClientInstanceInventoryLock.EnterReadLock();
     95                                if (Client.Inventory.Store.Contains(folderUUID))
    9696                                {
    97                                     if (Client.Inventory.Store.Contains(folderUUID))
    98                                     {
    99                                         inventoryFolder = Client.Inventory.Store[folderUUID] as InventoryFolder;
    100                                     }
     97                                    inventoryFolder = Client.Inventory.Store[folderUUID] as InventoryFolder;
    10198                                }
     99                                Locks.ClientInstanceInventoryLock.ExitReadLock();
    102100                                break;
    103101
     
    115113
    116114                        var itemUUID = UUID.Zero;
    117                         lock (Locks.ClientInstanceInventoryLock)
    118                         {
    119                             Client.Inventory.RequestCopyItemFromNotecard(UUID.Zero, notecardUUID, folderUUID, assetUUID,
     115                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     116                        Client.Inventory.RequestCopyItemFromNotecard(UUID.Zero, notecardUUID, folderUUID, assetUUID,
    120117                                o =>
    121118                                {
     
    128125                                    itemUUID = o.UUID;
    129126                                });
    130                         }
     127                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    131128
    132129                        if (!itemUUID.Equals(UUID.Zero))
    133130                        {
    134131                            // Return the item and asset UUID.
    135                             result.Add(wasOutput(Reflection.GetNameFromEnumValue(Command.ScriptKeys.DATA)), itemUUID);
     132                            result.Add(wasOutput(Reflection.GetNameFromEnumValue(Command.ScriptKeys.DATA)), itemUUID.ToString());
    136133                        }
    137134                    };
  • Corrade/commands/Corrade/CreateGroup.cs

    r511 r520  
    6464                    var succeeded = false;
    6565                    var GroupCreatedReplyEvent = new ManualResetEvent(false);
     66                    var groupUUID = UUID.Zero;
    6667                    EventHandler<GroupCreatedReplyEventArgs> GroupCreatedEventHandler = (sender, args) =>
    6768                    {
     69                        groupUUID = args.GroupID;
    6870                        succeeded = args.Success;
    6971                        GroupCreatedReplyEvent.Set();
    7072                    };
    71                     lock (Locks.ClientInstanceGroupsLock)
     73                    Locks.ClientInstanceGroupsLock.EnterWriteLock();
     74                    Client.Groups.GroupCreatedReply += GroupCreatedEventHandler;
     75                    Client.Groups.RequestCreateGroup(targetGroup);
     76                    if (!GroupCreatedReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    7277                    {
    73                         Client.Groups.GroupCreatedReply += GroupCreatedEventHandler;
    74                         Client.Groups.RequestCreateGroup(targetGroup);
    75                         if (!GroupCreatedReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    76                         {
    77                             Client.Groups.GroupCreatedReply -= GroupCreatedEventHandler;
    78                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_CREATING_GROUP);
    79                         }
    8078                        Client.Groups.GroupCreatedReply -= GroupCreatedEventHandler;
     79                        Locks.ClientInstanceGroupsLock.ExitWriteLock();
     80                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_CREATING_GROUP);
    8181                    }
    82                     if (!succeeded)
     82                    Client.Groups.GroupCreatedReply -= GroupCreatedEventHandler;
     83                    Locks.ClientInstanceGroupsLock.ExitWriteLock();
     84                    string groupName = string.Empty;
     85                    if (!succeeded || !Resolvers.GroupUUIDToName(Client, groupUUID, corradeConfiguration.ServicesTimeout, ref groupName) || !groupName.Equals(target))
    8386                    {
    8487                        throw new Command.ScriptException(Enumerations.ScriptError.COULD_NOT_CREATE_GROUP);
  • Corrade/commands/Corrade/CreateNotecard.cs

    r511 r520  
    101101                    var succeeded = false;
    102102                    InventoryItem newItem = null;
    103                     lock (Locks.ClientInstanceInventoryLock)
    104                     {
    105                         Client.Inventory.RequestCreateItem(Client.Inventory.FindFolderForType(AssetType.Notecard),
     103                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     104                    Client.Inventory.RequestCreateItem(Client.Inventory.FindFolderForType(AssetType.Notecard),
    106105                            name,
    107106                            wasInput(
     
    117116                                CreateNotecardEvent.Set();
    118117                            });
    119                         if (!CreateNotecardEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    120                         {
    121                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_CREATING_ITEM);
    122                         }
     118                    if (!CreateNotecardEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     119                    {
     120                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
     121                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_CREATING_ITEM);
    123122                    }
     123                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    124124                    if (!succeeded)
    125125                    {
     
    133133                    var UploadBlankNotecardEvent = new ManualResetEvent(false);
    134134                    succeeded = false;
    135                     lock (Locks.ClientInstanceInventoryLock)
    136                     {
    137                         Client.Inventory.RequestUploadNotecardAsset(blank.AssetData, newItem.UUID,
     135                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     136                    Client.Inventory.RequestUploadNotecardAsset(blank.AssetData, newItem.UUID,
    138137                            delegate (bool completed, string status, UUID itemUUID, UUID assetUUID)
    139138                            {
     
    141140                                UploadBlankNotecardEvent.Set();
    142141                            });
    143                         if (!UploadBlankNotecardEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    144                         {
    145                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_UPLOADING_ITEM);
    146                         }
     142                    if (!UploadBlankNotecardEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     143                    {
     144                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
     145                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_UPLOADING_ITEM);
    147146                    }
     147                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    148148                    if (!succeeded)
    149149                    {
     
    161161                        var UploadNotecardDataEvent = new ManualResetEvent(false);
    162162                        succeeded = false;
    163                         lock (Locks.ClientInstanceInventoryLock)
    164                         {
    165                             Client.Inventory.RequestUploadNotecardAsset(notecard.AssetData, newItem.UUID,
     163                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     164                        Client.Inventory.RequestUploadNotecardAsset(notecard.AssetData, newItem.UUID,
    166165                                delegate (bool completed, string status, UUID itemUUID, UUID assetUUID)
    167166                                {
     
    171170                                    UploadNotecardDataEvent.Set();
    172171                                });
    173                             if (!UploadNotecardDataEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    174                             {
    175                                 throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_UPLOADING_ITEM_DATA);
    176                             }
     172                        if (!UploadNotecardDataEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     173                        {
     174                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
     175                            throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_UPLOADING_ITEM_DATA);
    177176                        }
     177                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    178178                        if (!succeeded)
    179179                        {
  • Corrade/commands/Corrade/CreateRole.cs

    r511 r520  
    7171                    var GroupRoleDataReplyEvent = new ManualResetEvent(false);
    7272                    var roleCount = 0;
     73                    var requestUUID = UUID.Zero;
    7374                    EventHandler<GroupRolesDataReplyEventArgs> GroupRolesDataEventHandler = (sender, args) =>
    7475                    {
     76                        if (!requestUUID.Equals(args.GroupID) || !args.GroupID.Equals(groupUUID))
     77                            return;
    7578                        roleCount = args.Roles.Count;
    7679                        GroupRoleDataReplyEvent.Set();
    7780                    };
    78                     lock (Locks.ClientInstanceGroupsLock)
     81                    Client.Groups.GroupRoleDataReply += GroupRolesDataEventHandler;
     82                    requestUUID = Client.Groups.RequestGroupRoles(groupUUID);
     83                    if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    7984                    {
    80                         Client.Groups.GroupRoleDataReply += GroupRolesDataEventHandler;
    81                         Client.Groups.RequestGroupRoles(groupUUID);
    82                         if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    83                         {
    84                             Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
    85                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    86                         }
    8785                        Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
     86                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    8887                    }
     88                    Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
    8989                    if (wasOpenMetaverse.Helpers.IsSecondLife(Client) &&
    9090                        roleCount >= wasOpenMetaverse.Constants.GROUPS.MAXIMUM_NUMBER_OF_ROLES)
     
    130130                        throw new Command.ScriptException(Enumerations.ScriptError.TOO_MANY_CHARACTERS_FOR_GROUP_TITLE);
    131131                    }
    132                     lock (Locks.ClientInstanceGroupsLock)
     132                    Client.Groups.CreateRole(groupUUID, new GroupRole
    133133                    {
    134                         Client.Groups.CreateRole(groupUUID, new GroupRole
    135                         {
    136                             Name = role,
    137                             Description =
     134                        Name = role,
     135                        Description =
    138136                                wasInput(
    139137                                    KeyValue.Get(
    140138                                        wasOutput(Reflection.GetNameFromEnumValue(Command.ScriptKeys.DESCRIPTION)),
    141139                                        corradeCommandParameters.Message)),
    142                             GroupID = groupUUID,
    143                             ID = UUID.Random(),
    144                             Powers = powers,
    145                             Title = title
    146                         });
    147                     }
     140                        GroupID = groupUUID,
     141                        ID = UUID.Random(),
     142                        Powers = powers,
     143                        Title = title
     144                    });
    148145                    var roleUUID = UUID.Zero;
    149146                    if (
  • Corrade/commands/Corrade/Deactivate.cs

    r511 r520  
    2626                        throw new Command.ScriptException(Enumerations.ScriptError.NO_CORRADE_PERMISSIONS);
    2727                    }
    28                     lock (Locks.ClientInstanceGroupsLock)
    29                     {
    30                         Client.Groups.ActivateGroup(UUID.Zero);
    31                     }
     28                    Client.Groups.ActivateGroup(UUID.Zero);
    3229                };
    3330        }
  • Corrade/commands/Corrade/DeleteFromRole.cs

    r511 r520  
    9797                        throw new Command.ScriptException(Enumerations.ScriptError.CANNOT_REMOVE_USER_FROM_OWNER_ROLE);
    9898                    }
    99                     lock (Locks.ClientInstanceGroupsLock)
    100                     {
    101                         Client.Groups.RemoveFromRole(corradeCommandParameters.Group.UUID, roleUUID,
     99                    Client.Groups.RemoveFromRole(corradeCommandParameters.Group.UUID, roleUUID,
    102100                            agentUUID);
    103                     }
    104101                };
    105102        }
  • Corrade/commands/Corrade/DeleteRole.cs

    r511 r520  
    103103                    }
    104104                    Client.Groups.GroupRoleMembersReply -= GroupRolesMembersEventHandler;
    105                     lock (Locks.ClientInstanceGroupsLock)
    106                     {
    107                         Client.Groups.DeleteRole(corradeCommandParameters.Group.UUID, roleUUID);
    108                     }
     105                    Client.Groups.DeleteRole(corradeCommandParameters.Group.UUID, roleUUID);
    109106                };
    110107        }
  • Corrade/commands/Corrade/Derez.cs

    r511 r520  
    5555                            {
    5656                                case true:
    57                                     lock (Locks.ClientInstanceInventoryLock)
     57                                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     58                                    if (Client.Inventory.Store.Contains(folderUUID))
    5859                                    {
    59                                         if (Client.Inventory.Store.Contains(folderUUID))
    60                                         {
    61                                             inventoryFolder = Client.Inventory.Store[folderUUID] as InventoryFolder;
    62                                         }
     60                                        inventoryFolder = Client.Inventory.Store[folderUUID] as InventoryFolder;
    6361                                    }
     62                                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    6463                                    break;
    6564
     
    7877
    7978                        default:
    80                             lock (Locks.ClientInstanceInventoryLock)
    81                             {
    82                                 inventoryFolder =
     79                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     80                            inventoryFolder =
    8381                                    Client.Inventory.Store.Items[Client.Inventory.FindFolderForType(AssetType.Object)]
    8482                                        .Data as InventoryFolder;
    85                             }
     83                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    8684                            break;
    8785                    }
     
    131129                            break;
    132130                    }
    133                     lock (Locks.ClientInstanceInventoryLock)
    134                     {
    135                         Client.Inventory.RequestDeRezToInventory(primitive.LocalID, deRezDestionationTypeInfo != null
     131                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     132                    Client.Inventory.RequestDeRezToInventory(primitive.LocalID, deRezDestionationTypeInfo != null
    136133                            ? (DeRezDestination)
    137134                                deRezDestionationTypeInfo
    138135                                    .GetValue(null)
    139136                            : DeRezDestination.AgentInventoryTake, inventoryFolder.UUID, UUID.Random());
    140                     }
     137                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    141138                };
    142139        }
  • Corrade/commands/Corrade/Detach.cs

    r511 r520  
    9393                                        if (!attachment.Equals(default(KeyValuePair<Primitive, AttachmentPoint>)))
    9494                                        {
    95                                             lock (Locks.ClientInstanceInventoryLock)
     95                                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     96                                            if (Client.Inventory.Store.Contains(attachment.Key.Properties.ItemID))
    9697                                            {
    97                                                 if (Client.Inventory.Store.Contains(attachment.Key.Properties.ItemID))
    98                                                 {
    99                                                     inventoryItem =
    100                                                         Client.Inventory.Store[attachment.Key.Properties.ItemID] as
    101                                                             InventoryItem;
    102                                                 }
     98                                                inventoryItem =
     99                                                    Client.Inventory.Store[attachment.Key.Properties.ItemID] as
     100                                                        InventoryItem;
    103101                                            }
     102                                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    104103                                        }
    105104                                    }
     
    117116                                    if (UUID.TryParse(o, out itemUUID))
    118117                                    {
    119                                         lock (Locks.ClientInstanceInventoryLock)
     118                                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     119                                        if (Client.Inventory.Store.Contains(itemUUID))
    120120                                        {
    121                                             if (Client.Inventory.Store.Contains(itemUUID))
    122                                             {
    123                                                 inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    124                                             }
     121                                            inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    125122                                        }
     123                                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    126124                                    }
    127125                                    break;
  • Corrade/commands/Corrade/Download.cs

    r514 r520  
    126126                                    if (inventoryItem == null)
    127127                                    {
    128                                         lock (Locks.ClientInstanceInventoryLock)
    129                                         {
    130                                             if (Client.Inventory.Store.Contains(itemUUID))
    131                                             {
    132                                                 inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    133                                             }
    134                                         }
     128                                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     129                                        if (Client.Inventory.Store.Contains(itemUUID))
     130                                        {
     131                                            inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
     132                                        }
     133                                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    135134                                        if (inventoryItem == null)
    136135                                        {
     
    246245                                 * Use ImageMagick on Windows and the .NET converter otherwise.
    247246                                 */
    248                                 switch (OpenMetaverse.Utils.GetRunningPlatform())
     247                                switch (Utils.GetRunningPlatform())
    249248                                {
    250                                     case OpenMetaverse.Utils.Platform.Windows:
     249                                    case Utils.Platform.Windows:
    251250                                        var magickFormat = Enum.GetValues(typeof(MagickFormat))
    252251                                            .Cast<MagickFormat>()
  • Corrade/commands/Corrade/Eject.cs

    r511 r520  
    7979                    var GroupRoleMembersReplyEvent = new ManualResetEvent(false);
    8080                    var rolesMembers = new List<KeyValuePair<UUID, UUID>>();
    81                     var groupRolesMembersRequestUUID = UUID.Zero;
     81                    var requestUUID = UUID.Zero;
    8282                    EventHandler<GroupRolesMembersReplyEventArgs> GroupRoleMembersEventHandler = (sender, args) =>
    8383                    {
    84                         if (!groupRolesMembersRequestUUID.Equals(args.RequestID)) return;
     84                        if (!requestUUID.Equals(args.RequestID) || !args.GroupID.Equals(corradeCommandParameters.Group.UUID))
     85                            return;
    8586                        rolesMembers = args.RolesMembers;
    8687                        GroupRoleMembersReplyEvent.Set();
    8788                    };
    8889                    Client.Groups.GroupRoleMembersReply += GroupRoleMembersEventHandler;
    89                     groupRolesMembersRequestUUID =
     90                    requestUUID =
    9091                        Client.Groups.RequestGroupRolesMembers(corradeCommandParameters.Group.UUID);
    9192                    if (!GroupRoleMembersReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     
    107108                        throw new Command.ScriptException(Enumerations.ScriptError.EJECT_NEEDS_DEMOTE);
    108109                    }
    109                     lock (Locks.ClientInstanceGroupsLock)
    110                     {
    111                         switch (
     110                    switch (
    112111                            !rolesMembers.AsParallel()
    113112                                .Any(o => o.Key.Equals(targetGroup.OwnerRole) && o.Value.Equals(agentUUID)))
    114                         {
    115                             case true:
    116                                 rolesMembers.AsParallel().Where(
    117                                     o => o.Value.Equals(agentUUID))
    118                                     .ForAll(
    119                                         o => Client.Groups.RemoveFromRole(corradeCommandParameters.Group.UUID, o.Key,
    120                                             agentUUID));
    121                                 break;
     113                    {
     114                        case true:
     115                            rolesMembers.AsParallel().Where(
     116                                o => o.Value.Equals(agentUUID))
     117                                .ForAll(
     118                                    o => Client.Groups.RemoveFromRole(corradeCommandParameters.Group.UUID, o.Key,
     119                                        agentUUID));
     120                            break;
    122121
    123                             default:
    124                                 throw new Command.ScriptException(Enumerations.ScriptError.CANNOT_EJECT_OWNERS);
    125                         }
     122                        default:
     123                            throw new Command.ScriptException(Enumerations.ScriptError.CANNOT_EJECT_OWNERS);
    126124                    }
    127125                    var GroupEjectEvent = new ManualResetEvent(false);
     
    129127                    EventHandler<GroupOperationEventArgs> GroupOperationEventHandler = (sender, args) =>
    130128                    {
     129                        if (!args.GroupID.Equals(corradeCommandParameters.Group.UUID))
     130                            return;
    131131                        succeeded = args.Success;
    132132                        GroupEjectEvent.Set();
    133133                    };
    134                     lock (Locks.ClientInstanceGroupsLock)
     134                    Locks.ClientInstanceGroupsLock.EnterWriteLock();
     135                    Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
     136                    Client.Groups.EjectUser(corradeCommandParameters.Group.UUID, agentUUID);
     137                    if (!GroupEjectEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    135138                    {
    136                         Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
    137                         Client.Groups.EjectUser(corradeCommandParameters.Group.UUID, agentUUID);
    138                         if (!GroupEjectEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    139                         {
    140                             Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
    141                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_EJECTING_AGENT);
    142                         }
    143139                        Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
     140                        Locks.ClientInstanceGroupsLock.ExitWriteLock();
     141                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_EJECTING_AGENT);
    144142                    }
     143                    Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
     144                    Locks.ClientInstanceGroupsLock.ExitWriteLock();
    145145                    if (!succeeded)
    146146                    {
  • Corrade/commands/Corrade/EmptyTrash.cs

    r511 r520  
    2525                        throw new Command.ScriptException(Enumerations.ScriptError.NO_CORRADE_PERMISSIONS);
    2626                    }
    27                     lock (Locks.ClientInstanceInventoryLock)
    28                     {
    29                         Client.Inventory.EmptyTrash();
    30                     }
     27                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     28                    Client.Inventory.EmptyTrash();
     29                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    3130                };
    3231        }
  • Corrade/commands/Corrade/GetGroupAccountSummaryData.cs

    r511 r520  
    7878                            (sender, args) =>
    7979                            {
     80                                if (!args.GroupID.Equals(groupUUID) ||
     81                                    !args.Summary.CurrentInterval.Equals(interval) ||
     82                                    !args.Summary.IntervalDays.Equals(days))
     83                                    return;
    8084                                summary = args.Summary;
    8185                                RequestGroupAccountSummaryEvent.Set();
    8286                            };
    83                         lock (Locks.ClientInstanceGroupsLock)
     87                        Locks.ClientInstanceGroupsLock.EnterReadLock();
     88                        Client.Groups.GroupAccountSummaryReply += RequestGroupAccountSummaryEventHandler;
     89                        Client.Groups.RequestGroupAccountSummary(groupUUID, (int)days, (int)interval);
     90                        if (
     91                            !RequestGroupAccountSummaryEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
     92                                false))
    8493                        {
    85                             Client.Groups.GroupAccountSummaryReply += RequestGroupAccountSummaryEventHandler;
    86                             Client.Groups.RequestGroupAccountSummary(groupUUID, (int)days, (int)interval);
    87                             if (
    88                                 !RequestGroupAccountSummaryEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
    89                                     false))
    90                             {
    91                                 Client.Groups.GroupAccountSummaryReply -= RequestGroupAccountSummaryEventHandler;
    92                                 throw new Command.ScriptException(
    93                                     Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ACCOUNT_SUMMARY);
    94                             }
    9594                            Client.Groups.GroupAccountSummaryReply -= RequestGroupAccountSummaryEventHandler;
     95                            Locks.ClientInstanceGroupsLock.ExitReadLock();
     96                            throw new Command.ScriptException(
     97                                Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ACCOUNT_SUMMARY);
    9698                        }
     99                        Client.Groups.GroupAccountSummaryReply -= RequestGroupAccountSummaryEventHandler;
     100                        Locks.ClientInstanceGroupsLock.ExitReadLock();
    97101                        var data =
    98102                            summary.GetStructuredData(
  • Corrade/commands/Corrade/GetInventoryData.cs

    r511 r520  
    4444                    {
    4545                        case true:
    46                             lock (Locks.ClientInstanceInventoryLock)
    47                             {
    48                                 if (Client.Inventory.Store.Contains(itemUUID))
     46                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     47                            if (Client.Inventory.Store.Contains(itemUUID))
    4948                                {
    5049                                    inventoryBase = Client.Inventory.Store[itemUUID];
    5150                                }
    52                             }
     51                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5352                            break;
    5453
  • Corrade/commands/Corrade/GetPrimitiveInventory.cs

    r511 r520  
    7777                        }
    7878                        var data = new List<string>();
    79                         lock (Locks.ClientInstanceInventoryLock)
    80                         {
    81                             data.AddRange(
     79                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     80                        data.AddRange(
    8281                                Client.Inventory.GetTaskInventory(primitive.ID, primitive.LocalID,
    8382                                    (int)corradeConfiguration.ServicesTimeout).AsParallel().Select(o => new[]
     
    8685                                        o.UUID.ToString()
    8786                                    }).SelectMany(o => o));
    88                         }
     87                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    8988                        if (data.Any())
    9089                        {
  • Corrade/commands/Corrade/GetPrimitiveInventoryData.cs

    r511 r520  
    9191                        }
    9292                        var inventory = new List<InventoryBase>();
    93                         lock (Locks.ClientInstanceInventoryLock)
    94                         {
    95                             inventory.AddRange(
     93                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     94                        inventory.AddRange(
    9695                                Client.Inventory.GetTaskInventory(primitive.ID, primitive.LocalID,
    9796                                    (int)corradeConfiguration.ServicesTimeout));
    98                         }
     97                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    9998                        var inventoryItem = !entityUUID.Equals(UUID.Zero)
    10099                            ? inventory.AsParallel().FirstOrDefault(o => o.UUID.Equals(entityUUID)) as InventoryItem
  • Corrade/commands/Corrade/GetRolePowers.cs

    r511 r520  
    7474                    var data = new HashSet<string>();
    7575                    var GroupRoleDataReplyEvent = new ManualResetEvent(false);
     76                    var requestUUID = UUID.Zero;
    7677                    EventHandler<GroupRolesDataReplyEventArgs> GroupRoleDataEventHandler = (sender, args) =>
    7778                    {
     79                        if (!requestUUID.Equals(args.RequestID) || !args.GroupID.Equals(groupUUID))
     80                            return;
     81
    7882                        var queryRole =
    7983                            args.Roles.Values.AsParallel().FirstOrDefault(o => o.ID.Equals(roleUUID));
     
    8488                        GroupRoleDataReplyEvent.Set();
    8589                    };
    86                     lock (Locks.ClientInstanceGroupsLock)
     90                    Client.Groups.GroupRoleDataReply += GroupRoleDataEventHandler;
     91                    requestUUID = Client.Groups.RequestGroupRoles(groupUUID);
     92                    if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    8793                    {
    88                         Client.Groups.GroupRoleDataReply += GroupRoleDataEventHandler;
    89                         Client.Groups.RequestGroupRoles(groupUUID);
    90                         if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    91                         {
    92                             Client.Groups.GroupRoleDataReply -= GroupRoleDataEventHandler;
    93                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_ROLE_POWERS);
    94                         }
    9594                        Client.Groups.GroupRoleDataReply -= GroupRoleDataEventHandler;
     95                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_ROLE_POWERS);
    9696                    }
     97                    Client.Groups.GroupRoleDataReply -= GroupRoleDataEventHandler;
    9798                    if (data.Any())
    9899                    {
  • Corrade/commands/Corrade/GetRoles.cs

    r511 r520  
    6262                    var GroupRoleDataReplyEvent = new ManualResetEvent(false);
    6363                    var csv = new List<string>();
     64                    var requestUUID = UUID.Zero;
    6465                    EventHandler<GroupRolesDataReplyEventArgs> GroupRolesDataEventHandler = (sender, args) =>
    6566                    {
     67                        if (!requestUUID.Equals(args.RequestID) || !args.GroupID.Equals(groupUUID))
     68                            return;
    6669                        csv.AddRange(args.Roles.AsParallel().Select(o => new[]
    6770                        {
     
    7376                        GroupRoleDataReplyEvent.Set();
    7477                    };
    75                     lock (Locks.ClientInstanceGroupsLock)
     78                    Client.Groups.GroupRoleDataReply += GroupRolesDataEventHandler;
     79                    requestUUID = Client.Groups.RequestGroupRoles(groupUUID);
     80                    if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    7681                    {
    77                         Client.Groups.GroupRoleDataReply += GroupRolesDataEventHandler;
    78                         Client.Groups.RequestGroupRoles(groupUUID);
    79                         if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    80                         {
    81                             Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
    82                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    83                         }
    8482                        Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
     83                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    8584                    }
     85                    Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
    8686                    if (csv.Any())
    8787                    {
  • Corrade/commands/Corrade/GetScriptRunning.cs

    r511 r520  
    116116                        ScriptRunningReplyEvent.Set();
    117117                    };
    118                     lock (Locks.ClientInstanceInventoryLock)
     118                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     119                    Client.Inventory.ScriptRunningReply += ScriptRunningEventHandler;
     120                    Client.Inventory.RequestGetScriptRunning(primitive.ID, inventoryItem.UUID);
     121                    if (!ScriptRunningReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    119122                    {
    120                         Client.Inventory.ScriptRunningReply += ScriptRunningEventHandler;
    121                         Client.Inventory.RequestGetScriptRunning(primitive.ID, inventoryItem.UUID);
    122                         if (!ScriptRunningReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    123                         {
    124                             Client.Inventory.ScriptRunningReply -= ScriptRunningEventHandler;
    125                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_SCRIPT_STATE);
    126                         }
    127123                        Client.Inventory.ScriptRunningReply -= ScriptRunningEventHandler;
     124                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
     125                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_SCRIPT_STATE);
    128126                    }
     127                    Client.Inventory.ScriptRunningReply -= ScriptRunningEventHandler;
     128                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    129129                    result.Add(Reflection.GetNameFromEnumValue(Command.ResultKeys.DATA), running.ToString());
    130130                };
  • Corrade/commands/Corrade/GetTitles.cs

    r511 r520  
    6363                    var groupTitles = new Dictionary<UUID, GroupTitle>();
    6464                    var GroupTitlesReplyEvent = new ManualResetEvent(false);
     65                    var requestUUID = UUID.Zero;
    6566                    EventHandler<GroupTitlesReplyEventArgs> GroupTitlesReplyEventHandler = (sender, args) =>
    6667                    {
     68                        if (!requestUUID.Equals(args.RequestID) || !args.GroupID.Equals(groupUUID))
     69                            return;
    6770                        groupTitles = args.Titles;
    6871                        GroupTitlesReplyEvent.Set();
    6972                    };
    70                     lock (Locks.ClientInstanceGroupsLock)
     73                    Client.Groups.GroupTitlesReply += GroupTitlesReplyEventHandler;
     74                    requestUUID = Client.Groups.RequestGroupTitles(groupUUID);
     75                    if (!GroupTitlesReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    7176                    {
    72                         Client.Groups.GroupTitlesReply += GroupTitlesReplyEventHandler;
    73                         Client.Groups.RequestGroupTitles(groupUUID);
    74                         if (!GroupTitlesReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    75                         {
    76                             Client.Groups.GroupTitlesReply -= GroupTitlesReplyEventHandler;
    77                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_TITLES);
    78                         }
    7977                        Client.Groups.GroupTitlesReply -= GroupTitlesReplyEventHandler;
     78                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_TITLES);
    8079                    }
     80                    Client.Groups.GroupTitlesReply -= GroupTitlesReplyEventHandler;
    8181                    var LockObject = new object();
    8282                    groupTitles.AsParallel().ForAll(o =>
  • Corrade/commands/Corrade/Give.cs

    r511 r520  
    4646                    {
    4747                        case true:
    48                             lock (Locks.ClientInstanceInventoryLock)
    49                             {
    50                                 if (Client.Inventory.Store.Contains(itemUUID))
    51                                 {
    52                                     inventoryBase = Client.Inventory.Store[itemUUID];
    53                                 }
    54                             }
     48                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     49                            if (Client.Inventory.Store.Contains(itemUUID))
     50                            {
     51                                inventoryBase = Client.Inventory.Store[itemUUID];
     52                            }
     53                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5554                            break;
    5655
     
    7069                    {
    7170                        case true:
    72                             UUID rootFolderUUID;
    73                             UUID libraryFolderUUID;
    74                             lock (Locks.ClientInstanceInventoryLock)
    75                             {
    76                                 rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
    77                                 libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
    78                             }
     71                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     72                            UUID rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
     73                            UUID libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
     74                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    7975                            if (inventoryBase.UUID.Equals(rootFolderUUID))
    8076                            {
     
    146142                            // Dequeue folder.
    147143                            currentFolder = inventoryFolders.Dequeue();
    148                             lock (Locks.ClientInstanceInventoryLock)
    149                             {
    150                                 Client.Inventory.FolderUpdated += FolderUpdatedEventHandler;
     144                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     145                            Client.Inventory.FolderUpdated += FolderUpdatedEventHandler;
    151146                                FolderUpdatedEvent.Reset();
    152                                 Client.Inventory.RequestFolderContents(currentFolder.UUID, currentFolder.OwnerID, true,
    153                                     true,
    154                                     InventorySortOrder.ByDate);
    155                                 if (!FolderUpdatedEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    156                                 {
    157                                     Client.Inventory.FolderUpdated -= FolderUpdatedEventHandler;
    158                                     throw new Command.ScriptException(
     147                            Client.Inventory.RequestFolderContents(currentFolder.UUID, currentFolder.OwnerID, true,
     148                                true,
     149                                InventorySortOrder.ByDate);
     150                            if (!FolderUpdatedEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     151                            {
     152                                Client.Inventory.FolderUpdated -= FolderUpdatedEventHandler;
     153                                Locks.ClientInstanceInventoryLock.ExitReadLock();
     154                                throw new Command.ScriptException(
    159155                                        Enumerations.ScriptError.TIMEOUT_GETTING_FOLDER_CONTENTS);
    160                                 }
    161                                 Client.Inventory.FolderUpdated -= FolderUpdatedEventHandler;
    162                             }
     156                            }
     157                            Client.Inventory.FolderUpdated -= FolderUpdatedEventHandler;
     158                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    163159                        } while (inventoryFolders.Any());
    164160
     
    211207                            if (inventoryBase is InventoryItem)
    212208                            {
    213                                 lock (Locks.ClientInstanceInventoryLock)
    214                                 {
    215                                     Client.Inventory.GiveItem(inventoryBase.UUID, inventoryBase.Name,
     209                                Locks.ClientInstanceInventoryLock.EnterWriteLock();
     210                                Client.Inventory.GiveItem(inventoryBase.UUID, inventoryBase.Name,
    216211                                        (inventoryBase as InventoryItem).AssetType, agentUUID, true);
    217                                     break;
    218                                 }
     212                                Locks.ClientInstanceInventoryLock.ExitWriteLock();
     213                                break;
    219214                            }
    220215                            if (inventoryBase is InventoryFolder)
    221216                            {
    222                                 lock (Locks.ClientInstanceInventoryLock)
    223                                 {
    224                                     Client.Inventory.GiveFolder(inventoryBase.UUID, inventoryBase.Name,
     217                                Locks.ClientInstanceInventoryLock.EnterWriteLock();
     218                                Client.Inventory.GiveFolder(inventoryBase.UUID, inventoryBase.Name,
    225219                                        AssetType.Folder, agentUUID, true);
    226                                 }
     220                                Locks.ClientInstanceInventoryLock.ExitWriteLock();
    227221                            }
    228222                            break;
     
    276270                                }
    277271                            }
    278                             lock (Locks.ClientInstanceInventoryLock)
    279                             {
    280                                 Client.Inventory.UpdateTaskInventory(primitive.LocalID, inventoryBase as InventoryItem);
    281                             }
     272                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     273                            Client.Inventory.UpdateTaskInventory(primitive.LocalID, inventoryBase as InventoryItem);
     274                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
    282275                            break;
    283276
     
    289282                    if (!parentUUID.Equals(UUID.Zero))
    290283                    {
    291                         lock (Locks.ClientInstanceInventoryLock)
    292                         {
    293                             Client.Inventory.Store.GetNodeFor(parentUUID).NeedsUpdate = true;
    294                         }
     284                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     285                        Client.Inventory.Store.GetNodeFor(parentUUID).NeedsUpdate = true;
     286                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    295287                    }
    296288                };
  • Corrade/commands/Corrade/ImportXML.cs

    r514 r520  
    225225                                                */
    226226                                                byte[] j2cBytes = null;
    227                                                 switch (OpenMetaverse.Utils.GetRunningPlatform())
    228                                                 {
    229                                                     case OpenMetaverse.Utils.Platform.Windows:
     227                                                switch (Utils.GetRunningPlatform())
     228                                                {
     229                                                    case Utils.Platform.Windows:
    230230                                                        try
    231231                                                        {
     
    295295                                                var replaceByTextureUUID = UUID.Zero;
    296296                                                var succeeded = false;
    297                                                 lock (Locks.ClientInstanceInventoryLock)
    298                                                 {
    299                                                     Client.Inventory.RequestCreateItemFromAsset(j2cBytes, fileBasename,
     297                                                Locks.ClientInstanceInventoryLock.EnterWriteLock();
     298                                                Client.Inventory.RequestCreateItemFromAsset(j2cBytes, fileBasename,
    300299                                                        string.Empty, AssetType.Texture, InventoryType.Texture,
    301300                                                        Client.Inventory.FindFolderForType(AssetType.Texture),
     
    307306                                                            CreateItemFromAssetEvent.Set();
    308307                                                        });
    309                                                     if (
    310                                                         !CreateItemFromAssetEvent.WaitOne(
    311                                                             (int)corradeConfiguration.ServicesTimeout, false))
    312                                                     {
    313                                                         scriptError = Enumerations.ScriptError.TIMEOUT_UPLOADING_ASSET;
    314                                                         s.Break();
    315                                                     }
    316                                                 }
     308                                                if (
     309                                                    !CreateItemFromAssetEvent.WaitOne(
     310                                                        (int)corradeConfiguration.ServicesTimeout, false))
     311                                                {
     312                                                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
     313                                                    scriptError = Enumerations.ScriptError.TIMEOUT_UPLOADING_ASSET;
     314                                                    s.Break();
     315                                                }
     316                                                Locks.ClientInstanceInventoryLock.ExitWriteLock();
    317317                                                if (!succeeded)
    318318                                                {
  • Corrade/commands/Corrade/Inventory.cs

    r511 r520  
    7272                                case true:
    7373                                    var dirItems = new List<DirItem>();
    74                                     lock (Locks.ClientInstanceInventoryLock)
    75                                     {
    76                                         dirItems.AddRange(Client.Inventory.Store.GetContents(
     74                                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     75                                    dirItems.AddRange(Client.Inventory.Store.GetContents(
    7776                                            item.UUID).AsParallel().Select(o =>
    7877                                                DirItem.FromInventoryBase(Client, o,
    7978                                                    corradeConfiguration.ServicesTimeout)));
    80                                     }
     79                                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    8180                                    foreach (var dirItem in dirItems.OrderByDescending(o => o.Time))
    8281                                    {
     
    254253                            {
    255254                                case true:
    256                                     lock (Locks.ClientInstanceInventoryLock)
    257                                     {
    258                                         Client.Inventory.Store.GetContents(item.UUID)
     255                                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     256                                    Client.Inventory.Store.GetContents(item.UUID)
    259257                                            .OfType<InventoryItem>()
    260258                                            .AsParallel()
     
    264262                                                Client.Inventory.RequestUpdateItem(o);
    265263                                            });
    266                                     }
     264                                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    267265                                    if (!updateFolders.Contains(item.UUID))
    268266                                    {
     
    306304                            {
    307305                                case true:
    308                                     lock (Locks.ClientInstanceInventoryLock)
    309                                     {
    310                                         Client.Inventory.MoveFolder(item.UUID,
     306                                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     307                                    Client.Inventory.MoveFolder(item.UUID,
    311308                                            Client.Inventory.FindFolderForType(AssetType.TrashFolder));
    312                                     }
     309                                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    313310                                    break;
    314311
    315312                                default:
    316                                     lock (Locks.ClientInstanceInventoryLock)
    317                                     {
    318                                         Client.Inventory.MoveItem(item.UUID,
     313                                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     314                                    Client.Inventory.MoveItem(item.UUID,
    319315                                            Client.Inventory.FindFolderForType(AssetType.TrashFolder));
    320                                     }
     316                                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    321317                                    break;
    322318                            }
     
    388384                                var targetSegments =
    389385                                    new List<string>(targetPath.PathSplit(CORRADE_CONSTANTS.PATH_SEPARATOR,
    390                                         CORRADE_CONSTANTS.PATH_SEPARATOR_ESCAPE));
     386                                        CORRADE_CONSTANTS.PATH_SEPARATOR_ESCAPE, false));
    391387
    392388                                targetItem = Inventory.FindInventory<InventoryBase>(Client,
     
    414410                                        throw new Command.ScriptException(
    415411                                            Enumerations.ScriptError.EXPECTED_ITEM_AS_SOURCE);
    416                                     lock (Locks.ClientInstanceInventoryLock)
    417                                     {
    418                                         Client.Inventory.CreateLink(targetItem.UUID, sourceItem.UUID, targetName,
     412                                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     413                                    Client.Inventory.CreateLink(targetItem.UUID, sourceItem.UUID, targetName,
    419414                                            sourceInventoryItem.Description, sourceInventoryItem.AssetType,
    420415                                            sourceInventoryItem.InventoryType, UUID.Random(), (succeeded, newItem) =>
     
    431426                                                }
    432427                                            });
    433                                     }
     428                                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    434429                                    break;
    435430
     
    438433                                    {
    439434                                        case true:
    440                                             lock (Locks.ClientInstanceInventoryLock)
    441                                             {
    442                                                 Client.Inventory.MoveFolder(sourceItem.UUID, targetItem.UUID, targetName);
     435                                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     436                                            Client.Inventory.MoveFolder(sourceItem.UUID, targetItem.UUID, targetName);
     437                                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
     438                                            break;
     439
     440                                        default:
     441                                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     442                                            Client.Inventory.MoveItem(sourceItem.UUID, targetItem.UUID, targetName);
     443                                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
     444                                            break;
     445                                    }
     446                                    var rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
     447                                    var libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
     448                                    switch (sourceItem.ParentUUID.Equals(UUID.Zero))
     449                                    {
     450                                        case true:
     451
     452                                            if (sourceItem.UUID.Equals(rootFolderUUID) &&
     453                                                !updateFolders.Contains(rootFolderUUID))
     454                                            {
     455                                                updateFolders.Add(rootFolderUUID);
     456                                                break;
     457                                            }
     458                                            if (sourceItem.UUID.Equals(libraryFolderUUID) &&
     459                                                !updateFolders.Contains(rootFolderUUID))
     460                                            {
     461                                                updateFolders.Add(libraryFolderUUID);
    443462                                            }
    444463                                            break;
    445464
    446465                                        default:
    447                                             lock (Locks.ClientInstanceInventoryLock)
    448                                             {
    449                                                 Client.Inventory.MoveItem(sourceItem.UUID, targetItem.UUID, targetName);
     466                                            if (!updateFolders.Contains(sourceItem.ParentUUID))
     467                                            {
     468                                                updateFolders.Add(sourceItem.ParentUUID);
    450469                                            }
    451470                                            break;
    452471                                    }
    453                                     lock (Locks.ClientInstanceInventoryLock)
    454                                     {
    455                                         var rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
    456                                         var libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
    457                                         switch (sourceItem.ParentUUID.Equals(UUID.Zero))
    458                                         {
    459                                             case true:
    460 
    461                                                 if (sourceItem.UUID.Equals(rootFolderUUID) &&
    462                                                     !updateFolders.Contains(rootFolderUUID))
    463                                                 {
    464                                                     updateFolders.Add(rootFolderUUID);
    465                                                     break;
    466                                                 }
    467                                                 if (sourceItem.UUID.Equals(libraryFolderUUID) &&
    468                                                     !updateFolders.Contains(rootFolderUUID))
    469                                                 {
    470                                                     updateFolders.Add(libraryFolderUUID);
    471                                                 }
     472                                    switch (targetItem.ParentUUID.Equals(UUID.Zero))
     473                                    {
     474                                        case true:
     475
     476                                            if (targetItem.UUID.Equals(rootFolderUUID) &&
     477                                                !updateFolders.Contains(rootFolderUUID))
     478                                            {
     479                                                updateFolders.Add(rootFolderUUID);
    472480                                                break;
    473 
    474                                             default:
    475                                                 if (!updateFolders.Contains(sourceItem.ParentUUID))
    476                                                 {
    477                                                     updateFolders.Add(sourceItem.ParentUUID);
    478                                                 }
    479                                                 break;
    480                                         }
    481                                         switch (targetItem.ParentUUID.Equals(UUID.Zero))
    482                                         {
    483                                             case true:
    484 
    485                                                 if (targetItem.UUID.Equals(rootFolderUUID) &&
    486                                                     !updateFolders.Contains(rootFolderUUID))
    487                                                 {
    488                                                     updateFolders.Add(rootFolderUUID);
    489                                                     break;
    490                                                 }
    491                                                 if (targetItem.UUID.Equals(libraryFolderUUID) &&
    492                                                     !updateFolders.Contains(rootFolderUUID))
    493                                                 {
    494                                                     updateFolders.Add(libraryFolderUUID);
    495                                                 }
    496                                                 break;
    497 
    498                                             default:
    499                                                 if (!updateFolders.Contains(targetItem.ParentUUID))
    500                                                 {
    501                                                     updateFolders.Add(targetItem.ParentUUID);
    502                                                 }
    503                                                 break;
    504                                         }
     481                                            }
     482                                            if (targetItem.UUID.Equals(libraryFolderUUID) &&
     483                                                !updateFolders.Contains(rootFolderUUID))
     484                                            {
     485                                                updateFolders.Add(libraryFolderUUID);
     486                                            }
     487                                            break;
     488
     489                                        default:
     490                                            if (!updateFolders.Contains(targetItem.ParentUUID))
     491                                            {
     492                                                updateFolders.Add(targetItem.ParentUUID);
     493                                            }
     494                                            break;
    505495                                    }
    506496                                    break;
    507497
    508498                                case Enumerations.Action.CP:
    509                                     lock (Locks.ClientInstanceInventoryLock)
    510                                     {
    511                                         Client.Inventory.RequestCopyItem(sourceItem.UUID, targetItem.UUID,
     499                                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     500                                    Client.Inventory.RequestCopyItem(sourceItem.UUID, targetItem.UUID,
    512501                                            targetName,
    513502                                            newItem =>
     
    524513                                                }
    525514                                            });
    526                                     }
     515                                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    527516                                    break;
    528517                            }
     
    535524                    if (updateFolders.Any())
    536525                    {
    537                         lock (Locks.ClientInstanceInventoryLock)
    538                         {
    539                             updateFolders.AsParallel()
     526                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     527                        updateFolders.AsParallel()
    540528                                .Select(o => Client.Inventory.Store.GetNodeFor(o))
    541529                                .Where(o => o != null)
    542530                                .ForAll(o => o.NeedsUpdate = true);
    543                         }
     531                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    544532                    }
    545533                    if (csv.Any())
  • Corrade/commands/Corrade/Invite.cs

    r511 r520  
    198198                            throw new Command.ScriptException(Enumerations.ScriptError.NO_GROUP_POWER_FOR_COMMAND);
    199199                    }
    200                     lock (Locks.ClientInstanceGroupsLock)
    201                     {
    202                         Client.Groups.Invite(groupUUID, roleUUIDs.ToList(), agentUUID);
    203                     }
     200                    Client.Groups.Invite(groupUUID, roleUUIDs.ToList(), agentUUID);
    204201                };
    205202        }
  • Corrade/commands/Corrade/Join.cs

    r511 r520  
    8686                    var GroupJoinedReplyEvent = new ManualResetEvent(false);
    8787                    EventHandler<GroupOperationEventArgs> GroupOperationEventHandler =
    88                         (sender, args) => GroupJoinedReplyEvent.Set();
    89                     lock (Locks.ClientInstanceGroupsLock)
     88                        (sender, args) =>
     89                        {
     90                            if (!args.GroupID.Equals(groupUUID))
     91                                return;
     92                            GroupJoinedReplyEvent.Set();
     93                        };
     94                    Locks.ClientInstanceGroupsLock.EnterWriteLock();
     95                    Client.Groups.GroupJoinedReply += GroupOperationEventHandler;
     96                    Client.Groups.RequestJoinGroup(groupUUID);
     97                    if (!GroupJoinedReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    9098                    {
    91                         Client.Groups.GroupJoinedReply += GroupOperationEventHandler;
    92                         Client.Groups.RequestJoinGroup(groupUUID);
    93                         if (!GroupJoinedReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    94                         {
    95                             Client.Groups.GroupJoinedReply -= GroupOperationEventHandler;
    96                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_JOINING_GROUP);
    97                         }
    9899                        Client.Groups.GroupJoinedReply -= GroupOperationEventHandler;
     100                        Locks.ClientInstanceGroupsLock.ExitWriteLock();
     101                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_JOINING_GROUP);
    99102                    }
     103                    Client.Groups.GroupJoinedReply -= GroupOperationEventHandler;
     104                    Locks.ClientInstanceGroupsLock.ExitWriteLock();
    100105                    currentGroups = Enumerable.Empty<UUID>();
    101106                    if (
  • Corrade/commands/Corrade/Leave.cs

    r511 r520  
    6464                    EventHandler<GroupOperationEventArgs> GroupOperationEventHandler = (sender, args) =>
    6565                    {
     66                        if (!args.GroupID.Equals(groupUUID))
     67                            return;
    6668                        succeeded = args.Success;
    6769                        GroupLeaveReplyEvent.Set();
    6870                    };
    69                     lock (Locks.ClientInstanceGroupsLock)
     71                    Locks.ClientInstanceGroupsLock.EnterWriteLock();
     72                    Client.Groups.GroupLeaveReply += GroupOperationEventHandler;
     73                    Client.Groups.LeaveGroup(groupUUID);
     74                    if (!GroupLeaveReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    7075                    {
    71                         Client.Groups.GroupLeaveReply += GroupOperationEventHandler;
    72                         Client.Groups.LeaveGroup(groupUUID);
    73                         if (!GroupLeaveReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    74                         {
    75                             Client.Groups.GroupLeaveReply -= GroupOperationEventHandler;
    76                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_LEAVING_GROUP);
    77                         }
    7876                        Client.Groups.GroupLeaveReply -= GroupOperationEventHandler;
     77                        Locks.ClientInstanceGroupsLock.ExitWriteLock();
     78                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_LEAVING_GROUP);
    7979                    }
     80                    Client.Groups.GroupLeaveReply -= GroupOperationEventHandler;
     81                    Locks.ClientInstanceGroupsLock.ExitWriteLock();
    8082                    if (!succeeded)
    8183                    {
  • Corrade/commands/Corrade/Notice.cs

    r511 r520  
    110110                                {
    111111                                    case true:
    112                                         lock (Locks.ClientInstanceInventoryLock)
     112                                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     113                                        if (Client.Inventory.Store.Contains(itemUUID))
    113114                                        {
    114                                             if (Client.Inventory.Store.Contains(itemUUID))
    115                                             {
    116                                                 inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    117                                             }
     115                                            inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    118116                                        }
     117                                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    119118                                        break;
    120119
     
    149148                                notice.AttachmentID = inventoryItem.UUID;
    150149                            }
    151                             lock (Locks.ClientInstanceGroupsLock)
    152                             {
    153                                 Client.Groups.SendGroupNotice(groupUUID, notice);
    154                             }
     150                            Client.Groups.SendGroupNotice(groupUUID, notice);
    155151                            break;
    156152
     
    161157                                (sender, args) =>
    162158                                {
     159                                    if (!args.GroupID.Equals(groupUUID))
     160                                        return;
    163161                                    groupNotices.AddRange(args.Notices.OrderBy(o => o.Timestamp));
    164162                                    GroupNoticesReplyEvent.Set();
    165163                                };
    166                             lock (Locks.ClientInstanceGroupsLock)
    167                             {
    168                                 Client.Groups.GroupNoticesListReply += GroupNoticesListEventHandler;
    169                                 Client.Groups.RequestGroupNoticesList(groupUUID);
    170                                 if (!GroupNoticesReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    171                                 {
    172                                     Client.Groups.GroupNoticesListReply -= GroupNoticesListEventHandler;
    173                                     throw new Command.ScriptException(
    174                                         Enumerations.ScriptError.TIMEOUT_RETRIEVING_GROUP_NOTICES);
    175                                 }
     164                            Locks.ClientInstanceGroupsLock.EnterReadLock();
     165                            Client.Groups.GroupNoticesListReply += GroupNoticesListEventHandler;
     166                            Client.Groups.RequestGroupNoticesList(groupUUID);
     167                            if (!GroupNoticesReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     168                            {
    176169                                Client.Groups.GroupNoticesListReply -= GroupNoticesListEventHandler;
    177                             }
     170                                Locks.ClientInstanceGroupsLock.ExitReadLock();
     171                                throw new Command.ScriptException(
     172                                    Enumerations.ScriptError.TIMEOUT_RETRIEVING_GROUP_NOTICES);
     173                            }
     174                            Client.Groups.GroupNoticesListReply -= GroupNoticesListEventHandler;
     175                            Locks.ClientInstanceGroupsLock.ExitReadLock();
    178176                            var csv = new List<string>();
    179177                            var LockObject = new object();
     
    244242                                            InstantMessageEvent.Set();
    245243                                        };
    246                                     lock (Locks.ClientInstanceGroupsLock)
    247                                     {
    248                                         Client.Self.IM += InstantMessageEventHandler;
    249                                         Client.Groups.RequestGroupNotice(groupNotice);
    250                                         if (
    251                                             !InstantMessageEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
    252                                                 false))
    253                                         {
    254                                             Client.Self.IM -= InstantMessageEventHandler;
    255                                             throw new Command.ScriptException(
    256                                                 Enumerations.ScriptError.TIMEOUT_RETRIEVING_NOTICE);
    257                                         }
     244                                    Client.Self.IM += InstantMessageEventHandler;
     245                                    Client.Groups.RequestGroupNotice(groupNotice);
     246                                    if (
     247                                        !InstantMessageEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
     248                                            false))
     249                                    {
    258250                                        Client.Self.IM -= InstantMessageEventHandler;
    259                                     }
     251                                        throw new Command.ScriptException(
     252                                            Enumerations.ScriptError.TIMEOUT_RETRIEVING_NOTICE);
     253                                    }
     254                                    Client.Self.IM -= InstantMessageEventHandler;
    260255                                    if (instantMessage.Equals(default(InstantMessage)))
    261256                                    {
  • Corrade/commands/Corrade/PlayGesture.cs

    r511 r520  
    4242                    {
    4343                        case true:
    44                             lock (Locks.ClientInstanceInventoryLock)
     44                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     45                            if (Client.Inventory.Store.Contains(itemUUID))
    4546                            {
    46                                 if (Client.Inventory.Store.Contains(itemUUID))
    47                                 {
    48                                     inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    49                                 }
     47                                inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    5048                            }
     49                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5150                            break;
    5251
  • Corrade/commands/Corrade/PrimitiveBuy.cs

    r511 r520  
    9292                    if (string.IsNullOrEmpty(folder) || !UUID.TryParse(folder, out folderUUID))
    9393                    {
    94                         lock (Locks.ClientInstanceInventoryLock)
    95                         {
    96                             folderUUID = Client.Inventory.Store.RootFolder.UUID;
    97                         }
     94                        Locks.ClientInstanceInventoryLock.EnterReadLock();
     95                        folderUUID = Client.Inventory.Store.RootFolder.UUID;
     96                        Locks.ClientInstanceInventoryLock.ExitReadLock();
    9897                    }
    9998                    Simulator simulator;
  • Corrade/commands/Corrade/RemoveItem.cs

    r511 r520  
    4343                        {
    4444                            case true:
    45                                 lock (Locks.ClientInstanceInventoryLock)
     45                                Locks.ClientInstanceInventoryLock.EnterReadLock();
     46                                if (Client.Inventory.Store.Contains(itemUUID))
    4647                                {
    47                                     if (Client.Inventory.Store.Contains(itemUUID))
    48                                     {
    49                                         inventoryBase = Client.Inventory.Store[itemUUID];
    50                                     }
     48                                    inventoryBase = Client.Inventory.Store[itemUUID];
    5149                                }
     50                                Locks.ClientInstanceInventoryLock.ExitReadLock();
    5251                                break;
    5352
     
    6766                        {
    6867                            case true:
    69                                 UUID rootFolderUUID;
    70                                 UUID libraryFolderUUID;
    71                                 lock (Locks.ClientInstanceInventoryLock)
    72                                 {
    73                                     rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
    74                                     libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
    75                                 }
     68                                Locks.ClientInstanceInventoryLock.EnterReadLock();
     69                                UUID rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
     70                                UUID libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
     71                                Locks.ClientInstanceInventoryLock.ExitReadLock();
    7672                                if (inventoryBase.UUID.Equals(rootFolderUUID))
    7773                                {
     
    9389                        {
    9490                            case true:
    95                                 lock (Locks.ClientInstanceInventoryLock)
    96                                 {
    97                                     Client.Inventory.RemoveFolder(inventoryBase.UUID);
    98                                 }
     91                                Locks.ClientInstanceInventoryLock.EnterWriteLock();
     92                                Client.Inventory.RemoveFolder(inventoryBase.UUID);
     93                                Locks.ClientInstanceInventoryLock.ExitWriteLock();
    9994                                break;
    10095
    10196                            default:
    102                                 lock (Locks.ClientInstanceInventoryLock)
    103                                 {
    104                                     Client.Inventory.RemoveItem(inventoryBase.UUID);
    105                                 }
     97                                Locks.ClientInstanceInventoryLock.EnterWriteLock();
     98                                Client.Inventory.RemoveItem(inventoryBase.UUID);
     99                                Locks.ClientInstanceInventoryLock.ExitWriteLock();
    106100                                break;
    107101                        }
    108102                        // Mark the parent as needing an update.
    109                         lock (Locks.ClientInstanceInventoryLock)
    110                         {
    111                             Client.Inventory.Store.GetNodeFor(parentUUID).NeedsUpdate = true;
    112                         }
     103                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     104                        Client.Inventory.Store.GetNodeFor(parentUUID).NeedsUpdate = true;
     105                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    113106                    };
    114107        }
  • Corrade/commands/Corrade/RenameItem.cs

    r511 r520  
    4242                    {
    4343                        case true:
    44                             lock (Locks.ClientInstanceInventoryLock)
     44                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     45                            if (Client.Inventory.Store.Contains(itemUUID))
    4546                            {
    46                                 if (Client.Inventory.Store.Contains(itemUUID))
    47                                 {
    48                                     inventoryBase = Client.Inventory.Store[itemUUID];
    49                                 }
     47                                inventoryBase = Client.Inventory.Store[itemUUID];
    5048                            }
     49                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5150                            break;
    5251
     
    7170                    {
    7271                        case true:
    73                             lock (Locks.ClientInstanceInventoryLock)
    74                             {
    75                                 Client.Inventory.MoveFolder(inventoryBase.UUID, inventoryBase.ParentUUID, name);
    76                             }
     72                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     73                            Client.Inventory.MoveFolder(inventoryBase.UUID, inventoryBase.ParentUUID, name);
     74                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
    7775                            break;
    7876
    7977                        default:
    80                             lock (Locks.ClientInstanceInventoryLock)
    81                             {
    82                                 Client.Inventory.MoveItem(inventoryBase.UUID, inventoryBase.ParentUUID, name);
    83                             }
     78                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     79                            Client.Inventory.MoveItem(inventoryBase.UUID, inventoryBase.ParentUUID, name);
     80                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
    8481                            break;
    8582                    }
  • Corrade/commands/Corrade/ReplyToInventoryOffer.cs

    r511 r520  
    5555                                    {
    5656                                        case true:
    57                                             lock (Locks.ClientInstanceInventoryLock)
    58                                             {
    59                                                 if (Client.Inventory.Store.Contains(folderUUID))
     57                                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     58                                            if (Client.Inventory.Store.Contains(folderUUID))
    6059                                                {
    6160                                                    inventoryFolder =
    6261                                                        Client.Inventory.Store[folderUUID] as InventoryFolder;
    6362                                                }
    64                                             }
     63                                            Locks.ClientInstanceInventoryLock.EnterReadLock();
    6564                                            break;
    6665
     
    132131                                {
    133132                                    case InstantMessageDialog.InventoryOffered:
    134                                         lock (Locks.ClientInstanceInventoryLock)
    135                                         {
    136                                             Client.Self.InstantMessage(Client.Self.Name,
     133                                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     134                                        Client.Self.InstantMessage(Client.Self.Name,
    137135                                                inventoryOffer.Args.Offer.FromAgentID,
    138136                                                string.Empty, inventoryOffer.Args.Offer.IMSessionID,
     
    143141                                                inventoryOffer.Args.FolderID.GetBytes()
    144142                                                );
    145                                         }
     143                                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
    146144                                        break;
    147145
    148146                                    case InstantMessageDialog.TaskInventoryOffered:
    149                                         lock (Locks.ClientInstanceInventoryLock)
    150                                         {
    151                                             Client.Self.InstantMessage(Client.Self.Name,
     147                                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     148                                        Client.Self.InstantMessage(Client.Self.Name,
    152149                                                inventoryOffer.Args.Offer.FromAgentID,
    153150                                                string.Empty, inventoryOffer.Args.Offer.IMSessionID,
     
    158155                                                inventoryOffer.Args.FolderID.GetBytes()
    159156                                                );
    160                                         }
     157                                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    161158                                        break;
    162159                                }
     
    174171                                {
    175172                                    case InstantMessageDialog.InventoryOffered:
    176                                         lock (Locks.ClientInstanceInventoryLock)
    177                                         {
    178                                             Client.Self.InstantMessage(Client.Self.Name,
     173                                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     174                                        Client.Self.InstantMessage(Client.Self.Name,
    179175                                                inventoryOffer.Args.Offer.FromAgentID,
    180176                                                string.Empty, inventoryOffer.Args.Offer.IMSessionID,
     
    185181                                                Utils.EmptyBytes
    186182                                                );
    187                                         }
     183                                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    188184                                        break;
    189185
    190186                                    case InstantMessageDialog.TaskInventoryOffered:
    191                                         lock (Locks.ClientInstanceInventoryLock)
    192                                         {
    193                                             Client.Self.InstantMessage(Client.Self.Name,
     187                                        Locks.ClientInstanceInventoryLock.EnterWriteLock();
     188                                        Client.Self.InstantMessage(Client.Self.Name,
    194189                                                inventoryOffer.Args.Offer.FromAgentID,
    195190                                                string.Empty, inventoryOffer.Args.Offer.IMSessionID,
     
    200195                                                Utils.EmptyBytes
    201196                                                );
    202                                         }
     197                                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
    203198                                        break;
    204199                                }
  • Corrade/commands/Corrade/Rez.cs

    r511 r520  
    4444                    {
    4545                        case true:
    46                             lock (Locks.ClientInstanceInventoryLock)
     46                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     47                            if (Client.Inventory.Store.Contains(itemUUID))
    4748                            {
    48                                 if (Client.Inventory.Store.Contains(itemUUID))
    49                                 {
    50                                     inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    51                                 }
     49                                inventoryItem = Client.Inventory.Store[itemUUID] as InventoryItem;
    5250                            }
     51                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5352                            break;
    5453
     
    141140                        }
    142141                    }
    143                     lock (Locks.ClientInstanceInventoryLock)
    144                     {
    145                         Client.Inventory.RequestRezFromInventory(simulator, rotation, position, inventoryItem,
     142                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     143                    Client.Inventory.RequestRezFromInventory(simulator, rotation, position, inventoryItem,
    146144                            corradeCommandParameters.Group.UUID);
    147                     }
     145                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    148146                };
    149147        }
  • Corrade/commands/Corrade/SetGroupData.cs

    r511 r520  
    128128                    }
    129129                    targetGroup = targetGroup.wasCSVToStructure(data);
    130                     lock (Locks.ClientInstanceGroupsLock)
    131                     {
    132                         Client.Groups.SetGroupAcceptNotices(groupUUID,
     130                    Client.Groups.SetGroupAcceptNotices(groupUUID,
    133131                            targetGroup.AcceptNotices,
    134132                            targetGroup.ListInProfile);
    135                         Client.Groups.UpdateGroup(groupUUID, targetGroup);
    136                     }
     133                    Client.Groups.UpdateGroup(groupUUID, targetGroup);
    137134                };
    138135        }
  • Corrade/commands/Corrade/SetInventoryData.cs

    r511 r520  
    4343                    {
    4444                        case true:
    45                             lock (Locks.ClientInstanceInventoryLock)
     45                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     46                            if (Client.Inventory.Store.Contains(itemUUID))
    4647                            {
    47                                 if (Client.Inventory.Store.Contains(itemUUID))
    48                                 {
    49                                     inventoryBase = Client.Inventory.Store[itemUUID];
    50                                 }
     48                                inventoryBase = Client.Inventory.Store[itemUUID];
    5149                            }
     50                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5251                            break;
    5352
     
    7170                            wasInput(KeyValue.Get(wasOutput(Reflection.GetNameFromEnumValue(Command.ScriptKeys.DATA)),
    7271                                corradeCommandParameters.Message)));
    73                     lock (Locks.ClientInstanceInventoryLock)
    74                     {
    75                         Client.Inventory.RequestUpdateItem(inventoryitem);
    76                     }
     72                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     73                    Client.Inventory.RequestUpdateItem(inventoryitem);
     74                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    7775                };
    7876        }
  • Corrade/commands/Corrade/SetRolePowers.cs

    r511 r520  
    8282                    var GroupRoleDataReplyEvent = new ManualResetEvent(false);
    8383                    var groupRole = new GroupRole();
     84                    var requestUUID = UUID.Zero;
    8485                    EventHandler<GroupRolesDataReplyEventArgs> GroupRolesDataEventHandler = (sender, args) =>
    8586                    {
     87                        if (!args.RequestID.Equals(requestUUID) || !args.GroupID.Equals(groupUUID))
     88                            return;
    8689                        args.Roles.TryGetValue(roleUUID, out groupRole);
    8790                        GroupRoleDataReplyEvent.Set();
    8891                    };
    89                     lock (Locks.ClientInstanceGroupsLock)
     92                    Client.Groups.GroupRoleDataReply += GroupRolesDataEventHandler;
     93                    requestUUID = Client.Groups.RequestGroupRoles(groupUUID);
     94                    if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    9095                    {
    91                         Client.Groups.GroupRoleDataReply += GroupRolesDataEventHandler;
    92                         Client.Groups.RequestGroupRoles(groupUUID);
    93                         if (!GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    94                         {
    95                             Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
    96                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    97                         }
    9896                        Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
     97                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    9998                    }
     99                    Client.Groups.GroupRoleDataReply -= GroupRolesDataEventHandler;
    100100                    if (groupRole.Equals(default(GroupRole)))
    101101                    {
     
    120120                                                (GroupPowers)q.GetValue(null));
    121121                                        }));
    122                     lock (Locks.ClientInstanceGroupsLock)
    123                     {
    124                         Client.Groups.UpdateRole(groupRole);
    125                     }
     122                    Client.Groups.UpdateRole(groupRole);
    126123                };
    127124        }
  • Corrade/commands/Corrade/SetScriptRunning.cs

    r511 r520  
    9191                    }
    9292                    var inventory = new List<InventoryBase>();
    93                     lock (Locks.ClientInstanceInventoryLock)
    94                     {
    95                         inventory.AddRange(
     93                    Locks.ClientInstanceInventoryLock.EnterReadLock();
     94                    inventory.AddRange(
    9695                            Client.Inventory.GetTaskInventory(primitive.ID, primitive.LocalID,
    9796                                (int)corradeConfiguration.ServicesTimeout));
    98                     }
     97                    Locks.ClientInstanceInventoryLock.ExitReadLock();
    9998                    var inventoryItem = !entityUUID.Equals(UUID.Zero)
    10099                        ? inventory.AsParallel().FirstOrDefault(o => o.UUID.Equals(entityUUID)) as InventoryItem
     
    124123                        case Enumerations.Action.START:
    125124                        case Enumerations.Action.STOP:
    126                             lock (Locks.ClientInstanceInventoryLock)
    127                             {
    128                                 Client.Inventory.RequestSetScriptRunning(primitive.ID, inventoryItem.UUID,
     125                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     126                            Client.Inventory.RequestSetScriptRunning(primitive.ID, inventoryItem.UUID,
    129127                                    action.Equals(Enumerations.Action.START));
    130                             }
     128                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
    131129                            break;
    132130
     
    150148                        ScriptRunningReplyEvent.Set();
    151149                    };
    152                     lock (Locks.ClientInstanceInventoryLock)
     150                    Locks.ClientInstanceInventoryLock.EnterWriteLock();
     151                    Client.Inventory.ScriptRunningReply += ScriptRunningEventHandler;
     152                    Client.Inventory.RequestGetScriptRunning(primitive.ID, inventoryItem.UUID);
     153                    if (!ScriptRunningReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    153154                    {
    154                         Client.Inventory.ScriptRunningReply += ScriptRunningEventHandler;
    155                         Client.Inventory.RequestGetScriptRunning(primitive.ID, inventoryItem.UUID);
    156                         if (!ScriptRunningReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    157                         {
    158                             Client.Inventory.ScriptRunningReply -= ScriptRunningEventHandler;
    159                             throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_SCRIPT_STATE);
    160                         }
    161155                        Client.Inventory.ScriptRunningReply -= ScriptRunningEventHandler;
     156                        Locks.ClientInstanceInventoryLock.ExitWriteLock();
     157                        throw new Command.ScriptException(Enumerations.ScriptError.TIMEOUT_GETTING_SCRIPT_STATE);
    162158                    }
     159                    Client.Inventory.ScriptRunningReply -= ScriptRunningEventHandler;
     160                    Locks.ClientInstanceInventoryLock.ExitWriteLock();
    163161                    if (!succeeded)
    164162                    {
  • Corrade/commands/Corrade/SoftBan.cs

    r511 r520  
    274274                                        .ForAll(o =>
    275275                                        {
    276                                             lock (Locks.ClientInstanceGroupsLock)
    277                                             {
    278                                                 var GroupBanEvent = new ManualResetEvent(false);
    279                                                 Client.Groups.RequestBanAction(groupUUID, GroupBanAction.Unban,
    280                                                     new[] { o }, (sender, args) => { GroupBanEvent.Set(); });
    281                                                 if (
    282                                                     !GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
    283                                                         false))
     276                                            var GroupBanEvent = new ManualResetEvent(false);
     277                                            Client.Groups.RequestBanAction(groupUUID, GroupBanAction.Unban,
     278                                                new[] { o }, (sender, args) => { GroupBanEvent.Set(); });
     279                                            if (
     280                                                !GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
     281                                                    false))
     282                                            {
     283                                                lock (LockObject)
    284284                                                {
    285                                                     lock (LockObject)
     285                                                    if (!data.Contains(process[o]))
    286286                                                    {
    287                                                         if (!data.Contains(process[o]))
    288                                                         {
    289                                                             data.Add(process[o]);
    290                                                         }
     287                                                        data.Add(process[o]);
    291288                                                    }
    292289                                                }
     
    311308                                        (sender, args) =>
    312309                                        {
    313                                             if (!groupMembersRequestUUID.Equals(args.RequestID)) return;
     310                                            if (!groupMembersRequestUUID.Equals(args.RequestID) || !args.GroupID.Equals(groupUUID))
     311                                                return;
    314312
    315313                                            groupMembers = args.Members;
    316314                                            groupMembersReceivedEvent.Set();
    317315                                        };
    318                                     lock (Locks.ClientInstanceGroupsLock)
    319                                     {
    320                                         Client.Groups.GroupMembersReply += HandleGroupMembersReplyDelegate;
    321                                         groupMembersRequestUUID = Client.Groups.RequestGroupMembers(groupUUID);
    322                                         if (
    323                                             !groupMembersReceivedEvent.WaitOne(
    324                                                 (int)corradeConfiguration.ServicesTimeout, false))
    325                                         {
    326                                             Client.Groups.GroupMembersReply -= HandleGroupMembersReplyDelegate;
    327                                             throw new Command.ScriptException(
    328                                                 Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_MEMBERS);
    329                                         }
     316                                    Client.Groups.GroupMembersReply += HandleGroupMembersReplyDelegate;
     317                                    groupMembersRequestUUID = Client.Groups.RequestGroupMembers(groupUUID);
     318                                    if (
     319                                        !groupMembersReceivedEvent.WaitOne(
     320                                            (int)corradeConfiguration.ServicesTimeout, false))
     321                                    {
    330322                                        Client.Groups.GroupMembersReply -= HandleGroupMembersReplyDelegate;
    331                                     }
     323                                        throw new Command.ScriptException(
     324                                            Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_MEMBERS);
     325                                    }
     326                                    Client.Groups.GroupMembersReply -= HandleGroupMembersReplyDelegate;
    332327                                    var targetGroup = new Group();
    333328                                    if (
     
    341336                                    var groupRolesMembers = new HashSet<KeyValuePair<UUID, UUID>>();
    342337                                    var GroupRoleMembersReplyEvent = new ManualResetEvent(false);
    343                                     var groupRolesMembersRequestUUID = UUID.Zero;
     338                                    var requestUUID = UUID.Zero;
    344339                                    EventHandler<GroupRolesMembersReplyEventArgs> GroupRoleMembersEventHandler =
    345340                                        (sender, args) =>
    346341                                        {
    347                                             if (!groupRolesMembersRequestUUID.Equals(args.RequestID)) return;
     342                                            if (!requestUUID.Equals(args.RequestID) || !args.GroupID.Equals(groupUUID))
     343                                                return;
    348344                                            groupRolesMembers.UnionWith(args.RolesMembers);
    349345                                            GroupRoleMembersReplyEvent.Set();
    350346                                        };
    351                                     lock (Locks.ClientInstanceGroupsLock)
    352                                     {
    353                                         Client.Groups.GroupRoleMembersReply += GroupRoleMembersEventHandler;
    354                                         groupRolesMembersRequestUUID = Client.Groups.RequestGroupRolesMembers(groupUUID);
    355                                         if (
    356                                             !GroupRoleMembersReplyEvent.WaitOne(
    357                                                 (int)corradeConfiguration.ServicesTimeout, false))
    358                                         {
    359                                             Client.Groups.GroupRoleMembersReply -= GroupRoleMembersEventHandler;
    360                                             throw new Command.ScriptException(
    361                                                 Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLE_MEMBERS);
    362                                         }
     347                                    Client.Groups.GroupRoleMembersReply += GroupRoleMembersEventHandler;
     348                                    requestUUID = Client.Groups.RequestGroupRolesMembers(groupUUID);
     349                                    if (
     350                                        !GroupRoleMembersReplyEvent.WaitOne(
     351                                            (int)corradeConfiguration.ServicesTimeout, false))
     352                                    {
    363353                                        Client.Groups.GroupRoleMembersReply -= GroupRoleMembersEventHandler;
    364                                     }
     354                                        throw new Command.ScriptException(
     355                                            Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLE_MEMBERS);
     356                                    }
     357                                    Client.Groups.GroupRoleMembersReply -= GroupRoleMembersEventHandler;
    365358                                    // Retrieve the soft ban list for the group.
    366359                                    ObservableHashSet<SoftBan> groupSoftBans;
     
    431424                                                    }
    432425                                                    // Now ban the agent.
    433                                                     lock (Locks.ClientInstanceGroupsLock)
     426                                                    var GroupBanEvent = new ManualResetEvent(false);
     427                                                    Client.Groups.RequestBanAction(groupUUID,
     428                                                        GroupBanAction.Ban, new[] { o.Value.ID },
     429                                                        (sender, args) => { GroupBanEvent.Set(); });
     430                                                    if (
     431                                                        !GroupBanEvent.WaitOne(
     432                                                            (int)corradeConfiguration.ServicesTimeout, false))
    434433                                                    {
    435                                                         var GroupBanEvent = new ManualResetEvent(false);
    436                                                         Client.Groups.RequestBanAction(groupUUID,
    437                                                             GroupBanAction.Ban, new[] { o.Value.ID },
    438                                                             (sender, args) => { GroupBanEvent.Set(); });
    439                                                         if (
    440                                                             !GroupBanEvent.WaitOne(
    441                                                                 (int)corradeConfiguration.ServicesTimeout, false))
     434                                                        lock (LockObject)
    442435                                                        {
    443                                                             lock (LockObject)
     436                                                            if (!data.Contains(process[o.Value.ID]))
    444437                                                            {
    445                                                                 if (!data.Contains(process[o.Value.ID]))
    446                                                                 {
    447                                                                     data.Add(process[o.Value.ID]);
    448                                                                 }
     438                                                                data.Add(process[o.Value.ID]);
    449439                                                            }
    450                                                             return;
    451440                                                        }
     441                                                        return;
    452442                                                    }
    453443                                                }
     
    463453                                                    (sender, args) =>
    464454                                                    {
     455                                                        if (!args.GroupID.Equals(groupUUID))
     456                                                            return;
    465457                                                        succeeded = args.Success;
    466458                                                        GroupEjectEvent.Set();
    467459                                                    };
    468                                                 lock (Locks.ClientInstanceGroupsLock)
    469                                                 {
    470                                                     Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
    471                                                     Client.Groups.EjectUser(groupUUID, o.Value.ID);
    472                                                     GroupEjectEvent.WaitOne(
    473                                                         (int)corradeConfiguration.ServicesTimeout,
    474                                                         false);
    475                                                     Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
    476                                                 }
     460                                                Locks.ClientInstanceGroupsLock.EnterWriteLock();
     461                                                Client.Groups.GroupMemberEjected += GroupOperationEventHandler;
     462                                                Client.Groups.EjectUser(groupUUID, o.Value.ID);
     463                                                GroupEjectEvent.WaitOne(
     464                                                    (int)corradeConfiguration.ServicesTimeout,
     465                                                    false);
     466                                                Client.Groups.GroupMemberEjected -= GroupOperationEventHandler;
     467                                                Locks.ClientInstanceGroupsLock.ExitWriteLock();
    477468                                                // If the eject was not successful, add them to the output.
    478469                                                switch (succeeded)
     
    820811                                            Enumerations.ScriptError.BAN_WOULD_EXCEED_MAXIMUM_BAN_LIST_LENGTH);
    821812                                    // ban the avatars
    822                                     lock (Locks.ClientInstanceGroupsLock)
    823                                     {
    824                                         var GroupBanEvent = new ManualResetEvent(false);
    825                                         Client.Groups.RequestBanAction(groupUUID,
    826                                             GroupBanAction.Ban,
    827                                             groupSoftBans.Select(o => o.Agent).ToArray(),
    828                                             (sender, args) => { GroupBanEvent.Set(); });
    829                                         if (!GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    830                                         {
    831                                             throw new Command.ScriptException(
    832                                                 Enumerations.ScriptError.TIMEOUT_MODIFYING_GROUP_BAN_LIST);
    833                                         }
     813                                    var GroupBanEvent = new ManualResetEvent(false);
     814                                    Client.Groups.RequestBanAction(groupUUID,
     815                                        GroupBanAction.Ban,
     816                                        groupSoftBans.Select(o => o.Agent).ToArray(),
     817                                        (sender, args) => { GroupBanEvent.Set(); });
     818                                    if (!GroupBanEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
     819                                    {
     820                                        throw new Command.ScriptException(
     821                                            Enumerations.ScriptError.TIMEOUT_MODIFYING_GROUP_BAN_LIST);
    834822                                    }
    835823                                    break;
  • Corrade/commands/Corrade/StartProposal.cs

    r511 r520  
    8989                        throw new Command.ScriptException(Enumerations.ScriptError.INVALID_PROPOSAL_TEXT);
    9090                    }
    91                     lock (Locks.ClientInstanceGroupsLock)
     91                    Client.Groups.StartProposal(corradeCommandParameters.Group.UUID, new GroupProposal
    9292                    {
    93                         Client.Groups.StartProposal(corradeCommandParameters.Group.UUID, new GroupProposal
    94                         {
    95                             Duration = (int)duration,
    96                             Majority = majority,
    97                             Quorum = (int)quorum,
    98                             VoteText = text
    99                         });
    100                     }
     93                        Duration = (int)duration,
     94                        Majority = majority,
     95                        Quorum = (int)quorum,
     96                        VoteText = text
     97                    });
    10198                };
    10299        }
  • Corrade/commands/Corrade/Tag.cs

    r511 r520  
    6161                        throw new Command.ScriptException(Enumerations.ScriptError.NOT_IN_GROUP);
    6262                    }
     63                    var requestUUID = UUID.Zero;
    6364                    switch (Reflection.GetEnumValueFromName<Enumerations.Action>(
    6465                        wasInput(
     
    7273                            EventHandler<GroupRolesDataReplyEventArgs> Groups_GroupRoleDataReply = (sender, args) =>
    7374                            {
     75                                if (!requestUUID.Equals(args.RequestID) || !args.GroupID.Equals(groupUUID))
     76                                    return;
     77
    7478                                roleData = args.Roles.ToDictionary(o => o.Value.Title, o => o.Value.ID);
    7579                                GroupRoleDataReplyEvent.Set();
    7680                            };
    77                             lock (Locks.ClientInstanceGroupsLock)
     81                            Client.Groups.GroupRoleDataReply += Groups_GroupRoleDataReply;
     82                            requestUUID = Client.Groups.RequestGroupRoles(groupUUID);
     83                            if (
     84                                !GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
     85                                    false))
    7886                            {
    79                                 Client.Groups.GroupRoleDataReply += Groups_GroupRoleDataReply;
    80                                 Client.Groups.RequestGroupRoles(groupUUID);
    81                                 if (
    82                                     !GroupRoleDataReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout,
    83                                         false))
    84                                 {
    85                                     Client.Groups.GroupRoleDataReply -= Groups_GroupRoleDataReply;
    86                                     throw new Command.ScriptException(
    87                                         Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    88                                 }
    8987                                Client.Groups.GroupRoleDataReply -= Groups_GroupRoleDataReply;
     88                                throw new Command.ScriptException(
     89                                    Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_ROLES);
    9090                            }
     91                            Client.Groups.GroupRoleDataReply -= Groups_GroupRoleDataReply;
    9192                            var role = roleData.AsParallel().FirstOrDefault(
    9293                                o =>
     
    102103                                    throw new Command.ScriptException(Enumerations.ScriptError.COULD_NOT_FIND_TITLE);
    103104                            }
    104                             lock (Locks.ClientInstanceGroupsLock)
    105                             {
    106                                 Client.Groups.ActivateTitle(groupUUID, role.Value);
    107                             }
     105                            Client.Groups.ActivateTitle(groupUUID, role.Value);
    108106                            break;
    109107
     
    113111                            EventHandler<GroupTitlesReplyEventArgs> GroupTitlesReplyEventHandler = (sender, args) =>
    114112                            {
     113                                if (!args.RequestID.Equals(requestUUID) || !args.GroupID.Equals(groupUUID))
     114                                    return;
     115
    115116                                var pair =
    116117                                    args.Titles.AsParallel().FirstOrDefault(o => o.Value.Selected);
     
    121122                                GroupTitlesReplyEvent.Set();
    122123                            };
    123                             lock (Locks.ClientInstanceGroupsLock)
     124                            Client.Groups.GroupTitlesReply += GroupTitlesReplyEventHandler;
     125                            requestUUID = Client.Groups.RequestGroupTitles(groupUUID);
     126                            if (
     127                                !GroupTitlesReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    124128                            {
    125                                 Client.Groups.GroupTitlesReply += GroupTitlesReplyEventHandler;
    126                                 Client.Groups.RequestGroupTitles(groupUUID);
    127                                 if (
    128                                     !GroupTitlesReplyEvent.WaitOne((int)corradeConfiguration.ServicesTimeout, false))
    129                                 {
    130                                     Client.Groups.GroupTitlesReply -= GroupTitlesReplyEventHandler;
    131                                     throw new Command.ScriptException(
    132                                         Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_TITLES);
    133                                 }
    134129                                Client.Groups.GroupTitlesReply -= GroupTitlesReplyEventHandler;
     130                                throw new Command.ScriptException(
     131                                    Enumerations.ScriptError.TIMEOUT_GETTING_GROUP_TITLES);
    135132                            }
     133                            Client.Groups.GroupTitlesReply -= GroupTitlesReplyEventHandler;
    136134                            if (!title.Equals(string.Empty))
    137135                            {
  • Corrade/commands/Corrade/Tell.cs

    r511 r520  
    1313using System.IO;
    1414using System.Linq;
     15using System.Threading;
    1516using System.Reflection;
    1617using System.Text;
     
    1920using wasSharp.Timers;
    2021using Reflection = wasSharp.Reflection;
     22using OpenMetaverse.Packets;
     23using Corrade.Source.WebForms.SecondLife;
    2124
    2225namespace Corrade
     
    249252
    250253                                default:
    251                                     groupUUID = corradeCommandParameters.Group.UUID;
     254                                    groupUUID = new UUID(corradeCommandParameters.Group.UUID);
    252255                                    break;
    253256                            }
     
    467470
    468471                        case Enumerations.Entity.ESTATE:
     472                            if (!Client.Network.CurrentSim.IsEstateManager)
     473                                throw new Command.ScriptException(Enumerations.ScriptError.NO_ESTATE_POWERS_FOR_COMMAND);
     474
    469475                            lock (Locks.ClientInstanceEstateLock)
    470476                            {
     
    474480
    475481                        case Enumerations.Entity.REGION:
     482                            if (!Client.Network.CurrentSim.IsEstateManager)
     483                                throw new Command.ScriptException(Enumerations.ScriptError.NO_ESTATE_POWERS_FOR_COMMAND);
     484
    476485                            lock (Locks.ClientInstanceEstateLock)
    477486                            {
  • Corrade/commands/Corrade/TrashItem.cs

    r511 r520  
    4242                    {
    4343                        case true:
    44                             lock (Locks.ClientInstanceInventoryLock)
    45                             {
    46                                 if (Client.Inventory.Store.Contains(itemUUID))
     44                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     45                            if (Client.Inventory.Store.Contains(itemUUID))
    4746                                {
    4847                                    inventoryBase = Client.Inventory.Store[itemUUID];
    4948                                }
    50                             }
     49                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    5150                            break;
    5251
     
    6665                    {
    6766                        case true:
    68                             UUID rootFolderUUID;
    69                             UUID libraryFolderUUID;
    70                             lock (Locks.ClientInstanceInventoryLock)
    71                             {
    72                                 rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
    73                                 libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
    74                             }
     67                            Locks.ClientInstanceInventoryLock.EnterReadLock();
     68                            UUID rootFolderUUID = Client.Inventory.Store.RootFolder.UUID;
     69                            UUID libraryFolderUUID = Client.Inventory.Store.LibraryFolder.UUID;
     70                            Locks.ClientInstanceInventoryLock.ExitReadLock();
    7571                            if (inventoryBase.UUID.Equals(rootFolderUUID))
    7672                            {
     
    9288                    {
    9389                        case true:
    94                             lock (Locks.ClientInstanceInventoryLock)
    95                             {
    96                                 Client.Inventory.MoveFolder(inventoryBase.UUID,
     90                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     91                            Client.Inventory.MoveFolder(inventoryBase.UUID,
    9792                                    Client.Inventory.FindFolderForType(AssetType.TrashFolder));
    98                             }
     93                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
    9994                            break;
    10095
    10196                        default:
    102                             lock (Locks.ClientInstanceInventoryLock)
    103                             {
    104                                 Client.Inventory.MoveItem(inventoryBase.UUID,
     97                            Locks.ClientInstanceInventoryLock.EnterWriteLock();
     98                            Client.Inventory.MoveItem(inventoryBase.UUID,
    10599                                    Client.Inventory.FindFolderForType(AssetType.TrashFolder));
    106                             }
     100                            Locks.ClientInstanceInventoryLock.ExitWriteLock();
    107101