diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 536 |
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 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Diagnostics; //for [DebuggerNonUserCode] | ||
31 | using System.Runtime.Remoting.Lifetime; | 32 | using System.Runtime.Remoting.Lifetime; |
32 | using System.Text; | 33 | using System.Text; |
33 | using System.Threading; | 34 | using 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; |