diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs | 150 |
1 files changed, 74 insertions, 76 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index c8a8f95..0215cec 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs | |||
@@ -41,12 +41,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
41 | { | 41 | { |
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
43 | 43 | ||
44 | private readonly string m_inventoryFileName = String.Empty; | 44 | private string m_inventoryFileName = String.Empty; |
45 | |||
46 | /// <summary> | ||
47 | /// Tracks whether inventory has changed since the last persistent backup | ||
48 | /// </summary> | ||
49 | private bool HasInventoryChanged; | ||
50 | 45 | ||
51 | /// <summary> | 46 | /// <summary> |
52 | /// The inventory folder for this prim | 47 | /// The inventory folder for this prim |
@@ -54,17 +49,6 @@ namespace OpenSim.Region.Environment.Scenes | |||
54 | private LLUUID m_folderID = LLUUID.Zero; | 49 | private LLUUID m_folderID = LLUUID.Zero; |
55 | 50 | ||
56 | /// <summary> | 51 | /// <summary> |
57 | /// Serial count for inventory file , used to tell if inventory has changed | ||
58 | /// no need for this to be part of Database backup | ||
59 | /// </summary> | ||
60 | protected uint m_inventorySerial; | ||
61 | |||
62 | /// <summary> | ||
63 | /// Holds in memory prim inventory | ||
64 | /// </summary> | ||
65 | protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary(); | ||
66 | |||
67 | /// <summary> | ||
68 | /// Exposing this is not particularly good, but it's one of the least evils at the moment to see | 52 | /// Exposing this is not particularly good, but it's one of the least evils at the moment to see |
69 | /// folder id from prim inventory item data, since it's not (yet) actually stored with the prim. | 53 | /// folder id from prim inventory item data, since it's not (yet) actually stored with the prim. |
70 | /// </summary> | 54 | /// </summary> |
@@ -74,12 +58,23 @@ namespace OpenSim.Region.Environment.Scenes | |||
74 | set { m_folderID = value; } | 58 | set { m_folderID = value; } |
75 | } | 59 | } |
76 | 60 | ||
61 | /// <summary> | ||
62 | /// Serial count for inventory file , used to tell if inventory has changed | ||
63 | /// no need for this to be part of Database backup | ||
64 | /// </summary> | ||
65 | protected uint m_inventorySerial = 0; | ||
66 | |||
77 | public uint InventorySerial | 67 | public uint InventorySerial |
78 | { | 68 | { |
79 | get { return m_inventorySerial; } | 69 | get { return m_inventorySerial; } |
80 | set { m_inventorySerial = value; } | 70 | set { m_inventorySerial = value; } |
81 | } | 71 | } |
82 | 72 | ||
73 | /// <summary> | ||
74 | /// Holds in memory prim inventory | ||
75 | /// </summary> | ||
76 | protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary(); | ||
77 | |||
83 | public TaskInventoryDictionary TaskInventory | 78 | public TaskInventoryDictionary TaskInventory |
84 | { | 79 | { |
85 | get { return m_taskInventory; } | 80 | get { return m_taskInventory; } |
@@ -87,6 +82,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
87 | } | 82 | } |
88 | 83 | ||
89 | /// <summary> | 84 | /// <summary> |
85 | /// Tracks whether inventory has changed since the last persistent backup | ||
86 | /// </summary> | ||
87 | private bool HasInventoryChanged; | ||
88 | |||
89 | /// <summary> | ||
90 | /// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating | 90 | /// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating |
91 | /// new ones or setting existing UUIDs to the correct parent UUIDs. | 91 | /// new ones or setting existing UUIDs to the correct parent UUIDs. |
92 | /// | 92 | /// |
@@ -96,14 +96,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
96 | public void ResetInventoryIDs() | 96 | public void ResetInventoryIDs() |
97 | { | 97 | { |
98 | lock (TaskInventory) | 98 | lock (TaskInventory) |
99 | { | 99 | { |
100 | if (0 == TaskInventory.Count) | 100 | if (0 == TaskInventory.Count) |
101 | { | 101 | { |
102 | return; | 102 | return; |
103 | } | 103 | } |
104 | 104 | ||
105 | HasInventoryChanged = true; | 105 | HasInventoryChanged = true; |
106 | 106 | ||
107 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values); | 107 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values); |
108 | TaskInventory.Clear(); | 108 | TaskInventory.Clear(); |
109 | 109 | ||
@@ -132,9 +132,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
132 | if (ownerId != item.OwnerID) | 132 | if (ownerId != item.OwnerID) |
133 | { | 133 | { |
134 | item.LastOwnerID = item.OwnerID; | 134 | item.LastOwnerID = item.OwnerID; |
135 | item.OwnerID = ownerId; | 135 | item.OwnerID = ownerId; |
136 | item.BaseMask = item.NextOwnerMask & (uint) PermissionMask.All; | 136 | item.BaseMask = item.NextOwnerMask & (uint)PermissionMask.All; |
137 | item.OwnerMask = item.NextOwnerMask & (uint) PermissionMask.All; | 137 | item.OwnerMask = item.NextOwnerMask & (uint)PermissionMask.All; |
138 | } | 138 | } |
139 | } | 139 | } |
140 | } | 140 | } |
@@ -194,22 +194,22 @@ namespace OpenSim.Region.Environment.Scenes | |||
194 | AssetCache cache = m_parentGroup.Scene.AssetCache; | 194 | AssetCache cache = m_parentGroup.Scene.AssetCache; |
195 | 195 | ||
196 | cache.GetAsset(item.AssetID, delegate(LLUUID assetID, AssetBase asset) | 196 | cache.GetAsset(item.AssetID, delegate(LLUUID assetID, AssetBase asset) |
197 | { | 197 | { |
198 | if (null == asset) | 198 | if (null == asset) |
199 | { | 199 | { |
200 | m_log.ErrorFormat( | 200 | m_log.ErrorFormat( |
201 | "[PRIMINVENTORY]: " + | 201 | "[PRIMINVENTORY]: " + |
202 | "Couldn't start script {0}, {1} since asset ID {2} could not be found", | 202 | "Couldn't start script {0}, {1} since asset ID {2} could not be found", |
203 | item.Name, item.ItemID, item.AssetID); | 203 | item.Name, item.ItemID, item.AssetID); |
204 | } | 204 | } |
205 | else | 205 | else |
206 | { | 206 | { |
207 | string script = Helpers.FieldToUTF8String(asset.Data); | 207 | string script = Helpers.FieldToUTF8String(asset.Data); |
208 | m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script); | 208 | m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId,item.ItemID,script); |
209 | m_parentGroup.AddActiveScriptCount(1); | 209 | m_parentGroup.AddActiveScriptCount(1); |
210 | ScheduleFullUpdate(); | 210 | ScheduleFullUpdate(); |
211 | } | 211 | } |
212 | }, false); | 212 | }, false); |
213 | } | 213 | } |
214 | } | 214 | } |
215 | 215 | ||
@@ -226,6 +226,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
226 | if (m_taskInventory.ContainsKey(itemId)) | 226 | if (m_taskInventory.ContainsKey(itemId)) |
227 | { | 227 | { |
228 | StartScript(m_taskInventory[itemId]); | 228 | StartScript(m_taskInventory[itemId]); |
229 | |||
229 | } | 230 | } |
230 | else | 231 | else |
231 | { | 232 | { |
@@ -262,7 +263,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
262 | { | 263 | { |
263 | foreach (TaskInventoryItem item in m_taskInventory.Values) | 264 | foreach (TaskInventoryItem item in m_taskInventory.Values) |
264 | { | 265 | { |
265 | if (item.Name == name) | 266 | if(item.Name == name) |
266 | return true; | 267 | return true; |
267 | } | 268 | } |
268 | return false; | 269 | return false; |
@@ -270,14 +271,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
270 | 271 | ||
271 | private string FindAvailableInventoryName(string name) | 272 | private string FindAvailableInventoryName(string name) |
272 | { | 273 | { |
273 | if (!InventoryContainsName(name)) | 274 | if(!InventoryContainsName(name)) |
274 | return name; | 275 | return name; |
275 | 276 | ||
276 | int suffix = 1; | 277 | int suffix=1; |
277 | while (suffix < 256) | 278 | while(suffix < 256) |
278 | { | 279 | { |
279 | string tryName = String.Format("{0} {1}", name, suffix); | 280 | string tryName=String.Format("{0} {1}", name, suffix); |
280 | if (!InventoryContainsName(tryName)) | 281 | if(!InventoryContainsName(tryName)) |
281 | return tryName; | 282 | return tryName; |
282 | suffix++; | 283 | suffix++; |
283 | } | 284 | } |
@@ -294,11 +295,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
294 | item.CreationDate = 1000; | 295 | item.CreationDate = 1000; |
295 | item.ParentPartID = UUID; | 296 | item.ParentPartID = UUID; |
296 | 297 | ||
297 | string name = FindAvailableInventoryName(item.Name); | 298 | string name=FindAvailableInventoryName(item.Name); |
298 | if (name == String.Empty) | 299 | if(name == String.Empty) |
299 | return; | 300 | return; |
300 | 301 | ||
301 | item.Name = name; | 302 | item.Name=name; |
302 | 303 | ||
303 | lock (m_taskInventory) | 304 | lock (m_taskInventory) |
304 | { | 305 | { |
@@ -346,7 +347,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
346 | // m_log.DebugFormat( | 347 | // m_log.DebugFormat( |
347 | // "[PRIM INVENTORY]: Retrieved task inventory item {0}, {1} from prim {2}, {3}", | 348 | // "[PRIM INVENTORY]: Retrieved task inventory item {0}, {1} from prim {2}, {3}", |
348 | // m_taskInventory[itemID].Name, itemID, Name, UUID); | 349 | // m_taskInventory[itemID].Name, itemID, Name, UUID); |
349 | 350 | ||
350 | return m_taskInventory[itemID]; | 351 | return m_taskInventory[itemID]; |
351 | } | 352 | } |
352 | else | 353 | else |
@@ -427,6 +428,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
427 | scriptcount++; | 428 | scriptcount++; |
428 | } | 429 | } |
429 | } | 430 | } |
431 | |||
430 | } | 432 | } |
431 | if (scriptcount <= 0) | 433 | if (scriptcount <= 0) |
432 | { | 434 | { |
@@ -455,14 +457,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
455 | /// <param name="client"></param> | 457 | /// <param name="client"></param> |
456 | /// <param name="localID"></param> | 458 | /// <param name="localID"></param> |
457 | public bool GetInventoryFileName(IClientAPI client, uint localID) | 459 | public bool GetInventoryFileName(IClientAPI client, uint localID) |
458 | { | 460 | { |
459 | // m_log.DebugFormat( | 461 | // m_log.DebugFormat( |
460 | // "[PRIM INVENTORY]: Received request from client {0} for inventory file name of {1}, {2}", | 462 | // "[PRIM INVENTORY]: Received request from client {0} for inventory file name of {1}, {2}", |
461 | // client.AgentId, Name, UUID); | 463 | // client.AgentId, Name, UUID); |
462 | 464 | ||
463 | if (m_inventorySerial > 0) | 465 | if (m_inventorySerial > 0) |
464 | { | 466 | { |
465 | client.SendTaskInventory(m_uuid, (short) m_inventorySerial, | 467 | client.SendTaskInventory(m_uuid, (short)m_inventorySerial, |
466 | Helpers.StringToField(m_inventoryFileName)); | 468 | Helpers.StringToField(m_inventoryFileName)); |
467 | return true; | 469 | return true; |
468 | } | 470 | } |
@@ -478,9 +480,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
478 | /// </summary> | 480 | /// </summary> |
479 | /// <param name="xferManager"></param> | 481 | /// <param name="xferManager"></param> |
480 | public void RequestInventoryFile(IXfer xferManager) | 482 | public void RequestInventoryFile(IXfer xferManager) |
481 | { | 483 | { |
482 | byte[] fileData = new byte[0]; | 484 | byte[] fileData = new byte[0]; |
483 | 485 | ||
484 | // Confusingly, the folder item has to be the object id, while the 'parent id' has to be zero. This matches | 486 | // Confusingly, the folder item has to be the object id, while the 'parent id' has to be zero. This matches |
485 | // what appears to happen in the Second Life protocol. If this isn't the case. then various functionality | 487 | // what appears to happen in the Second Life protocol. If this isn't the case. then various functionality |
486 | // isn't available (such as drag from prim inventory to agent inventory) | 488 | // isn't available (such as drag from prim inventory to agent inventory) |
@@ -491,53 +493,53 @@ namespace OpenSim.Region.Environment.Scenes | |||
491 | foreach (TaskInventoryItem item in m_taskInventory.Values) | 493 | foreach (TaskInventoryItem item in m_taskInventory.Values) |
492 | { | 494 | { |
493 | invString.AddItemStart(); | 495 | invString.AddItemStart(); |
494 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); | 496 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); |
495 | invString.AddNameValueLine("parent_id", m_folderID.ToString()); | 497 | invString.AddNameValueLine("parent_id", m_folderID.ToString()); |
496 | 498 | ||
497 | invString.AddPermissionsStart(); | 499 | invString.AddPermissionsStart(); |
498 | 500 | ||
499 | // FIXME: Temporary until permissions are properly sorted. | 501 | // FIXME: Temporary until permissions are properly sorted. |
500 | invString.AddNameValueLine("base_mask", "7fffffff"); | 502 | invString.AddNameValueLine("base_mask", "7fffffff"); |
501 | invString.AddNameValueLine("owner_mask", "7fffffff"); | 503 | invString.AddNameValueLine("owner_mask", "7fffffff"); |
502 | invString.AddNameValueLine("group_mask", "7fffffff"); | 504 | invString.AddNameValueLine("group_mask", "7fffffff"); |
503 | invString.AddNameValueLine("everyone_mask", "7fffffff"); | 505 | invString.AddNameValueLine("everyone_mask", "7fffffff"); |
504 | invString.AddNameValueLine("next_owner_mask", "7fffffff"); | 506 | invString.AddNameValueLine("next_owner_mask", "7fffffff"); |
505 | 507 | ||
506 | // invString.AddNameValueLine("group_mask", "00000000"); | 508 | // invString.AddNameValueLine("group_mask", "00000000"); |
507 | // invString.AddNameValueLine("everyone_mask", "00000000"); | 509 | // invString.AddNameValueLine("everyone_mask", "00000000"); |
508 | // invString.AddNameValueLine("next_owner_mask", "00086000"); | 510 | // invString.AddNameValueLine("next_owner_mask", "00086000"); |
509 | 511 | ||
510 | // invString.AddNameValueLine("base_mask", Helpers.UIntToHexString(item.BaseMask)); | 512 | // invString.AddNameValueLine("base_mask", Helpers.UIntToHexString(item.BaseMask)); |
511 | // invString.AddNameValueLine("owner_mask", Helpers.UIntToHexString(item.OwnerMask)); | 513 | // invString.AddNameValueLine("owner_mask", Helpers.UIntToHexString(item.OwnerMask)); |
512 | // invString.AddNameValueLine("group_mask", Helpers.UIntToHexString(item.GroupMask)); | 514 | // invString.AddNameValueLine("group_mask", Helpers.UIntToHexString(item.GroupMask)); |
513 | // invString.AddNameValueLine("everyone_mask", Helpers.UIntToHexString(item.EveryoneMask)); | 515 | // invString.AddNameValueLine("everyone_mask", Helpers.UIntToHexString(item.EveryoneMask)); |
514 | // invString.AddNameValueLine("next_owner_mask", Helpers.UIntToHexString(item.NextOwnerMask)); | 516 | // invString.AddNameValueLine("next_owner_mask", Helpers.UIntToHexString(item.NextOwnerMask)); |
515 | 517 | ||
516 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); | 518 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); |
517 | invString.AddNameValueLine("owner_id", item.OwnerID.ToString()); | 519 | invString.AddNameValueLine("owner_id", item.OwnerID.ToString()); |
518 | 520 | ||
519 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); | 521 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); |
520 | // invString.AddNameValueLine("last_owner_id", item.OwnerID.ToString()); | 522 | // invString.AddNameValueLine("last_owner_id", item.OwnerID.ToString()); |
521 | 523 | ||
522 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); | 524 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); |
523 | invString.AddSectionEnd(); | 525 | invString.AddSectionEnd(); |
524 | 526 | ||
525 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); | 527 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); |
526 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); | 528 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); |
527 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); | 529 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); |
528 | invString.AddNameValueLine("flags", "00000000"); | 530 | invString.AddNameValueLine("flags", "00000000"); |
529 | 531 | ||
530 | invString.AddSaleStart(); | 532 | invString.AddSaleStart(); |
531 | invString.AddNameValueLine("sale_type", "not"); | 533 | invString.AddNameValueLine("sale_type", "not"); |
532 | invString.AddNameValueLine("sale_price", "0"); | 534 | invString.AddNameValueLine("sale_price", "0"); |
533 | invString.AddSectionEnd(); | 535 | invString.AddSectionEnd(); |
534 | 536 | ||
535 | invString.AddNameValueLine("name", item.Name + "|"); | 537 | invString.AddNameValueLine("name", item.Name + "|"); |
536 | invString.AddNameValueLine("desc", item.Description + "|"); | 538 | invString.AddNameValueLine("desc", item.Description + "|"); |
537 | 539 | ||
538 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); | 540 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); |
539 | // invString.AddNameValueLine("creation_date", "1209151453"); | 541 | // invString.AddNameValueLine("creation_date", "1209151453"); |
540 | 542 | ||
541 | invString.AddSectionEnd(); | 543 | invString.AddSectionEnd(); |
542 | } | 544 | } |
543 | } | 545 | } |
@@ -569,8 +571,6 @@ namespace OpenSim.Region.Environment.Scenes | |||
569 | } | 571 | } |
570 | } | 572 | } |
571 | 573 | ||
572 | #region Nested type: InventoryStringBuilder | ||
573 | |||
574 | public class InventoryStringBuilder | 574 | public class InventoryStringBuilder |
575 | { | 575 | { |
576 | public string BuildString = String.Empty; | 576 | public string BuildString = String.Empty; |
@@ -596,13 +596,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
596 | BuildString += "\tpermissions 0\n"; | 596 | BuildString += "\tpermissions 0\n"; |
597 | AddSectionStart(); | 597 | AddSectionStart(); |
598 | } | 598 | } |
599 | 599 | ||
600 | public void AddSaleStart() | 600 | public void AddSaleStart() |
601 | { | 601 | { |
602 | BuildString += "\tsale_info\t0\n"; | 602 | BuildString += "\tsale_info\t0\n"; |
603 | AddSectionStart(); | 603 | AddSectionStart(); |
604 | } | 604 | } |
605 | 605 | ||
606 | protected void AddSectionStart() | 606 | protected void AddSectionStart() |
607 | { | 607 | { |
608 | BuildString += "\t{\n"; | 608 | BuildString += "\t{\n"; |
@@ -629,7 +629,5 @@ namespace OpenSim.Region.Environment.Scenes | |||
629 | { | 629 | { |
630 | } | 630 | } |
631 | } | 631 | } |
632 | |||
633 | #endregion | ||
634 | } | 632 | } |
635 | } \ No newline at end of file | 633 | } |