aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs536
1 files changed, 307 insertions, 229 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 50b2fb5..a94cd46 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Diagnostics; //for [DebuggerNonUserCode]
31using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
32using System.Text; 33using System.Text;
33using System.Threading; 34using System.Threading;
@@ -151,6 +152,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
151 get { return m_ScriptEngine.World; } 152 get { return m_ScriptEngine.World; }
152 } 153 }
153 154
155 [DebuggerNonUserCode]
154 public void state(string newState) 156 public void state(string newState)
155 { 157 {
156 m_ScriptEngine.SetState(m_itemID, newState); 158 m_ScriptEngine.SetState(m_itemID, newState);
@@ -160,6 +162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
160 /// Reset the named script. The script must be present 162 /// Reset the named script. The script must be present
161 /// in the same prim. 163 /// in the same prim.
162 /// </summary> 164 /// </summary>
165 [DebuggerNonUserCode]
163 public void llResetScript() 166 public void llResetScript()
164 { 167 {
165 m_host.AddScriptLPS(1); 168 m_host.AddScriptLPS(1);
@@ -272,40 +275,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
272 protected UUID InventorySelf() 275 protected UUID InventorySelf()
273 { 276 {
274 UUID invItemID = new UUID(); 277 UUID invItemID = new UUID();
275 278 bool unlock = false;
276 lock (m_host.TaskInventory) 279 if (!m_host.TaskInventory.IsReadLockedByMe())
280 {
281 m_host.TaskInventory.LockItemsForRead(true);
282 unlock = true;
283 }
284 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
277 { 285 {
278 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 286 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
279 { 287 {
280 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) 288 invItemID = inv.Key;
281 { 289 break;
282 invItemID = inv.Key;
283 break;
284 }
285 } 290 }
286 } 291 }
287 292 if (unlock)
293 {
294 m_host.TaskInventory.LockItemsForRead(false);
295 }
288 return invItemID; 296 return invItemID;
289 } 297 }
290 298
291 protected UUID InventoryKey(string name, int type) 299 protected UUID InventoryKey(string name, int type)
292 { 300 {
293 m_host.AddScriptLPS(1); 301 m_host.AddScriptLPS(1);
294 302 m_host.TaskInventory.LockItemsForRead(true);
295 lock (m_host.TaskInventory) 303
304 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
296 { 305 {
297 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 306 if (inv.Value.Name == name)
298 { 307 {
299 if (inv.Value.Name == name) 308 m_host.TaskInventory.LockItemsForRead(false);
309
310 if (inv.Value.Type != type)
300 { 311 {
301 if (inv.Value.Type != type) 312 return UUID.Zero;
302 return UUID.Zero;
303
304 return inv.Value.AssetID;
305 } 313 }
314
315 return inv.Value.AssetID;
306 } 316 }
307 } 317 }
308 318
319 m_host.TaskInventory.LockItemsForRead(false);
309 return UUID.Zero; 320 return UUID.Zero;
310 } 321 }
311 322
@@ -313,17 +324,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
313 { 324 {
314 m_host.AddScriptLPS(1); 325 m_host.AddScriptLPS(1);
315 326
316 lock (m_host.TaskInventory) 327
328 m_host.TaskInventory.LockItemsForRead(true);
329
330 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
317 { 331 {
318 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 332 if (inv.Value.Name == name)
319 { 333 {
320 if (inv.Value.Name == name) 334 m_host.TaskInventory.LockItemsForRead(false);
321 { 335 return inv.Value.AssetID;
322 return inv.Value.AssetID;
323 }
324 } 336 }
325 } 337 }
326 338
339 m_host.TaskInventory.LockItemsForRead(false);
340
341
327 return UUID.Zero; 342 return UUID.Zero;
328 } 343 }
329 344
@@ -2534,12 +2549,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2534 2549
2535 m_host.AddScriptLPS(1); 2550 m_host.AddScriptLPS(1);
2536 2551
2552 m_host.TaskInventory.LockItemsForRead(true);
2537 TaskInventoryItem item = m_host.TaskInventory[invItemID]; 2553 TaskInventoryItem item = m_host.TaskInventory[invItemID];
2538 2554 m_host.TaskInventory.LockItemsForRead(false);
2539 lock (m_host.TaskInventory)
2540 {
2541 item = m_host.TaskInventory[invItemID];
2542 }
2543 2555
2544 if (item.PermsGranter == UUID.Zero) 2556 if (item.PermsGranter == UUID.Zero)
2545 return 0; 2557 return 0;
@@ -2614,6 +2626,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2614 if (dist > m_ScriptDistanceFactor * 10.0f) 2626 if (dist > m_ScriptDistanceFactor * 10.0f)
2615 return; 2627 return;
2616 2628
2629 //Clone is thread-safe
2617 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 2630 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
2618 2631
2619 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) 2632 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory)
@@ -2747,13 +2760,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2747 { 2760 {
2748 TaskInventoryItem item; 2761 TaskInventoryItem item;
2749 2762
2750 lock (m_host.TaskInventory) 2763 m_host.TaskInventory.LockItemsForRead(true);
2764 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2751 { 2765 {
2752 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2766 m_host.TaskInventory.LockItemsForRead(false);
2753 return; 2767 return;
2754 else 2768 }
2755 item = m_host.TaskInventory[InventorySelf()]; 2769 else
2770 {
2771 item = m_host.TaskInventory[InventorySelf()];
2756 } 2772 }
2773 m_host.TaskInventory.LockItemsForRead(false);
2757 2774
2758 if (item.PermsGranter != UUID.Zero) 2775 if (item.PermsGranter != UUID.Zero)
2759 { 2776 {
@@ -2775,13 +2792,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2775 { 2792 {
2776 TaskInventoryItem item; 2793 TaskInventoryItem item;
2777 2794
2795 m_host.TaskInventory.LockItemsForRead(true);
2778 lock (m_host.TaskInventory) 2796 lock (m_host.TaskInventory)
2779 { 2797 {
2798
2780 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2799 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2800 {
2801 m_host.TaskInventory.LockItemsForRead(false);
2781 return; 2802 return;
2803 }
2782 else 2804 else
2805 {
2783 item = m_host.TaskInventory[InventorySelf()]; 2806 item = m_host.TaskInventory[InventorySelf()];
2807 }
2784 } 2808 }
2809 m_host.TaskInventory.LockItemsForRead(false);
2785 2810
2786 m_host.AddScriptLPS(1); 2811 m_host.AddScriptLPS(1);
2787 2812
@@ -2818,14 +2843,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2818 2843
2819 TaskInventoryItem item; 2844 TaskInventoryItem item;
2820 2845
2821 lock (m_host.TaskInventory) 2846 m_host.TaskInventory.LockItemsForRead(true);
2847
2848 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2822 { 2849 {
2823 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2850 m_host.TaskInventory.LockItemsForRead(false);
2824 return; 2851 return;
2825 else 2852 }
2826 item = m_host.TaskInventory[InventorySelf()]; 2853 else
2854 {
2855 item = m_host.TaskInventory[InventorySelf()];
2827 } 2856 }
2828 2857
2858 m_host.TaskInventory.LockItemsForRead(false);
2859
2829 if (item.PermsGranter != m_host.OwnerID) 2860 if (item.PermsGranter != m_host.OwnerID)
2830 return; 2861 return;
2831 2862
@@ -2850,13 +2881,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2850 2881
2851 TaskInventoryItem item; 2882 TaskInventoryItem item;
2852 2883
2853 lock (m_host.TaskInventory) 2884 m_host.TaskInventory.LockItemsForRead(true);
2885
2886 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2854 { 2887 {
2855 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2888 m_host.TaskInventory.LockItemsForRead(false);
2856 return; 2889 return;
2857 else 2890 }
2858 item = m_host.TaskInventory[InventorySelf()]; 2891 else
2892 {
2893 item = m_host.TaskInventory[InventorySelf()];
2859 } 2894 }
2895 m_host.TaskInventory.LockItemsForRead(false);
2896
2860 2897
2861 if (item.PermsGranter != m_host.OwnerID) 2898 if (item.PermsGranter != m_host.OwnerID)
2862 return; 2899 return;
@@ -3080,14 +3117,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3080 3117
3081 TaskInventoryItem item; 3118 TaskInventoryItem item;
3082 3119
3083 lock (m_host.TaskInventory) 3120 m_host.TaskInventory.LockItemsForRead(true);
3121 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3084 { 3122 {
3085 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3123 m_host.TaskInventory.LockItemsForRead(false);
3086 return; 3124 return;
3087 else
3088 item = m_host.TaskInventory[InventorySelf()];
3089 } 3125 }
3090 3126 else
3127 {
3128 item = m_host.TaskInventory[InventorySelf()];
3129 }
3130 m_host.TaskInventory.LockItemsForRead(false);
3091 if (item.PermsGranter == UUID.Zero) 3131 if (item.PermsGranter == UUID.Zero)
3092 return; 3132 return;
3093 3133
@@ -3117,13 +3157,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3117 3157
3118 TaskInventoryItem item; 3158 TaskInventoryItem item;
3119 3159
3120 lock (m_host.TaskInventory) 3160 m_host.TaskInventory.LockItemsForRead(true);
3161 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3121 { 3162 {
3122 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3163 m_host.TaskInventory.LockItemsForRead(false);
3123 return; 3164 return;
3124 else
3125 item = m_host.TaskInventory[InventorySelf()];
3126 } 3165 }
3166 else
3167 {
3168 item = m_host.TaskInventory[InventorySelf()];
3169 }
3170 m_host.TaskInventory.LockItemsForRead(false);
3171
3127 3172
3128 if (item.PermsGranter == UUID.Zero) 3173 if (item.PermsGranter == UUID.Zero)
3129 return; 3174 return;
@@ -3196,10 +3241,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3196 3241
3197 TaskInventoryItem item; 3242 TaskInventoryItem item;
3198 3243
3199 lock (m_host.TaskInventory) 3244
3245 m_host.TaskInventory.LockItemsForRead(true);
3246 if (!m_host.TaskInventory.ContainsKey(invItemID))
3247 {
3248 m_host.TaskInventory.LockItemsForRead(false);
3249 return;
3250 }
3251 else
3200 { 3252 {
3201 item = m_host.TaskInventory[invItemID]; 3253 item = m_host.TaskInventory[invItemID];
3202 } 3254 }
3255 m_host.TaskInventory.LockItemsForRead(false);
3203 3256
3204 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3257 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3205 { 3258 {
@@ -3231,11 +3284,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3231 3284
3232 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3285 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3233 { 3286 {
3234 lock (m_host.TaskInventory) 3287 m_host.TaskInventory.LockItemsForWrite(true);
3235 { 3288 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3236 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3289 m_host.TaskInventory[invItemID].PermsMask = perm;
3237 m_host.TaskInventory[invItemID].PermsMask = perm; 3290 m_host.TaskInventory.LockItemsForWrite(false);
3238 }
3239 3291
3240 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3292 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3241 "run_time_permissions", new Object[] { 3293 "run_time_permissions", new Object[] {
@@ -3255,11 +3307,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3255 3307
3256 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3308 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3257 { 3309 {
3258 lock (m_host.TaskInventory) 3310 m_host.TaskInventory.LockItemsForWrite(true);
3259 { 3311 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3260 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3312 m_host.TaskInventory[invItemID].PermsMask = perm;
3261 m_host.TaskInventory[invItemID].PermsMask = perm; 3313 m_host.TaskInventory.LockItemsForWrite(false);
3262 }
3263 3314
3264 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3315 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3265 "run_time_permissions", new Object[] { 3316 "run_time_permissions", new Object[] {
@@ -3280,11 +3331,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3280 3331
3281 if (!m_waitingForScriptAnswer) 3332 if (!m_waitingForScriptAnswer)
3282 { 3333 {
3283 lock (m_host.TaskInventory) 3334 m_host.TaskInventory.LockItemsForWrite(true);
3284 { 3335 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3285 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3336 m_host.TaskInventory[invItemID].PermsMask = 0;
3286 m_host.TaskInventory[invItemID].PermsMask = 0; 3337 m_host.TaskInventory.LockItemsForWrite(false);
3287 }
3288 3338
3289 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3339 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
3290 m_waitingForScriptAnswer=true; 3340 m_waitingForScriptAnswer=true;
@@ -3319,10 +3369,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3319 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3369 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3320 llReleaseControls(); 3370 llReleaseControls();
3321 3371
3322 lock (m_host.TaskInventory) 3372
3323 { 3373 m_host.TaskInventory.LockItemsForWrite(true);
3324 m_host.TaskInventory[invItemID].PermsMask = answer; 3374 m_host.TaskInventory[invItemID].PermsMask = answer;
3325 } 3375 m_host.TaskInventory.LockItemsForWrite(false);
3376
3326 3377
3327 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3378 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3328 "run_time_permissions", new Object[] { 3379 "run_time_permissions", new Object[] {
@@ -3334,16 +3385,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3334 { 3385 {
3335 m_host.AddScriptLPS(1); 3386 m_host.AddScriptLPS(1);
3336 3387
3337 lock (m_host.TaskInventory) 3388 m_host.TaskInventory.LockItemsForRead(true);
3389
3390 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3338 { 3391 {
3339 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3392 if (item.Type == 10 && item.ItemID == m_itemID)
3340 { 3393 {
3341 if (item.Type == 10 && item.ItemID == m_itemID) 3394 m_host.TaskInventory.LockItemsForRead(false);
3342 { 3395 return item.PermsGranter.ToString();
3343 return item.PermsGranter.ToString();
3344 }
3345 } 3396 }
3346 } 3397 }
3398 m_host.TaskInventory.LockItemsForRead(false);
3347 3399
3348 return UUID.Zero.ToString(); 3400 return UUID.Zero.ToString();
3349 } 3401 }
@@ -3352,19 +3404,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3352 { 3404 {
3353 m_host.AddScriptLPS(1); 3405 m_host.AddScriptLPS(1);
3354 3406
3355 lock (m_host.TaskInventory) 3407 m_host.TaskInventory.LockItemsForRead(true);
3408
3409 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3356 { 3410 {
3357 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3411 if (item.Type == 10 && item.ItemID == m_itemID)
3358 { 3412 {
3359 if (item.Type == 10 && item.ItemID == m_itemID) 3413 int perms = item.PermsMask;
3360 { 3414 if (m_automaticLinkPermission)
3361 int perms = item.PermsMask; 3415 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3362 if (m_automaticLinkPermission) 3416 m_host.TaskInventory.LockItemsForRead(false);
3363 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; 3417 return perms;
3364 return perms;
3365 }
3366 } 3418 }
3367 } 3419 }
3420 m_host.TaskInventory.LockItemsForRead(false);
3368 3421
3369 return 0; 3422 return 0;
3370 } 3423 }
@@ -3397,11 +3450,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3397 UUID invItemID = InventorySelf(); 3450 UUID invItemID = InventorySelf();
3398 3451
3399 TaskInventoryItem item; 3452 TaskInventoryItem item;
3400 lock (m_host.TaskInventory) 3453 m_host.TaskInventory.LockItemsForRead(true);
3401 { 3454 item = m_host.TaskInventory[invItemID];
3402 item = m_host.TaskInventory[invItemID]; 3455 m_host.TaskInventory.LockItemsForRead(false);
3403 } 3456
3404
3405 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3457 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3406 && !m_automaticLinkPermission) 3458 && !m_automaticLinkPermission)
3407 { 3459 {
@@ -3454,16 +3506,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3454 m_host.AddScriptLPS(1); 3506 m_host.AddScriptLPS(1);
3455 UUID invItemID = InventorySelf(); 3507 UUID invItemID = InventorySelf();
3456 3508
3457 lock (m_host.TaskInventory) 3509 m_host.TaskInventory.LockItemsForRead(true);
3458 {
3459 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3510 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3460 && !m_automaticLinkPermission) 3511 && !m_automaticLinkPermission)
3461 { 3512 {
3462 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3513 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
3514 m_host.TaskInventory.LockItemsForRead(false);
3463 return; 3515 return;
3464 } 3516 }
3465 } 3517 m_host.TaskInventory.LockItemsForRead(false);
3466 3518
3467 if (linknum < ScriptBaseClass.LINK_THIS) 3519 if (linknum < ScriptBaseClass.LINK_THIS)
3468 return; 3520 return;
3469 3521
@@ -3632,17 +3684,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3632 m_host.AddScriptLPS(1); 3684 m_host.AddScriptLPS(1);
3633 int count = 0; 3685 int count = 0;
3634 3686
3635 lock (m_host.TaskInventory) 3687 m_host.TaskInventory.LockItemsForRead(true);
3688 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3636 { 3689 {
3637 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3690 if (inv.Value.Type == type || type == -1)
3638 { 3691 {
3639 if (inv.Value.Type == type || type == -1) 3692 count = count + 1;
3640 {
3641 count = count + 1;
3642 }
3643 } 3693 }
3644 } 3694 }
3645 3695
3696 m_host.TaskInventory.LockItemsForRead(false);
3646 return count; 3697 return count;
3647 } 3698 }
3648 3699
@@ -3651,16 +3702,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3651 m_host.AddScriptLPS(1); 3702 m_host.AddScriptLPS(1);
3652 ArrayList keys = new ArrayList(); 3703 ArrayList keys = new ArrayList();
3653 3704
3654 lock (m_host.TaskInventory) 3705 m_host.TaskInventory.LockItemsForRead(true);
3706 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3655 { 3707 {
3656 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3708 if (inv.Value.Type == type || type == -1)
3657 { 3709 {
3658 if (inv.Value.Type == type || type == -1) 3710 keys.Add(inv.Value.Name);
3659 {
3660 keys.Add(inv.Value.Name);
3661 }
3662 } 3711 }
3663 } 3712 }
3713 m_host.TaskInventory.LockItemsForRead(false);
3664 3714
3665 if (keys.Count == 0) 3715 if (keys.Count == 0)
3666 { 3716 {
@@ -3697,20 +3747,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3697 } 3747 }
3698 3748
3699 // move the first object found with this inventory name 3749 // move the first object found with this inventory name
3700 lock (m_host.TaskInventory) 3750 m_host.TaskInventory.LockItemsForRead(true);
3751 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3701 { 3752 {
3702 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3753 if (inv.Value.Name == inventory)
3703 { 3754 {
3704 if (inv.Value.Name == inventory) 3755 found = true;
3705 { 3756 objId = inv.Key;
3706 found = true; 3757 assetType = inv.Value.Type;
3707 objId = inv.Key; 3758 objName = inv.Value.Name;
3708 assetType = inv.Value.Type; 3759 break;
3709 objName = inv.Value.Name;
3710 break;
3711 }
3712 } 3760 }
3713 } 3761 }
3762 m_host.TaskInventory.LockItemsForRead(false);
3714 3763
3715 if (!found) 3764 if (!found)
3716 { 3765 {
@@ -3755,24 +3804,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3755 ScriptSleep(3000); 3804 ScriptSleep(3000);
3756 } 3805 }
3757 3806
3807 [DebuggerNonUserCode]
3758 public void llRemoveInventory(string name) 3808 public void llRemoveInventory(string name)
3759 { 3809 {
3760 m_host.AddScriptLPS(1); 3810 m_host.AddScriptLPS(1);
3761 3811
3762 lock (m_host.TaskInventory) 3812 m_host.TaskInventory.LockItemsForRead(true);
3813 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3763 { 3814 {
3764 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3815 if (item.Name == name)
3765 { 3816 {
3766 if (item.Name == name) 3817 if (item.ItemID == m_itemID)
3767 { 3818 throw new ScriptDeleteException();
3768 if (item.ItemID == m_itemID) 3819 else
3769 throw new ScriptDeleteException(); 3820 m_host.Inventory.RemoveInventoryItem(item.ItemID);
3770 else 3821
3771 m_host.Inventory.RemoveInventoryItem(item.ItemID); 3822 m_host.TaskInventory.LockItemsForRead(false);
3772 return; 3823 return;
3773 }
3774 } 3824 }
3775 } 3825 }
3826 m_host.TaskInventory.LockItemsForRead(false);
3776 } 3827 }
3777 3828
3778 public void llSetText(string text, LSL_Vector color, double alpha) 3829 public void llSetText(string text, LSL_Vector color, double alpha)
@@ -3861,6 +3912,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3861 { 3912 {
3862 m_host.AddScriptLPS(1); 3913 m_host.AddScriptLPS(1);
3863 3914
3915 //Clone is thread safe
3864 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 3916 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
3865 3917
3866 foreach (TaskInventoryItem item in itemDictionary.Values) 3918 foreach (TaskInventoryItem item in itemDictionary.Values)
@@ -3951,17 +4003,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3951 UUID soundId = UUID.Zero; 4003 UUID soundId = UUID.Zero;
3952 if (!UUID.TryParse(impact_sound, out soundId)) 4004 if (!UUID.TryParse(impact_sound, out soundId))
3953 { 4005 {
3954 lock (m_host.TaskInventory) 4006 m_host.TaskInventory.LockItemsForRead(true);
4007 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3955 { 4008 {
3956 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4009 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound)
3957 { 4010 {
3958 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) 4011 soundId = item.AssetID;
3959 { 4012 break;
3960 soundId = item.AssetID;
3961 break;
3962 }
3963 } 4013 }
3964 } 4014 }
4015 m_host.TaskInventory.LockItemsForRead(false);
3965 } 4016 }
3966 m_host.CollisionSound = soundId; 4017 m_host.CollisionSound = soundId;
3967 m_host.CollisionSoundVolume = (float)impact_volume; 4018 m_host.CollisionSoundVolume = (float)impact_volume;
@@ -4007,6 +4058,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4007 UUID partItemID; 4058 UUID partItemID;
4008 foreach (SceneObjectPart part in parts) 4059 foreach (SceneObjectPart part in parts)
4009 { 4060 {
4061 //Clone is thread safe
4010 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); 4062 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone();
4011 4063
4012 foreach (TaskInventoryItem item in itemsDictionary.Values) 4064 foreach (TaskInventoryItem item in itemsDictionary.Values)
@@ -4214,17 +4266,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4214 4266
4215 m_host.AddScriptLPS(1); 4267 m_host.AddScriptLPS(1);
4216 4268
4217 lock (m_host.TaskInventory) 4269 m_host.TaskInventory.LockItemsForRead(true);
4270 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
4218 { 4271 {
4219 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4272 if (item.Type == 10 && item.ItemID == m_itemID)
4220 { 4273 {
4221 if (item.Type == 10 && item.ItemID == m_itemID) 4274 result = item.Name!=null?item.Name:String.Empty;
4222 { 4275 break;
4223 result = item.Name!=null?item.Name:String.Empty;
4224 break;
4225 }
4226 } 4276 }
4227 } 4277 }
4278 m_host.TaskInventory.LockItemsForRead(false);
4228 4279
4229 return result; 4280 return result;
4230 } 4281 }
@@ -4482,23 +4533,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4482 { 4533 {
4483 m_host.AddScriptLPS(1); 4534 m_host.AddScriptLPS(1);
4484 4535
4485 lock (m_host.TaskInventory) 4536 m_host.TaskInventory.LockItemsForRead(true);
4537 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
4486 { 4538 {
4487 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 4539 if (inv.Value.Name == name)
4488 { 4540 {
4489 if (inv.Value.Name == name) 4541 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
4490 { 4542 {
4491 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) 4543 m_host.TaskInventory.LockItemsForRead(false);
4492 { 4544 return inv.Value.AssetID.ToString();
4493 return inv.Value.AssetID.ToString(); 4545 }
4494 } 4546 else
4495 else 4547 {
4496 { 4548 m_host.TaskInventory.LockItemsForRead(false);
4497 return UUID.Zero.ToString(); 4549 return UUID.Zero.ToString();
4498 }
4499 } 4550 }
4500 } 4551 }
4501 } 4552 }
4553 m_host.TaskInventory.LockItemsForRead(false);
4502 4554
4503 return UUID.Zero.ToString(); 4555 return UUID.Zero.ToString();
4504 } 4556 }
@@ -5993,14 +6045,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5993 6045
5994 protected UUID GetTaskInventoryItem(string name) 6046 protected UUID GetTaskInventoryItem(string name)
5995 { 6047 {
5996 lock (m_host.TaskInventory) 6048 m_host.TaskInventory.LockItemsForRead(true);
6049 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
5997 { 6050 {
5998 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6051 if (inv.Value.Name == name)
5999 { 6052 {
6000 if (inv.Value.Name == name) 6053 m_host.TaskInventory.LockItemsForRead(false);
6001 return inv.Key; 6054 return inv.Key;
6002 } 6055 }
6003 } 6056 }
6057 m_host.TaskInventory.LockItemsForRead(false);
6004 6058
6005 return UUID.Zero; 6059 return UUID.Zero;
6006 } 6060 }
@@ -6311,22 +6365,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6311 } 6365 }
6312 6366
6313 // copy the first script found with this inventory name 6367 // copy the first script found with this inventory name
6314 lock (m_host.TaskInventory) 6368 m_host.TaskInventory.LockItemsForRead(true);
6369 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
6315 { 6370 {
6316 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6371 if (inv.Value.Name == name)
6317 { 6372 {
6318 if (inv.Value.Name == name) 6373 // make sure the object is a script
6374 if (10 == inv.Value.Type)
6319 { 6375 {
6320 // make sure the object is a script 6376 found = true;
6321 if (10 == inv.Value.Type) 6377 srcId = inv.Key;
6322 { 6378 break;
6323 found = true;
6324 srcId = inv.Key;
6325 break;
6326 }
6327 } 6379 }
6328 } 6380 }
6329 } 6381 }
6382 m_host.TaskInventory.LockItemsForRead(false);
6330 6383
6331 if (!found) 6384 if (!found)
6332 { 6385 {
@@ -8129,28 +8182,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8129 { 8182 {
8130 m_host.AddScriptLPS(1); 8183 m_host.AddScriptLPS(1);
8131 8184
8132 lock (m_host.TaskInventory) 8185 m_host.TaskInventory.LockItemsForRead(true);
8186 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8133 { 8187 {
8134 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8188 if (inv.Value.Name == item)
8135 { 8189 {
8136 if (inv.Value.Name == item) 8190 m_host.TaskInventory.LockItemsForRead(false);
8191 switch (mask)
8137 { 8192 {
8138 switch (mask) 8193 case 0:
8139 { 8194 return (int)inv.Value.BasePermissions;
8140 case 0: 8195 case 1:
8141 return (int)inv.Value.BasePermissions; 8196 return (int)inv.Value.CurrentPermissions;
8142 case 1: 8197 case 2:
8143 return (int)inv.Value.CurrentPermissions; 8198 return (int)inv.Value.GroupPermissions;
8144 case 2: 8199 case 3:
8145 return (int)inv.Value.GroupPermissions; 8200 return (int)inv.Value.EveryonePermissions;
8146 case 3: 8201 case 4:
8147 return (int)inv.Value.EveryonePermissions; 8202 return (int)inv.Value.NextPermissions;
8148 case 4:
8149 return (int)inv.Value.NextPermissions;
8150 }
8151 } 8203 }
8152 } 8204 }
8153 } 8205 }
8206 m_host.TaskInventory.LockItemsForRead(false);
8154 8207
8155 return -1; 8208 return -1;
8156 } 8209 }
@@ -8165,16 +8218,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8165 { 8218 {
8166 m_host.AddScriptLPS(1); 8219 m_host.AddScriptLPS(1);
8167 8220
8168 lock (m_host.TaskInventory) 8221 m_host.TaskInventory.LockItemsForRead(true);
8222 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8169 { 8223 {
8170 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8224 if (inv.Value.Name == item)
8171 { 8225 {
8172 if (inv.Value.Name == item) 8226 m_host.TaskInventory.LockItemsForRead(false);
8173 { 8227 return inv.Value.CreatorID.ToString();
8174 return inv.Value.CreatorID.ToString();
8175 }
8176 } 8228 }
8177 } 8229 }
8230 m_host.TaskInventory.LockItemsForRead(false);
8178 8231
8179 llSay(0, "No item name '" + item + "'"); 8232 llSay(0, "No item name '" + item + "'");
8180 8233
@@ -8698,16 +8751,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8698 { 8751 {
8699 m_host.AddScriptLPS(1); 8752 m_host.AddScriptLPS(1);
8700 8753
8701 lock (m_host.TaskInventory) 8754 m_host.TaskInventory.LockItemsForRead(true);
8755 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8702 { 8756 {
8703 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8757 if (inv.Value.Name == name)
8704 { 8758 {
8705 if (inv.Value.Name == name) 8759 m_host.TaskInventory.LockItemsForRead(false);
8706 { 8760 return inv.Value.Type;
8707 return inv.Value.Type;
8708 }
8709 } 8761 }
8710 } 8762 }
8763 m_host.TaskInventory.LockItemsForRead(false);
8711 8764
8712 return -1; 8765 return -1;
8713 } 8766 }
@@ -8738,17 +8791,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8738 if (invItemID == UUID.Zero) 8791 if (invItemID == UUID.Zero)
8739 return new LSL_Vector(); 8792 return new LSL_Vector();
8740 8793
8741 lock (m_host.TaskInventory) 8794 m_host.TaskInventory.LockItemsForRead(true);
8795 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8742 { 8796 {
8743 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 8797 m_host.TaskInventory.LockItemsForRead(false);
8744 return new LSL_Vector(); 8798 return new LSL_Vector();
8799 }
8745 8800
8746 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 8801 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8747 { 8802 {
8748 ShoutError("No permissions to track the camera"); 8803 ShoutError("No permissions to track the camera");
8749 return new LSL_Vector(); 8804 m_host.TaskInventory.LockItemsForRead(false);
8750 } 8805 return new LSL_Vector();
8751 } 8806 }
8807 m_host.TaskInventory.LockItemsForRead(false);
8752 8808
8753 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 8809 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8754 if (presence != null) 8810 if (presence != null)
@@ -8766,17 +8822,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8766 if (invItemID == UUID.Zero) 8822 if (invItemID == UUID.Zero)
8767 return new LSL_Rotation(); 8823 return new LSL_Rotation();
8768 8824
8769 lock (m_host.TaskInventory) 8825 m_host.TaskInventory.LockItemsForRead(true);
8826 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8770 { 8827 {
8771 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 8828 m_host.TaskInventory.LockItemsForRead(false);
8772 return new LSL_Rotation(); 8829 return new LSL_Rotation();
8773
8774 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8775 {
8776 ShoutError("No permissions to track the camera");
8777 return new LSL_Rotation();
8778 }
8779 } 8830 }
8831 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8832 {
8833 ShoutError("No permissions to track the camera");
8834 m_host.TaskInventory.LockItemsForRead(false);
8835 return new LSL_Rotation();
8836 }
8837 m_host.TaskInventory.LockItemsForRead(false);
8780 8838
8781 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 8839 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8782 if (presence != null) 8840 if (presence != null)
@@ -8926,14 +8984,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8926 if (objectID == UUID.Zero) return; 8984 if (objectID == UUID.Zero) return;
8927 8985
8928 UUID agentID; 8986 UUID agentID;
8929 lock (m_host.TaskInventory) 8987 m_host.TaskInventory.LockItemsForRead(true);
8930 { 8988 // we need the permission first, to know which avatar we want to set the camera for
8931 // we need the permission first, to know which avatar we want to set the camera for 8989 agentID = m_host.TaskInventory[invItemID].PermsGranter;
8932 agentID = m_host.TaskInventory[invItemID].PermsGranter;
8933 8990
8934 if (agentID == UUID.Zero) return; 8991 if (agentID == UUID.Zero)
8935 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; 8992 {
8993 m_host.TaskInventory.LockItemsForRead(false);
8994 return;
8995 }
8996 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
8997 {
8998 m_host.TaskInventory.LockItemsForRead(false);
8999 return;
8936 } 9000 }
9001 m_host.TaskInventory.LockItemsForRead(false);
8937 9002
8938 ScenePresence presence = World.GetScenePresence(agentID); 9003 ScenePresence presence = World.GetScenePresence(agentID);
8939 9004
@@ -8983,12 +9048,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8983 9048
8984 // we need the permission first, to know which avatar we want to clear the camera for 9049 // we need the permission first, to know which avatar we want to clear the camera for
8985 UUID agentID; 9050 UUID agentID;
8986 lock (m_host.TaskInventory) 9051 m_host.TaskInventory.LockItemsForRead(true);
9052 agentID = m_host.TaskInventory[invItemID].PermsGranter;
9053 if (agentID == UUID.Zero)
8987 { 9054 {
8988 agentID = m_host.TaskInventory[invItemID].PermsGranter; 9055 m_host.TaskInventory.LockItemsForRead(false);
8989 if (agentID == UUID.Zero) return; 9056 return;
8990 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return;
8991 } 9057 }
9058 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
9059 {
9060 m_host.TaskInventory.LockItemsForRead(false);
9061 return;
9062 }
9063 m_host.TaskInventory.LockItemsForRead(false);
8992 9064
8993 ScenePresence presence = World.GetScenePresence(agentID); 9065 ScenePresence presence = World.GetScenePresence(agentID);
8994 9066
@@ -9445,15 +9517,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9445 9517
9446 internal UUID ScriptByName(string name) 9518 internal UUID ScriptByName(string name)
9447 { 9519 {
9448 lock (m_host.TaskInventory) 9520 m_host.TaskInventory.LockItemsForRead(true);
9521
9522 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
9449 { 9523 {
9450 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 9524 if (item.Type == 10 && item.Name == name)
9451 { 9525 {
9452 if (item.Type == 10 && item.Name == name) 9526 m_host.TaskInventory.LockItemsForRead(false);
9453 return item.ItemID; 9527 return item.ItemID;
9454 } 9528 }
9455 } 9529 }
9456 9530
9531 m_host.TaskInventory.LockItemsForRead(false);
9532
9457 return UUID.Zero; 9533 return UUID.Zero;
9458 } 9534 }
9459 9535
@@ -9494,6 +9570,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9494 { 9570 {
9495 m_host.AddScriptLPS(1); 9571 m_host.AddScriptLPS(1);
9496 9572
9573 //Clone is thread safe
9497 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 9574 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9498 9575
9499 UUID assetID = UUID.Zero; 9576 UUID assetID = UUID.Zero;
@@ -9556,6 +9633,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9556 { 9633 {
9557 m_host.AddScriptLPS(1); 9634 m_host.AddScriptLPS(1);
9558 9635
9636 //Clone is thread safe
9559 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 9637 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9560 9638
9561 UUID assetID = UUID.Zero; 9639 UUID assetID = UUID.Zero;