diff options
author | Diva Canto | 2009-08-12 20:39:48 -0700 |
---|---|---|
committer | Diva Canto | 2009-08-12 20:39:48 -0700 |
commit | 7aa54593e0b6672979feec97b8151ed134388723 (patch) | |
tree | eaa145993ba39c61f6cbfcd202deb50fbd125fe6 /OpenSim | |
parent | * Added two new packet handler implementations for inventory ops. This is sta... (diff) | |
download | opensim-SC_OLD-7aa54593e0b6672979feec97b8151ed134388723.zip opensim-SC_OLD-7aa54593e0b6672979feec97b8151ed134388723.tar.gz opensim-SC_OLD-7aa54593e0b6672979feec97b8151ed134388723.tar.bz2 opensim-SC_OLD-7aa54593e0b6672979feec97b8151ed134388723.tar.xz |
Redirected all calls to CachedUserProfile methods to the inventory service. Redirection of the RootFolder property is still todo. This compiles but probably inventory will be inconsistent.
Diffstat (limited to 'OpenSim')
11 files changed, 580 insertions, 859 deletions
diff --git a/OpenSim/Framework/InventoryItemBase.cs b/OpenSim/Framework/InventoryItemBase.cs index 4307fe2..b5bf92f 100644 --- a/OpenSim/Framework/InventoryItemBase.cs +++ b/OpenSim/Framework/InventoryItemBase.cs | |||
@@ -354,7 +354,16 @@ namespace OpenSim.Framework | |||
354 | } | 354 | } |
355 | } | 355 | } |
356 | protected int m_creationDate = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; | 356 | protected int m_creationDate = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; |
357 | 357 | ||
358 | public InventoryItemBase() | ||
359 | { | ||
360 | } | ||
361 | |||
362 | public InventoryItemBase(UUID id) | ||
363 | { | ||
364 | ID = id; | ||
365 | } | ||
366 | |||
358 | public object Clone() | 367 | public object Clone() |
359 | { | 368 | { |
360 | return MemberwiseClone(); | 369 | return MemberwiseClone(); |
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index 8d586c4..c9ee54f 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs | |||
@@ -192,40 +192,29 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
192 | { | 192 | { |
193 | if (XferUploaders.ContainsKey(transactionID)) | 193 | if (XferUploaders.ContainsKey(transactionID)) |
194 | { | 194 | { |
195 | CachedUserInfo userInfo = Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( | 195 | UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId); |
196 | remoteClient.AgentId); | ||
197 | 196 | ||
198 | if (userInfo != null) | 197 | AssetBase asset = Manager.MyScene.AssetService.Get(assetID.ToString()); |
199 | { | ||
200 | UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId); | ||
201 | |||
202 | AssetBase asset = Manager.MyScene.AssetService.Get(assetID.ToString()); | ||
203 | |||
204 | if (asset == null) | ||
205 | { | ||
206 | asset = GetTransactionAsset(transactionID); | ||
207 | } | ||
208 | |||
209 | if (asset != null && asset.FullID == assetID) | ||
210 | { | ||
211 | // Assets never get updated, new ones get created | ||
212 | asset.FullID = UUID.Random(); | ||
213 | asset.Name = item.Name; | ||
214 | asset.Description = item.Description; | ||
215 | asset.Type = (sbyte)item.AssetType; | ||
216 | item.AssetID = asset.FullID; | ||
217 | |||
218 | Manager.MyScene.AssetService.Store(asset); | ||
219 | } | ||
220 | 198 | ||
221 | userInfo.UpdateItem(item); | 199 | if (asset == null) |
200 | { | ||
201 | asset = GetTransactionAsset(transactionID); | ||
222 | } | 202 | } |
223 | else | 203 | |
204 | if (asset != null && asset.FullID == assetID) | ||
224 | { | 205 | { |
225 | m_log.ErrorFormat( | 206 | // Assets never get updated, new ones get created |
226 | "[ASSET TRANSACTIONS]: Could not find user {0} for inventory item update", | 207 | asset.FullID = UUID.Random(); |
227 | remoteClient.AgentId); | 208 | asset.Name = item.Name; |
209 | asset.Description = item.Description; | ||
210 | asset.Type = (sbyte)item.AssetType; | ||
211 | item.AssetID = asset.FullID; | ||
212 | |||
213 | Manager.MyScene.AssetService.Store(asset); | ||
228 | } | 214 | } |
215 | |||
216 | IInventoryService invService = Manager.MyScene.InventoryService; | ||
217 | invService.UpdateItem(item); | ||
229 | } | 218 | } |
230 | } | 219 | } |
231 | } | 220 | } |
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs index afd9f5a..e192b81 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs | |||
@@ -32,6 +32,7 @@ using log4net; | |||
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications.Cache; | 34 | using OpenSim.Framework.Communications.Cache; |
35 | using OpenSim.Services.Interfaces; | ||
35 | 36 | ||
36 | namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | 37 | namespace OpenSim.Region.CoreModules.Agent.AssetTransaction |
37 | { | 38 | { |
@@ -214,39 +215,31 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
214 | private void DoCreateItem(uint callbackID) | 215 | private void DoCreateItem(uint callbackID) |
215 | { | 216 | { |
216 | m_userTransactions.Manager.MyScene.AssetService.Store(m_asset); | 217 | m_userTransactions.Manager.MyScene.AssetService.Store(m_asset); |
217 | CachedUserInfo userInfo = | ||
218 | m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails( | ||
219 | ourClient.AgentId); | ||
220 | 218 | ||
221 | if (userInfo != null) | 219 | IInventoryService invService = m_userTransactions.Manager.MyScene.InventoryService; |
222 | { | 220 | |
223 | InventoryItemBase item = new InventoryItemBase(); | 221 | InventoryItemBase item = new InventoryItemBase(); |
224 | item.Owner = ourClient.AgentId; | 222 | item.Owner = ourClient.AgentId; |
225 | item.CreatorId = ourClient.AgentId.ToString(); | 223 | item.CreatorId = ourClient.AgentId.ToString(); |
226 | item.ID = UUID.Random(); | 224 | item.ID = UUID.Random(); |
227 | item.AssetID = m_asset.FullID; | 225 | item.AssetID = m_asset.FullID; |
228 | item.Description = m_description; | 226 | item.Description = m_description; |
229 | item.Name = m_name; | 227 | item.Name = m_name; |
230 | item.AssetType = type; | 228 | item.AssetType = type; |
231 | item.InvType = invType; | 229 | item.InvType = invType; |
232 | item.Folder = InventFolder; | 230 | item.Folder = InventFolder; |
233 | item.BasePermissions = 0x7fffffff; | 231 | item.BasePermissions = 0x7fffffff; |
234 | item.CurrentPermissions = 0x7fffffff; | 232 | item.CurrentPermissions = 0x7fffffff; |
235 | item.GroupPermissions=0; | 233 | item.GroupPermissions=0; |
236 | item.EveryOnePermissions=0; | 234 | item.EveryOnePermissions=0; |
237 | item.NextPermissions = nextPerm; | 235 | item.NextPermissions = nextPerm; |
238 | item.Flags = (uint) wearableType; | 236 | item.Flags = (uint) wearableType; |
239 | item.CreationDate = Util.UnixTimeSinceEpoch(); | 237 | item.CreationDate = Util.UnixTimeSinceEpoch(); |
240 | 238 | ||
241 | userInfo.AddItem(item); | 239 | if (invService.AddItem(item)) |
242 | ourClient.SendInventoryItemCreateUpdate(item, callbackID); | 240 | ourClient.SendInventoryItemCreateUpdate(item, callbackID); |
243 | } | ||
244 | else | 241 | else |
245 | { | 242 | ourClient.SendAlertMessage("Unable to create inventory item"); |
246 | m_log.ErrorFormat( | ||
247 | "[ASSET TRANSACTIONS]: Could not find user {0} for inventory item creation", | ||
248 | ourClient.AgentId); | ||
249 | } | ||
250 | } | 243 | } |
251 | 244 | ||
252 | /// <summary> | 245 | /// <summary> |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index b6250a2..49b2b5c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | |||
@@ -39,6 +39,7 @@ using OpenSim.Framework.Communications; | |||
39 | using OpenSim.Framework.Communications.Cache; | 39 | using OpenSim.Framework.Communications.Cache; |
40 | using OpenSim.Region.Framework.Interfaces; | 40 | using OpenSim.Region.Framework.Interfaces; |
41 | using OpenSim.Region.Framework.Scenes; | 41 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Services.Interfaces; | ||
42 | 43 | ||
43 | namespace OpenSim.Region.CoreModules.Avatar.Friends | 44 | namespace OpenSim.Region.CoreModules.Avatar.Friends |
44 | { | 45 | { |
@@ -654,8 +655,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
654 | initiator.ControllingClient.SendAgentOnline(new UUID[] { fromAgentID }); | 655 | initiator.ControllingClient.SendAgentOnline(new UUID[] { fromAgentID }); |
655 | 656 | ||
656 | // find the folder for the friend... | 657 | // find the folder for the friend... |
657 | InventoryFolderImpl folder = | 658 | //InventoryFolderImpl folder = |
658 | initiator.Scene.CommsManager.UserProfileCacheService.GetUserDetails(toAgentID).FindFolderForType((int)InventoryType.CallingCard); | 659 | // initiator.Scene.CommsManager.UserProfileCacheService.GetUserDetails(toAgentID).FindFolderForType((int)InventoryType.CallingCard); |
660 | IInventoryService invService = initiator.Scene.InventoryService; | ||
661 | InventoryFolderBase folder = invService.GetFolderForType(toAgentID, AssetType.CallingCard); | ||
659 | if (folder != null) | 662 | if (folder != null) |
660 | { | 663 | { |
661 | // ... and add the calling card | 664 | // ... and add the calling card |
diff --git a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs index 102feaf..e61648c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs | |||
@@ -33,6 +33,7 @@ using OpenSim.Framework; | |||
33 | using OpenSim.Framework.Communications.Cache; | 33 | using OpenSim.Framework.Communications.Cache; |
34 | using OpenSim.Region.Framework.Interfaces; | 34 | using OpenSim.Region.Framework.Interfaces; |
35 | using OpenSim.Region.Framework.Scenes; | 35 | using OpenSim.Region.Framework.Scenes; |
36 | using OpenSim.Services.Interfaces; | ||
36 | 37 | ||
37 | namespace OpenSim.Region.CoreModules.Avatar.Gestures | 38 | namespace OpenSim.Region.CoreModules.Avatar.Gestures |
38 | { | 39 | { |
@@ -62,42 +63,32 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures | |||
62 | 63 | ||
63 | public virtual void ActivateGesture(IClientAPI client, UUID assetId, UUID gestureId) | 64 | public virtual void ActivateGesture(IClientAPI client, UUID assetId, UUID gestureId) |
64 | { | 65 | { |
65 | CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId); | 66 | IInventoryService invService = m_scene.InventoryService; |
66 | 67 | ||
67 | if (userInfo != null) | 68 | InventoryItemBase item = invService.QueryItem(new InventoryItemBase(gestureId)); |
69 | if (item != null) | ||
68 | { | 70 | { |
69 | InventoryItemBase item = userInfo.RootFolder.FindItem(gestureId); | 71 | item.Flags = 1; |
70 | if (item != null) | 72 | invService.UpdateItem(item); |
71 | { | ||
72 | item.Flags = 1; | ||
73 | userInfo.UpdateItem(item); | ||
74 | } | ||
75 | else | ||
76 | m_log.ErrorFormat( | ||
77 | "[GESTURES]: Unable to find gesture to activate {0} for {1}", gestureId, client.Name); | ||
78 | } | 73 | } |
79 | else | 74 | else |
80 | m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name); | 75 | m_log.WarnFormat( |
76 | "[GESTURES]: Unable to find gesture {0} to activate for {1}", gestureId, client.Name); | ||
81 | } | 77 | } |
82 | 78 | ||
83 | public virtual void DeactivateGesture(IClientAPI client, UUID gestureId) | 79 | public virtual void DeactivateGesture(IClientAPI client, UUID gestureId) |
84 | { | 80 | { |
85 | CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId); | 81 | IInventoryService invService = m_scene.InventoryService; |
86 | 82 | ||
87 | if (userInfo != null) | 83 | InventoryItemBase item = invService.QueryItem(new InventoryItemBase(gestureId)); |
84 | if (item != null) | ||
88 | { | 85 | { |
89 | InventoryItemBase item = userInfo.RootFolder.FindItem(gestureId); | 86 | item.Flags = 0; |
90 | if (item != null) | 87 | invService.UpdateItem(item); |
91 | { | ||
92 | item.Flags = 0; | ||
93 | userInfo.UpdateItem(item); | ||
94 | } | ||
95 | else | ||
96 | m_log.ErrorFormat( | ||
97 | "[GESTURES]: Unable to find gesture to deactivate {0} for {1}", gestureId, client.Name); | ||
98 | } | 88 | } |
99 | else | 89 | else |
100 | m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name); | 90 | m_log.ErrorFormat( |
91 | "[GESTURES]: Unable to find gesture to deactivate {0} for {1}", gestureId, client.Name); | ||
101 | } | 92 | } |
102 | } | 93 | } |
103 | } \ No newline at end of file | 94 | } \ No newline at end of file |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 811d4cc..b5650fd 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -35,6 +35,7 @@ using OpenSim.Framework; | |||
35 | using OpenSim.Framework.Communications.Cache; | 35 | using OpenSim.Framework.Communications.Cache; |
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
38 | using OpenSim.Services.Interfaces; | ||
38 | 39 | ||
39 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | 40 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer |
40 | { | 41 | { |
@@ -154,7 +155,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
154 | "into agent {1}'s inventory", | 155 | "into agent {1}'s inventory", |
155 | folderID, new UUID(im.toAgentID)); | 156 | folderID, new UUID(im.toAgentID)); |
156 | 157 | ||
157 | InventoryFolderImpl folderCopy | 158 | InventoryFolderBase folderCopy |
158 | = scene.GiveInventoryFolder(new UUID(im.toAgentID), client.AgentId, folderID, UUID.Zero); | 159 | = scene.GiveInventoryFolder(new UUID(im.toAgentID), client.AgentId, folderID, UUID.Zero); |
159 | 160 | ||
160 | if (folderCopy == null) | 161 | if (folderCopy == null) |
@@ -247,52 +248,51 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
247 | // It will have been pushed to the client, too | 248 | // It will have been pushed to the client, too |
248 | // | 249 | // |
249 | 250 | ||
250 | CachedUserInfo userInfo = | 251 | //CachedUserInfo userInfo = |
251 | scene.CommsManager.UserProfileCacheService. | 252 | // scene.CommsManager.UserProfileCacheService. |
252 | GetUserDetails(client.AgentId); | 253 | // GetUserDetails(client.AgentId); |
254 | IInventoryService invService = scene.InventoryService; | ||
253 | 255 | ||
254 | if (userInfo != null) | 256 | InventoryFolderBase trashFolder = |
255 | { | 257 | invService.GetFolderForType(client.AgentId, AssetType.TrashFolder); |
256 | InventoryFolderImpl trashFolder = | 258 | |
257 | userInfo.FindFolderForType((int)AssetType.TrashFolder); | 259 | UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip |
258 | |||
259 | UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip | ||
260 | |||
261 | InventoryItemBase item = userInfo.RootFolder.FindItem(inventoryEntityID); | ||
262 | InventoryFolderBase folder = null; | ||
263 | 260 | ||
264 | if (item != null && trashFolder != null) | 261 | InventoryItemBase item = invService.QueryItem(new InventoryItemBase(inventoryEntityID)); |
265 | { | 262 | InventoryFolderBase folder = null; |
266 | item.Folder = trashFolder.ID; | 263 | |
267 | 264 | if (item != null && trashFolder != null) | |
268 | userInfo.DeleteItem(inventoryEntityID); | 265 | { |
266 | item.Folder = trashFolder.ID; | ||
269 | 267 | ||
270 | scene.AddInventoryItem(client, item); | 268 | // Diva comment: can't we just update this item??? |
271 | } | 269 | invService.DeleteItem(item); |
272 | else | 270 | scene.AddInventoryItem(client, item); |
271 | } | ||
272 | else | ||
273 | { | ||
274 | folder = invService.QueryFolder(new InventoryFolderBase(inventoryEntityID)); | ||
275 | |||
276 | if (folder != null & trashFolder != null) | ||
273 | { | 277 | { |
274 | folder = userInfo.RootFolder.FindFolder(inventoryEntityID); | 278 | folder.ParentID = trashFolder.ID; |
275 | 279 | invService.MoveFolder(folder); | |
276 | if (folder != null & trashFolder != null) | ||
277 | { | ||
278 | userInfo.MoveFolder(inventoryEntityID, trashFolder.ID); | ||
279 | } | ||
280 | } | 280 | } |
281 | } | ||
282 | |||
283 | if ((null == item && null == folder) | null == trashFolder) | ||
284 | { | ||
285 | string reason = String.Empty; | ||
281 | 286 | ||
282 | if ((null == item && null == folder) | null == trashFolder) | 287 | if (trashFolder == null) |
283 | { | 288 | reason += " Trash folder not found."; |
284 | string reason = String.Empty; | 289 | if (item == null) |
285 | 290 | reason += " Item not found."; | |
286 | if (trashFolder == null) | 291 | if (folder == null) |
287 | reason += " Trash folder not found."; | 292 | reason += " Folder not found."; |
288 | if (item == null) | 293 | |
289 | reason += " Item not found."; | 294 | client.SendAgentAlertMessage("Unable to delete "+ |
290 | if (folder == null) | 295 | "received inventory" + reason, false); |
291 | reason += " Folder not found."; | ||
292 | |||
293 | client.SendAgentAlertMessage("Unable to delete "+ | ||
294 | "received inventory" + reason, false); | ||
295 | } | ||
296 | } | 296 | } |
297 | 297 | ||
298 | ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); | 298 | ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); |
@@ -405,17 +405,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
405 | return; | 405 | return; |
406 | } | 406 | } |
407 | 407 | ||
408 | CachedUserInfo userInfo = | 408 | //CachedUserInfo userInfo = |
409 | scene.CommsManager.UserProfileCacheService. | 409 | // scene.CommsManager.UserProfileCacheService. |
410 | GetUserDetails(user.ControllingClient.AgentId); | 410 | // GetUserDetails(user.ControllingClient.AgentId); |
411 | 411 | ||
412 | if (userInfo == null) | 412 | //if (userInfo == null) |
413 | { | 413 | //{ |
414 | m_log.Debug("[INVENTORY TRANSFER] Can't find user info of recipient"); | 414 | // m_log.Debug("[INVENTORY TRANSFER] Can't find user info of recipient"); |
415 | return; | 415 | // return; |
416 | } | 416 | //} |
417 | 417 | ||
418 | AssetType assetType = (AssetType)msg.binaryBucket[0]; | 418 | AssetType assetType = (AssetType)msg.binaryBucket[0]; |
419 | IInventoryService invService = scene.InventoryService; | ||
419 | 420 | ||
420 | if (AssetType.Folder == assetType) | 421 | if (AssetType.Folder == assetType) |
421 | { | 422 | { |
@@ -425,31 +426,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
425 | folder.ID = folderID; | 426 | folder.ID = folderID; |
426 | folder.Owner = user.ControllingClient.AgentId; | 427 | folder.Owner = user.ControllingClient.AgentId; |
427 | 428 | ||
428 | // Fetch from database | 429 | // Fetch from service |
429 | // | 430 | // |
430 | if (!userInfo.QueryFolder(folder)) | 431 | folder = invService.QueryFolder(folder); |
432 | if (folder == null) | ||
431 | { | 433 | { |
432 | m_log.Debug("[INVENTORY TRANSFER] Can't find folder to give"); | 434 | m_log.Debug("[INVENTORY TRANSFER] Can't find folder to give"); |
433 | return; | 435 | return; |
434 | } | 436 | } |
435 | 437 | ||
436 | // Get folder info | 438 | user.ControllingClient.SendBulkUpdateInventory(folder); |
437 | // | ||
438 | InventoryFolderImpl folderInfo = userInfo.RootFolder.FindFolder(folder.ID); | ||
439 | if (folderInfo == null) | ||
440 | { | ||
441 | m_log.Debug("[INVENTORY TRANSFER] Can't retrieve folder to give"); | ||
442 | return; | ||
443 | } | ||
444 | |||
445 | user.ControllingClient.SendBulkUpdateInventory(folderInfo); | ||
446 | 439 | ||
447 | // This unelegant, slow kludge is to reload the folders and | 440 | //// This unelegant, slow kludge is to reload the folders and |
448 | // items. Since a folder give can transfer subfolders and | 441 | //// items. Since a folder give can transfer subfolders and |
449 | // items, this is the easiest way to pull that stuff in | 442 | //// items, this is the easiest way to pull that stuff in |
450 | // | 443 | //// |
451 | userInfo.DropInventory(); | 444 | //userInfo.DropInventory(); |
452 | userInfo.FetchInventory(); | 445 | //userInfo.FetchInventory(); |
453 | 446 | ||
454 | // Deliver message | 447 | // Deliver message |
455 | // | 448 | // |
@@ -463,20 +456,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
463 | item.ID = itemID; | 456 | item.ID = itemID; |
464 | item.Owner = user.ControllingClient.AgentId; | 457 | item.Owner = user.ControllingClient.AgentId; |
465 | 458 | ||
466 | // Fetch from database | 459 | // Fetch from service |
467 | // | ||
468 | if (!userInfo.QueryItem(item)) | ||
469 | { | ||
470 | m_log.Debug("[INVENTORY TRANSFER] Can't find item to give"); | ||
471 | return; | ||
472 | } | ||
473 | |||
474 | // Get item info | ||
475 | // | 460 | // |
476 | item = userInfo.RootFolder.FindItem(item.ID); | 461 | item = invService.QueryItem(item); |
477 | if (item == null) | 462 | if (item == null) |
478 | { | 463 | { |
479 | m_log.Debug("[INVENTORY TRANSFER] Can't retrieve item to give"); | 464 | m_log.Debug("[INVENTORY TRANSFER] Can't find item to give"); |
480 | return; | 465 | return; |
481 | } | 466 | } |
482 | 467 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs index 551a7eb..49c0083 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs | |||
@@ -64,6 +64,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
64 | Dictionary<AssetType, InventoryFolderBase> folders = m_Connector.GetSystemFolders(presence.UUID); | 64 | Dictionary<AssetType, InventoryFolderBase> folders = m_Connector.GetSystemFolders(presence.UUID); |
65 | m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}", | 65 | m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}", |
66 | presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count); | 66 | presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count); |
67 | |||
67 | if (folders.Count > 0) | 68 | if (folders.Count > 0) |
68 | lock (m_InventoryCache) | 69 | lock (m_InventoryCache) |
69 | m_InventoryCache.Add(presence.UUID, folders); | 70 | m_InventoryCache.Add(presence.UUID, folders); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index facd301..80f71b3 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -80,17 +80,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
80 | 80 | ||
81 | public bool AddInventoryItemReturned(UUID AgentId, InventoryItemBase item) | 81 | public bool AddInventoryItemReturned(UUID AgentId, InventoryItemBase item) |
82 | { | 82 | { |
83 | CachedUserInfo userInfo | 83 | if (InventoryService.AddItem(item)) |
84 | = CommsManager.UserProfileCacheService.GetUserDetails(AgentId); | ||
85 | if (userInfo != null) | ||
86 | { | ||
87 | userInfo.AddItem(item); | ||
88 | return true; | 84 | return true; |
89 | } | ||
90 | else | 85 | else |
91 | { | 86 | { |
92 | m_log.ErrorFormat( | 87 | m_log.WarnFormat( |
93 | "[AGENT INVENTORY]: Agent was not found for add of item {1} {2}", item.Name, item.ID); | 88 | "[AGENT INVENTORY]: Unable to add item {1} to agent {2} inventory", item.Name, AgentId); |
94 | 89 | ||
95 | return false; | 90 | return false; |
96 | } | 91 | } |
@@ -98,13 +93,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
98 | 93 | ||
99 | public void AddInventoryItem(UUID AgentID, InventoryItemBase item) | 94 | public void AddInventoryItem(UUID AgentID, InventoryItemBase item) |
100 | { | 95 | { |
101 | CachedUserInfo userInfo | ||
102 | = CommsManager.UserProfileCacheService.GetUserDetails(AgentID); | ||
103 | 96 | ||
104 | if (userInfo != null) | 97 | if (InventoryService.AddItem(item)) |
105 | { | 98 | { |
106 | userInfo.AddItem(item); | ||
107 | |||
108 | int userlevel = 0; | 99 | int userlevel = 0; |
109 | if (Permissions.IsGod(AgentID)) | 100 | if (Permissions.IsGod(AgentID)) |
110 | { | 101 | { |
@@ -120,8 +111,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
120 | } | 111 | } |
121 | else | 112 | else |
122 | { | 113 | { |
123 | m_log.ErrorFormat( | 114 | m_log.WarnFormat( |
124 | "[AGENT INVENTORY]: Agent {1} was not found for add of item {2} {3}", | 115 | "[AGENT INVENTORY]: Agent {1} could not add item {2} {3}", |
125 | AgentID, item.Name, item.ID); | 116 | AgentID, item.Name, item.ID); |
126 | 117 | ||
127 | return; | 118 | return; |
@@ -136,20 +127,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
136 | /// in which the item is to be placed.</param> | 127 | /// in which the item is to be placed.</param> |
137 | public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) | 128 | public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) |
138 | { | 129 | { |
139 | CachedUserInfo userInfo | 130 | AddInventoryItem(remoteClient.AgentId, item); |
140 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 131 | remoteClient.SendInventoryItemCreateUpdate(item, 0); |
141 | |||
142 | if (userInfo != null) | ||
143 | { | ||
144 | AddInventoryItem(remoteClient.AgentId, item); | ||
145 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
146 | } | ||
147 | else | ||
148 | { | ||
149 | m_log.ErrorFormat( | ||
150 | "[AGENT INVENTORY]: Could not resolve user {0} for adding an inventory item", | ||
151 | remoteClient.AgentId); | ||
152 | } | ||
153 | } | 132 | } |
154 | 133 | ||
155 | /// <summary> | 134 | /// <summary> |
@@ -161,47 +140,40 @@ namespace OpenSim.Region.Framework.Scenes | |||
161 | /// <returns></returns> | 140 | /// <returns></returns> |
162 | public virtual UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data) | 141 | public virtual UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data) |
163 | { | 142 | { |
164 | CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 143 | InventoryItemBase item = InventoryService.QueryItem(new InventoryItemBase(itemID)); |
165 | if (userInfo != null) | 144 | |
145 | if (item != null) | ||
166 | { | 146 | { |
167 | if (userInfo.RootFolder != null) | 147 | if ((InventoryType)item.InvType == InventoryType.Notecard) |
168 | { | 148 | { |
169 | InventoryItemBase item = userInfo.RootFolder.FindItem(itemID); | 149 | if (!Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId)) |
170 | |||
171 | if (item != null) | ||
172 | { | 150 | { |
173 | if ((InventoryType)item.InvType == InventoryType.Notecard) | 151 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false); |
174 | { | 152 | return UUID.Zero; |
175 | if (!Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId)) | 153 | } |
176 | { | ||
177 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false); | ||
178 | return UUID.Zero; | ||
179 | } | ||
180 | 154 | ||
181 | remoteClient.SendAgentAlertMessage("Notecard saved", false); | 155 | remoteClient.SendAgentAlertMessage("Notecard saved", false); |
182 | } | 156 | } |
183 | else if ((InventoryType)item.InvType == InventoryType.LSL) | 157 | else if ((InventoryType)item.InvType == InventoryType.LSL) |
184 | { | 158 | { |
185 | if (!Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId)) | 159 | if (!Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId)) |
186 | { | 160 | { |
187 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false); | 161 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false); |
188 | return UUID.Zero; | 162 | return UUID.Zero; |
189 | } | 163 | } |
190 | 164 | ||
191 | remoteClient.SendAgentAlertMessage("Script saved", false); | 165 | remoteClient.SendAgentAlertMessage("Script saved", false); |
192 | } | 166 | } |
193 | 167 | ||
194 | AssetBase asset = | 168 | AssetBase asset = |
195 | CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data); | 169 | CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data); |
196 | item.AssetID = asset.FullID; | 170 | item.AssetID = asset.FullID; |
197 | AssetService.Store(asset); | 171 | AssetService.Store(asset); |
198 | 172 | ||
199 | userInfo.UpdateItem(item); | 173 | InventoryService.UpdateItem(item); |
200 | 174 | ||
201 | // remoteClient.SendInventoryItemCreateUpdate(item); | 175 | // remoteClient.SendInventoryItemCreateUpdate(item); |
202 | return (asset.FullID); | 176 | return (asset.FullID); |
203 | } | ||
204 | } | ||
205 | } | 177 | } |
206 | else | 178 | else |
207 | { | 179 | { |
@@ -343,63 +315,52 @@ namespace OpenSim.Region.Framework.Scenes | |||
343 | public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, | 315 | public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, |
344 | UUID itemID, InventoryItemBase itemUpd) | 316 | UUID itemID, InventoryItemBase itemUpd) |
345 | { | 317 | { |
346 | CachedUserInfo userInfo | 318 | InventoryItemBase item = InventoryService.QueryItem(new InventoryItemBase(itemID)); |
347 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | ||
348 | 319 | ||
349 | if (userInfo != null && userInfo.RootFolder != null) | 320 | if (item != null) |
350 | { | 321 | { |
351 | InventoryItemBase item = userInfo.RootFolder.FindItem(itemID); | 322 | if (UUID.Zero == transactionID) |
352 | |||
353 | if (item != null) | ||
354 | { | 323 | { |
355 | if (UUID.Zero == transactionID) | 324 | item.Name = itemUpd.Name; |
356 | { | 325 | item.Description = itemUpd.Description; |
357 | item.Name = itemUpd.Name; | 326 | item.NextPermissions = itemUpd.NextPermissions; |
358 | item.Description = itemUpd.Description; | 327 | item.CurrentPermissions |= 8; // Slam! |
359 | item.NextPermissions = itemUpd.NextPermissions; | 328 | item.EveryOnePermissions = itemUpd.EveryOnePermissions; |
360 | item.CurrentPermissions |= 8; // Slam! | 329 | item.GroupPermissions = itemUpd.GroupPermissions; |
361 | item.EveryOnePermissions = itemUpd.EveryOnePermissions; | ||
362 | item.GroupPermissions = itemUpd.GroupPermissions; | ||
363 | |||
364 | item.GroupID = itemUpd.GroupID; | ||
365 | item.GroupOwned = itemUpd.GroupOwned; | ||
366 | item.CreationDate = itemUpd.CreationDate; | ||
367 | // The client sends zero if its newly created? | ||
368 | |||
369 | if (itemUpd.CreationDate == 0) | ||
370 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
371 | else | ||
372 | item.CreationDate = itemUpd.CreationDate; | ||
373 | 330 | ||
374 | // TODO: Check if folder changed and move item | 331 | item.GroupID = itemUpd.GroupID; |
375 | //item.NextPermissions = itemUpd.Folder; | 332 | item.GroupOwned = itemUpd.GroupOwned; |
376 | item.InvType = itemUpd.InvType; | 333 | item.CreationDate = itemUpd.CreationDate; |
377 | item.SalePrice = itemUpd.SalePrice; | 334 | // The client sends zero if its newly created? |
378 | item.SaleType = itemUpd.SaleType; | ||
379 | item.Flags = itemUpd.Flags; | ||
380 | 335 | ||
381 | userInfo.UpdateItem(item); | 336 | if (itemUpd.CreationDate == 0) |
382 | } | 337 | item.CreationDate = Util.UnixTimeSinceEpoch(); |
383 | else | 338 | else |
384 | { | 339 | item.CreationDate = itemUpd.CreationDate; |
385 | IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); | 340 | |
386 | if (agentTransactions != null) | 341 | // TODO: Check if folder changed and move item |
387 | { | 342 | //item.NextPermissions = itemUpd.Folder; |
388 | agentTransactions.HandleItemUpdateFromTransaction( | 343 | item.InvType = itemUpd.InvType; |
389 | remoteClient, transactionID, item); | 344 | item.SalePrice = itemUpd.SalePrice; |
390 | } | 345 | item.SaleType = itemUpd.SaleType; |
391 | } | 346 | item.Flags = itemUpd.Flags; |
347 | |||
348 | InventoryService.UpdateItem(item); | ||
392 | } | 349 | } |
393 | else | 350 | else |
394 | { | 351 | { |
395 | m_log.Error( | 352 | IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>(); |
396 | "[AGENTINVENTORY]: Item ID " + itemID + " not found for an inventory item update."); | 353 | if (agentTransactions != null) |
354 | { | ||
355 | agentTransactions.HandleItemUpdateFromTransaction( | ||
356 | remoteClient, transactionID, item); | ||
357 | } | ||
397 | } | 358 | } |
398 | } | 359 | } |
399 | else | 360 | else |
400 | { | 361 | { |
401 | m_log.Error( | 362 | m_log.Error( |
402 | "[AGENT INVENTORY]: Agent ID " + remoteClient.AgentId + " not found for an inventory item update."); | 363 | "[AGENTINVENTORY]: Item ID " + itemID + " not found for an inventory item update."); |
403 | } | 364 | } |
404 | } | 365 | } |
405 | 366 | ||
@@ -445,123 +406,85 @@ namespace OpenSim.Region.Framework.Scenes | |||
445 | public virtual InventoryItemBase GiveInventoryItem( | 406 | public virtual InventoryItemBase GiveInventoryItem( |
446 | UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId) | 407 | UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId) |
447 | { | 408 | { |
448 | // Retrieve the item from the sender | ||
449 | CachedUserInfo senderUserInfo = CommsManager.UserProfileCacheService.GetUserDetails(senderId); | ||
450 | |||
451 | Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); | 409 | Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); |
452 | 410 | ||
453 | if (senderUserInfo == null) | 411 | InventoryItemBase item = InventoryService.QueryItem(new InventoryItemBase(itemId)); |
454 | { | ||
455 | m_log.ErrorFormat( | ||
456 | "[AGENT INVENTORY]: Failed to find sending user {0} for item {1}", senderId, itemId); | ||
457 | |||
458 | return null; | ||
459 | } | ||
460 | 412 | ||
461 | if (senderUserInfo.RootFolder != null) | 413 | if ((item != null) && (item.Owner == senderId)) |
462 | { | 414 | { |
463 | InventoryItemBase item = senderUserInfo.RootFolder.FindItem(itemId); | 415 | if (!Permissions.BypassPermissions()) |
464 | |||
465 | if (item != null) | ||
466 | { | 416 | { |
467 | if (!Permissions.BypassPermissions()) | 417 | if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) |
468 | { | 418 | return null; |
469 | if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) | 419 | } |
470 | return null; | ||
471 | } | ||
472 | 420 | ||
473 | CachedUserInfo recipientUserInfo | 421 | // Insert a copy of the item into the recipient |
474 | = CommsManager.UserProfileCacheService.GetUserDetails(recipient); | 422 | InventoryItemBase itemCopy = new InventoryItemBase(); |
423 | itemCopy.Owner = recipient; | ||
424 | itemCopy.CreatorId = item.CreatorId; | ||
425 | itemCopy.ID = UUID.Random(); | ||
426 | itemCopy.AssetID = item.AssetID; | ||
427 | itemCopy.Description = item.Description; | ||
428 | itemCopy.Name = item.Name; | ||
429 | itemCopy.AssetType = item.AssetType; | ||
430 | itemCopy.InvType = item.InvType; | ||
431 | itemCopy.Folder = recipientFolderId; | ||
475 | 432 | ||
476 | if (recipientUserInfo != null) | 433 | if (Permissions.PropagatePermissions()) |
434 | { | ||
435 | if (item.InvType == (int)InventoryType.Object) | ||
477 | { | 436 | { |
478 | if (!recipientUserInfo.HasReceivedInventory) | 437 | itemCopy.BasePermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); |
479 | recipientUserInfo.FetchInventory(); | 438 | itemCopy.BasePermissions |= (item.CurrentPermissions & 7) << 13; |
480 | |||
481 | // Insert a copy of the item into the recipient | ||
482 | InventoryItemBase itemCopy = new InventoryItemBase(); | ||
483 | itemCopy.Owner = recipient; | ||
484 | itemCopy.CreatorId = item.CreatorId; | ||
485 | itemCopy.ID = UUID.Random(); | ||
486 | itemCopy.AssetID = item.AssetID; | ||
487 | itemCopy.Description = item.Description; | ||
488 | itemCopy.Name = item.Name; | ||
489 | itemCopy.AssetType = item.AssetType; | ||
490 | itemCopy.InvType = item.InvType; | ||
491 | itemCopy.Folder = recipientFolderId; | ||
492 | |||
493 | if (Permissions.PropagatePermissions()) | ||
494 | { | ||
495 | if (item.InvType == (int)InventoryType.Object) | ||
496 | { | ||
497 | itemCopy.BasePermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); | ||
498 | itemCopy.BasePermissions |= (item.CurrentPermissions & 7) << 13; | ||
499 | } | ||
500 | else | ||
501 | { | ||
502 | itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions; | ||
503 | } | ||
504 | |||
505 | itemCopy.CurrentPermissions = itemCopy.BasePermissions; | ||
506 | if ((item.CurrentPermissions & 8) != 0) // Propagate slam bit | ||
507 | { | ||
508 | itemCopy.BasePermissions &= item.NextPermissions; | ||
509 | itemCopy.CurrentPermissions = itemCopy.BasePermissions; | ||
510 | itemCopy.CurrentPermissions |= 8; | ||
511 | } | ||
512 | |||
513 | itemCopy.NextPermissions = item.NextPermissions; | ||
514 | itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; | ||
515 | itemCopy.GroupPermissions = item.GroupPermissions & item.NextPermissions; | ||
516 | } | ||
517 | else | ||
518 | { | ||
519 | itemCopy.CurrentPermissions = item.CurrentPermissions; | ||
520 | itemCopy.NextPermissions = item.NextPermissions; | ||
521 | itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; | ||
522 | itemCopy.GroupPermissions = item.GroupPermissions & item.NextPermissions; | ||
523 | itemCopy.BasePermissions = item.BasePermissions; | ||
524 | } | ||
525 | |||
526 | itemCopy.GroupID = UUID.Zero; | ||
527 | itemCopy.GroupOwned = false; | ||
528 | itemCopy.Flags = item.Flags; | ||
529 | itemCopy.SalePrice = item.SalePrice; | ||
530 | itemCopy.SaleType = item.SaleType; | ||
531 | |||
532 | recipientUserInfo.AddItem(itemCopy); | ||
533 | |||
534 | if (!Permissions.BypassPermissions()) | ||
535 | { | ||
536 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
537 | senderUserInfo.DeleteItem(itemId); | ||
538 | } | ||
539 | |||
540 | return itemCopy; | ||
541 | } | 439 | } |
542 | else | 440 | else |
543 | { | 441 | { |
544 | m_log.ErrorFormat( | 442 | itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions; |
545 | "[AGENT INVENTORY]: Could not find userinfo for recipient user {0} of item {1}, {2} from {3}", | ||
546 | recipient, item.Name, | ||
547 | item.ID, senderId); | ||
548 | } | 443 | } |
444 | |||
445 | itemCopy.CurrentPermissions = itemCopy.BasePermissions; | ||
446 | if ((item.CurrentPermissions & 8) != 0) // Propagate slam bit | ||
447 | { | ||
448 | itemCopy.BasePermissions &= item.NextPermissions; | ||
449 | itemCopy.CurrentPermissions = itemCopy.BasePermissions; | ||
450 | itemCopy.CurrentPermissions |= 8; | ||
451 | } | ||
452 | |||
453 | itemCopy.NextPermissions = item.NextPermissions; | ||
454 | itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; | ||
455 | itemCopy.GroupPermissions = item.GroupPermissions & item.NextPermissions; | ||
549 | } | 456 | } |
550 | else | 457 | else |
551 | { | 458 | { |
552 | m_log.ErrorFormat( | 459 | itemCopy.CurrentPermissions = item.CurrentPermissions; |
553 | "[AGENT INVENTORY]: Failed to find item {0} to give to {1}", itemId, senderId); | 460 | itemCopy.NextPermissions = item.NextPermissions; |
461 | itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; | ||
462 | itemCopy.GroupPermissions = item.GroupPermissions & item.NextPermissions; | ||
463 | itemCopy.BasePermissions = item.BasePermissions; | ||
464 | } | ||
465 | |||
466 | itemCopy.GroupID = UUID.Zero; | ||
467 | itemCopy.GroupOwned = false; | ||
468 | itemCopy.Flags = item.Flags; | ||
469 | itemCopy.SalePrice = item.SalePrice; | ||
470 | itemCopy.SaleType = item.SaleType; | ||
554 | 471 | ||
555 | return null; | 472 | InventoryService.AddItem(itemCopy); |
473 | |||
474 | if (!Permissions.BypassPermissions()) | ||
475 | { | ||
476 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
477 | InventoryService.DeleteItem(new InventoryItemBase(itemId)); | ||
556 | } | 478 | } |
479 | |||
480 | return itemCopy; | ||
557 | } | 481 | } |
558 | else | 482 | else |
559 | { | 483 | { |
560 | m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemId.ToString() + ", no root folder"); | 484 | m_log.WarnFormat("[AGENT INVENTORY]: Failed to find item {0} or item does not belong to giver ", itemId); |
561 | return null; | 485 | return null; |
562 | } | 486 | } |
563 | 487 | ||
564 | return null; | ||
565 | } | 488 | } |
566 | 489 | ||
567 | /// <summary> | 490 | /// <summary> |
@@ -578,31 +501,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
578 | /// <returns> | 501 | /// <returns> |
579 | /// The inventory folder copy given, null if the copy was unsuccessful | 502 | /// The inventory folder copy given, null if the copy was unsuccessful |
580 | /// </returns> | 503 | /// </returns> |
581 | public virtual InventoryFolderImpl GiveInventoryFolder( | 504 | public virtual InventoryFolderBase GiveInventoryFolder( |
582 | UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId) | 505 | UUID recipientId, UUID senderId, UUID folderId, UUID recipientParentFolderId) |
583 | { | 506 | { |
584 | // Retrieve the folder from the sender | 507 | //// Retrieve the folder from the sender |
585 | CachedUserInfo senderUserInfo = CommsManager.UserProfileCacheService.GetUserDetails(senderId); | 508 | InventoryFolderBase folder = InventoryService.QueryFolder(new InventoryFolderBase(folderId)); |
586 | |||
587 | if (null == senderUserInfo) | ||
588 | { | ||
589 | m_log.ErrorFormat( | ||
590 | "[AGENT INVENTORY]: Failed to find sending user {0} for folder {1}", senderId, folderId); | ||
591 | |||
592 | return null; | ||
593 | } | ||
594 | |||
595 | if (!senderUserInfo.HasReceivedInventory) | ||
596 | { | ||
597 | m_log.DebugFormat( | ||
598 | "[AGENT INVENTORY]: Could not give inventory folder - have not yet received inventory for {0}", | ||
599 | senderId); | ||
600 | |||
601 | return null; | ||
602 | } | ||
603 | |||
604 | InventoryFolderImpl folder = senderUserInfo.RootFolder.FindFolder(folderId); | ||
605 | |||
606 | if (null == folder) | 509 | if (null == folder) |
607 | { | 510 | { |
608 | m_log.ErrorFormat( | 511 | m_log.ErrorFormat( |
@@ -611,48 +514,37 @@ namespace OpenSim.Region.Framework.Scenes | |||
611 | return null; | 514 | return null; |
612 | } | 515 | } |
613 | 516 | ||
614 | CachedUserInfo recipientUserInfo | ||
615 | = CommsManager.UserProfileCacheService.GetUserDetails(recipientId); | ||
616 | |||
617 | if (null == recipientUserInfo) | ||
618 | { | ||
619 | m_log.ErrorFormat( | ||
620 | "[AGENT INVENTORY]: Failed to find receiving user {0} for folder {1}", recipientId, folderId); | ||
621 | |||
622 | return null; | ||
623 | } | ||
624 | 517 | ||
625 | if (!recipientUserInfo.HasReceivedInventory) | 518 | if (recipientParentFolderId == UUID.Zero) |
626 | { | 519 | { |
627 | recipientUserInfo.FetchInventory(); | 520 | InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId); |
628 | if (!WaitForInventory(recipientUserInfo)) | 521 | if (recipientRootFolder != null) |
522 | recipientParentFolderId = recipientRootFolder.ID; | ||
523 | else | ||
524 | { | ||
525 | m_log.WarnFormat("[AGENT INVENTORY]: Unable to find root folder for receiving agent"); | ||
629 | return null; | 526 | return null; |
527 | } | ||
630 | } | 528 | } |
631 | 529 | ||
632 | if (recipientParentFolderId == UUID.Zero) | ||
633 | recipientParentFolderId = recipientUserInfo.RootFolder.ID; | ||
634 | |||
635 | UUID newFolderId = UUID.Random(); | 530 | UUID newFolderId = UUID.Random(); |
636 | recipientUserInfo.CreateFolder(folder.Name, newFolderId, (ushort)folder.Type, recipientParentFolderId); | 531 | InventoryFolderBase newFolder = new InventoryFolderBase(newFolderId, folder.Name, recipientId, folder.Type, recipientParentFolderId, folder.Version); |
637 | 532 | InventoryService.AddFolder(newFolder); | |
638 | // XXX: Messy - we should really get this back in the CreateFolder call | ||
639 | InventoryFolderImpl copiedFolder = recipientUserInfo.RootFolder.FindFolder(newFolderId); | ||
640 | 533 | ||
641 | // Give all the subfolders | 534 | // Give all the subfolders |
642 | List<InventoryFolderImpl> subFolders = folder.RequestListOfFolderImpls(); | 535 | InventoryCollection contents = InventoryService.GetFolderContent(senderId, folderId); |
643 | foreach (InventoryFolderImpl childFolder in subFolders) | 536 | foreach (InventoryFolderBase childFolder in contents.Folders) |
644 | { | 537 | { |
645 | GiveInventoryFolder(recipientId, senderId, childFolder.ID, copiedFolder.ID); | 538 | GiveInventoryFolder(recipientId, senderId, childFolder.ID, newFolder.ID); |
646 | } | 539 | } |
647 | 540 | ||
648 | // Give all the items | 541 | // Give all the items |
649 | List<InventoryItemBase> items = folder.RequestListOfItems(); | 542 | foreach (InventoryItemBase item in contents.Items) |
650 | foreach (InventoryItemBase item in items) | ||
651 | { | 543 | { |
652 | GiveInventoryItem(recipientId, senderId, item.ID, copiedFolder.ID); | 544 | GiveInventoryItem(recipientId, senderId, item.ID, newFolder.ID); |
653 | } | 545 | } |
654 | 546 | ||
655 | return copiedFolder; | 547 | return newFolder; |
656 | } | 548 | } |
657 | 549 | ||
658 | public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, UUID oldAgentID, UUID oldItemID, | 550 | public void CopyInventoryItem(IClientAPI remoteClient, uint callbackID, UUID oldAgentID, UUID oldItemID, |
@@ -759,41 +651,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
759 | m_log.DebugFormat( | 651 | m_log.DebugFormat( |
760 | "[AGENT INVENTORY]: Moving item {0} to {1} for {2}", itemID, folderID, remoteClient.AgentId); | 652 | "[AGENT INVENTORY]: Moving item {0} to {1} for {2}", itemID, folderID, remoteClient.AgentId); |
761 | 653 | ||
762 | CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 654 | InventoryItemBase item = InventoryService.QueryItem(new InventoryItemBase(itemID)); |
763 | |||
764 | if (userInfo == null) | ||
765 | { | ||
766 | m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString()); | ||
767 | 655 | ||
768 | return; | 656 | if (item != null) |
769 | } | ||
770 | |||
771 | if (userInfo.RootFolder != null) | ||
772 | { | 657 | { |
773 | InventoryItemBase item = userInfo.RootFolder.FindItem(itemID); | 658 | if (newName != String.Empty) |
774 | |||
775 | if (item != null) | ||
776 | { | 659 | { |
777 | if (newName != String.Empty) | 660 | item.Name = newName; |
778 | { | ||
779 | item.Name = newName; | ||
780 | } | ||
781 | item.Folder = folderID; | ||
782 | |||
783 | userInfo.DeleteItem(item.ID); | ||
784 | |||
785 | AddInventoryItem(remoteClient, item); | ||
786 | } | 661 | } |
787 | else | 662 | item.Folder = folderID; |
788 | { | ||
789 | m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString()); | ||
790 | 663 | ||
791 | return; | 664 | // Diva comment: can't we just update? |
792 | } | 665 | InventoryService.DeleteItem(item); |
666 | |||
667 | AddInventoryItem(remoteClient, item); | ||
793 | } | 668 | } |
794 | else | 669 | else |
795 | { | 670 | { |
796 | m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString() + ", no root folder"); | 671 | m_log.Warn("[AGENT INVENTORY]: Failed to find item " + itemID.ToString()); |
797 | 672 | ||
798 | return; | 673 | return; |
799 | } | 674 | } |
@@ -830,37 +705,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
830 | IClientAPI remoteClient, string creatorID, UUID folderID, string name, uint flags, uint callbackID, AssetBase asset, sbyte invType, | 705 | IClientAPI remoteClient, string creatorID, UUID folderID, string name, uint flags, uint callbackID, AssetBase asset, sbyte invType, |
831 | uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask, uint groupMask, int creationDate) | 706 | uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask, uint groupMask, int creationDate) |
832 | { | 707 | { |
833 | CachedUserInfo userInfo | 708 | InventoryItemBase item = new InventoryItemBase(); |
834 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 709 | item.Owner = remoteClient.AgentId; |
835 | 710 | item.CreatorId = creatorID; | |
836 | if (userInfo != null) | 711 | item.ID = UUID.Random(); |
837 | { | 712 | item.AssetID = asset.FullID; |
838 | InventoryItemBase item = new InventoryItemBase(); | 713 | item.Description = asset.Description; |
839 | item.Owner = remoteClient.AgentId; | 714 | item.Name = name; |
840 | item.CreatorId = creatorID; | 715 | item.Flags = flags; |
841 | item.ID = UUID.Random(); | 716 | item.AssetType = asset.Type; |
842 | item.AssetID = asset.FullID; | 717 | item.InvType = invType; |
843 | item.Description = asset.Description; | 718 | item.Folder = folderID; |
844 | item.Name = name; | 719 | item.CurrentPermissions = currentMask; |
845 | item.Flags = flags; | 720 | item.NextPermissions = nextOwnerMask; |
846 | item.AssetType = asset.Type; | 721 | item.EveryOnePermissions = everyoneMask; |
847 | item.InvType = invType; | 722 | item.GroupPermissions = groupMask; |
848 | item.Folder = folderID; | 723 | item.BasePermissions = baseMask; |
849 | item.CurrentPermissions = currentMask; | 724 | item.CreationDate = creationDate; |
850 | item.NextPermissions = nextOwnerMask; | 725 | |
851 | item.EveryOnePermissions = everyoneMask; | 726 | if (InventoryService.AddItem(item)) |
852 | item.GroupPermissions = groupMask; | ||
853 | item.BasePermissions = baseMask; | ||
854 | item.CreationDate = creationDate; | ||
855 | |||
856 | userInfo.AddItem(item); | ||
857 | remoteClient.SendInventoryItemCreateUpdate(item, callbackID); | 727 | remoteClient.SendInventoryItemCreateUpdate(item, callbackID); |
858 | } | ||
859 | else | 728 | else |
860 | { | 729 | { |
730 | m_dialogModule.SendAlertToUser(remoteClient, "Failed to create item"); | ||
861 | m_log.WarnFormat( | 731 | m_log.WarnFormat( |
862 | "No user details associated with client {0} uuid {1} in CreateNewInventoryItem!", | 732 | "Failed to add item for {0} in CreateNewInventoryItem!", |
863 | remoteClient.Name, remoteClient.AgentId); | 733 | remoteClient.Name); |
864 | } | 734 | } |
865 | } | 735 | } |
866 | 736 | ||
@@ -941,19 +811,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
941 | /// <param name="itemID"></param> | 811 | /// <param name="itemID"></param> |
942 | private void RemoveInventoryItem(IClientAPI remoteClient, UUID itemID) | 812 | private void RemoveInventoryItem(IClientAPI remoteClient, UUID itemID) |
943 | { | 813 | { |
944 | CachedUserInfo userInfo | 814 | InventoryService.DeleteItem(new InventoryItemBase(itemID)); |
945 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | ||
946 | |||
947 | if (userInfo == null) | ||
948 | { | ||
949 | m_log.WarnFormat( | ||
950 | "[AGENT INVENTORY]: Failed to find user {0} {1} to delete inventory item {2}", | ||
951 | remoteClient.Name, remoteClient.AgentId, itemID); | ||
952 | |||
953 | return; | ||
954 | } | ||
955 | |||
956 | userInfo.DeleteItem(itemID); | ||
957 | } | 815 | } |
958 | 816 | ||
959 | /// <summary> | 817 | /// <summary> |
@@ -1332,19 +1190,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1332 | 1190 | ||
1333 | public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) | 1191 | public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) |
1334 | { | 1192 | { |
1335 | CachedUserInfo profile = CommsManager.UserProfileCacheService.GetUserDetails(destID); | 1193 | InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID); |
1336 | if (profile == null || profile.RootFolder == null) | ||
1337 | { | ||
1338 | m_log.ErrorFormat( | ||
1339 | "[PRIM INVENTORY]: " + | ||
1340 | "Avatar {0} cannot be found to add items", | ||
1341 | destID); | ||
1342 | return UUID.Zero; | ||
1343 | } | ||
1344 | 1194 | ||
1345 | UUID newFolderID = UUID.Random(); | 1195 | UUID newFolderID = UUID.Random(); |
1346 | 1196 | ||
1347 | profile.CreateFolder(category, newFolderID, 0xffff, profile.RootFolder.ID); | 1197 | InventoryFolderBase newFolder = new InventoryFolderBase(newFolderID, category, destID, 0xff, rootFolder.ID, rootFolder.Version); |
1198 | InventoryService.AddFolder(newFolder); | ||
1348 | 1199 | ||
1349 | foreach (UUID itemID in items) | 1200 | foreach (UUID itemID in items) |
1350 | { | 1201 | { |
@@ -1358,19 +1209,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
1358 | } | 1209 | } |
1359 | } | 1210 | } |
1360 | 1211 | ||
1361 | ScenePresence avatar; | 1212 | ScenePresence avatar = null; |
1362 | |||
1363 | if (TryGetAvatar(destID, out avatar)) | 1213 | if (TryGetAvatar(destID, out avatar)) |
1364 | { | 1214 | { |
1365 | profile.SendInventoryDecendents(avatar.ControllingClient, | 1215 | //profile.SendInventoryDecendents(avatar.ControllingClient, |
1366 | profile.RootFolder.ID, true, false); | 1216 | // profile.RootFolder.ID, true, false); |
1367 | profile.SendInventoryDecendents(avatar.ControllingClient, | 1217 | //profile.SendInventoryDecendents(avatar.ControllingClient, |
1368 | newFolderID, false, true); | 1218 | // newFolderID, false, true); |
1219 | |||
1220 | SendInventoryUpdate(avatar.ControllingClient, rootFolder, true, false); | ||
1221 | SendInventoryUpdate(avatar.ControllingClient, newFolder, false, true); | ||
1369 | } | 1222 | } |
1370 | 1223 | ||
1371 | return newFolderID; | 1224 | return newFolderID; |
1372 | } | 1225 | } |
1373 | 1226 | ||
1227 | private void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems) | ||
1228 | { | ||
1229 | InventoryCollection contents = InventoryService.GetFolderContent(client.AgentId, folder.ID); | ||
1230 | client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, fetchFolders, fetchItems); | ||
1231 | } | ||
1232 | |||
1374 | /// <summary> | 1233 | /// <summary> |
1375 | /// Update an item in a prim (task) inventory. | 1234 | /// Update an item in a prim (task) inventory. |
1376 | /// This method does not handle scripts, <see>RezScript(IClientAPI, UUID, unit)</see> | 1235 | /// This method does not handle scripts, <see>RezScript(IClientAPI, UUID, unit)</see> |
@@ -1848,7 +1707,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1848 | 1707 | ||
1849 | // Get the user info of the item destination | 1708 | // Get the user info of the item destination |
1850 | // | 1709 | // |
1851 | CachedUserInfo userInfo; | 1710 | UUID userID = UUID.Zero; |
1852 | 1711 | ||
1853 | if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || | 1712 | if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || |
1854 | action == DeRezAction.SaveToExistingUserInventoryItem) | 1713 | action == DeRezAction.SaveToExistingUserInventoryItem) |
@@ -1859,28 +1718,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
1859 | if (remoteClient == null) | 1718 | if (remoteClient == null) |
1860 | return UUID.Zero; | 1719 | return UUID.Zero; |
1861 | 1720 | ||
1862 | userInfo = CommsManager.UserProfileCacheService.GetUserDetails( | 1721 | userID = remoteClient.AgentId; |
1863 | remoteClient.AgentId); | ||
1864 | } | 1722 | } |
1865 | else | 1723 | else |
1866 | { | 1724 | { |
1867 | // All returns / deletes go to the object owner | 1725 | // All returns / deletes go to the object owner |
1868 | // | 1726 | // |
1869 | userInfo = CommsManager.UserProfileCacheService.GetUserDetails( | ||
1870 | objectGroup.RootPart.OwnerID); | ||
1871 | } | ||
1872 | 1727 | ||
1873 | if (userInfo == null) // Can't proceed | 1728 | userID = objectGroup.RootPart.OwnerID; |
1874 | { | ||
1875 | return UUID.Zero; | ||
1876 | } | 1729 | } |
1877 | 1730 | ||
1878 | if (!userInfo.HasReceivedInventory) | 1731 | if (userID == UUID.Zero) // Can't proceed |
1879 | { | 1732 | { |
1880 | // Async inventory requests will queue, but they will never | 1733 | return UUID.Zero; |
1881 | // execute unless inventory is actually fetched | ||
1882 | // | ||
1883 | userInfo.FetchInventory(); | ||
1884 | } | 1734 | } |
1885 | 1735 | ||
1886 | // If we're returning someone's item, it goes back to the | 1736 | // If we're returning someone's item, it goes back to the |
@@ -1894,8 +1744,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1894 | 1744 | ||
1895 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | 1745 | if (DeRezAction.SaveToExistingUserInventoryItem == action) |
1896 | { | 1746 | { |
1897 | item = userInfo.RootFolder.FindItem( | 1747 | item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID); |
1898 | objectGroup.RootPart.FromUserInventoryItemID); | 1748 | item = InventoryService.QueryItem(item); |
1749 | |||
1750 | //item = userInfo.RootFolder.FindItem( | ||
1751 | // objectGroup.RootPart.FromUserInventoryItemID); | ||
1899 | 1752 | ||
1900 | if (null == item) | 1753 | if (null == item) |
1901 | { | 1754 | { |
@@ -1920,53 +1773,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
1920 | // have to wait for the inventory to find | 1773 | // have to wait for the inventory to find |
1921 | // the destination folder | 1774 | // the destination folder |
1922 | // | 1775 | // |
1923 | if (!WaitForInventory(userInfo)) | 1776 | folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); |
1924 | return UUID.Zero; | ||
1925 | folder = userInfo.FindFolderForType( | ||
1926 | (int)AssetType.LostAndFoundFolder); | ||
1927 | } | 1777 | } |
1928 | else | 1778 | else |
1929 | { | 1779 | { |
1930 | // Assume inventory skeleton was loaded during login | 1780 | // Assume inventory skeleton was loaded during login |
1931 | // and all folders can be found | 1781 | // and all folders can be found |
1932 | // | 1782 | // |
1933 | folder = userInfo.FindFolderForType( | 1783 | folder = InventoryService.GetFolderForType(userID, AssetType.TrashFolder); |
1934 | (int)AssetType.TrashFolder); | ||
1935 | } | 1784 | } |
1936 | } | 1785 | } |
1937 | else if (action == DeRezAction.Return) | 1786 | else if (action == DeRezAction.Return) |
1938 | { | 1787 | { |
1939 | // Wait if needed | ||
1940 | // | ||
1941 | if (!userInfo.HasReceivedInventory) | ||
1942 | { | ||
1943 | if (!WaitForInventory(userInfo)) | ||
1944 | return UUID.Zero; | ||
1945 | } | ||
1946 | 1788 | ||
1947 | // Dump to lost + found unconditionally | 1789 | // Dump to lost + found unconditionally |
1948 | // | 1790 | // |
1949 | folder = userInfo.FindFolderForType( | 1791 | folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); |
1950 | (int)AssetType.LostAndFoundFolder); | ||
1951 | } | 1792 | } |
1952 | 1793 | ||
1953 | if (folderID == UUID.Zero && folder == null) | 1794 | if (folderID == UUID.Zero && folder == null) |
1954 | { | 1795 | { |
1955 | // Catch all. Use lost & found | 1796 | // Catch all. Use lost & found |
1956 | // | 1797 | // |
1957 | if (!userInfo.HasReceivedInventory) | ||
1958 | { | ||
1959 | if (!WaitForInventory(userInfo)) | ||
1960 | return UUID.Zero; | ||
1961 | } | ||
1962 | 1798 | ||
1963 | folder = userInfo.FindFolderForType( | 1799 | folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); |
1964 | (int)AssetType.LostAndFoundFolder); | ||
1965 | } | 1800 | } |
1966 | 1801 | ||
1967 | if (folder == null) // None of the above | 1802 | if (folder == null) // None of the above |
1968 | { | 1803 | { |
1969 | folder = userInfo.RootFolder.FindFolder(folderID); | 1804 | //folder = userInfo.RootFolder.FindFolder(folderID); |
1805 | folder = new InventoryFolderBase(folderID); | ||
1970 | 1806 | ||
1971 | if (folder == null) // Nowhere to put it | 1807 | if (folder == null) // Nowhere to put it |
1972 | { | 1808 | { |
@@ -1979,7 +1815,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1979 | item.ID = UUID.Random(); | 1815 | item.ID = UUID.Random(); |
1980 | item.InvType = (int)InventoryType.Object; | 1816 | item.InvType = (int)InventoryType.Object; |
1981 | item.Folder = folder.ID; | 1817 | item.Folder = folder.ID; |
1982 | item.Owner = userInfo.UserProfile.ID; | 1818 | item.Owner = userID; |
1983 | } | 1819 | } |
1984 | 1820 | ||
1985 | AssetBase asset = CreateAsset( | 1821 | AssetBase asset = CreateAsset( |
@@ -1993,7 +1829,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1993 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | 1829 | if (DeRezAction.SaveToExistingUserInventoryItem == action) |
1994 | { | 1830 | { |
1995 | item.AssetID = asset.FullID; | 1831 | item.AssetID = asset.FullID; |
1996 | userInfo.UpdateItem(item); | 1832 | InventoryService.UpdateItem(item); |
1997 | } | 1833 | } |
1998 | else | 1834 | else |
1999 | { | 1835 | { |
@@ -2034,7 +1870,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2034 | item.Name = asset.Name; | 1870 | item.Name = asset.Name; |
2035 | item.AssetType = asset.Type; | 1871 | item.AssetType = asset.Type; |
2036 | 1872 | ||
2037 | userInfo.AddItem(item); | 1873 | InventoryService.AddItem(item); |
2038 | 1874 | ||
2039 | if (remoteClient != null && item.Owner == remoteClient.AgentId) | 1875 | if (remoteClient != null && item.Owner == remoteClient.AgentId) |
2040 | { | 1876 | { |
@@ -2053,7 +1889,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2053 | return assetID; | 1889 | return assetID; |
2054 | } | 1890 | } |
2055 | 1891 | ||
2056 | public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, UUID assetID, UUID agentID) | 1892 | public void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID) |
2057 | { | 1893 | { |
2058 | SceneObjectGroup objectGroup = grp; | 1894 | SceneObjectGroup objectGroup = grp; |
2059 | if (objectGroup != null) | 1895 | if (objectGroup != null) |
@@ -2070,65 +1906,29 @@ namespace OpenSim.Region.Framework.Scenes | |||
2070 | 1906 | ||
2071 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); | 1907 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); |
2072 | 1908 | ||
2073 | CachedUserInfo userInfo = | 1909 | InventoryItemBase item = InventoryService.QueryItem(new InventoryItemBase(itemID)); |
2074 | CommsManager.UserProfileCacheService.GetUserDetails(agentID); | 1910 | |
2075 | if (userInfo != null && userInfo.RootFolder != null) | 1911 | if (item != null) |
2076 | { | 1912 | { |
2077 | Queue<InventoryFolderImpl> searchfolders = new Queue<InventoryFolderImpl>(); | 1913 | AssetBase asset = CreateAsset( |
2078 | searchfolders.Enqueue(userInfo.RootFolder); | 1914 | objectGroup.GetPartName(objectGroup.LocalId), |
1915 | objectGroup.GetPartDescription(objectGroup.LocalId), | ||
1916 | (sbyte)AssetType.Object, | ||
1917 | Utils.StringToBytes(sceneObjectXml)); | ||
1918 | AssetService.Store(asset); | ||
2079 | 1919 | ||
2080 | UUID foundFolder = UUID.Zero; | 1920 | item.AssetID = asset.FullID; |
2081 | InventoryItemBase item = null; | 1921 | item.Description = asset.Description; |
1922 | item.Name = asset.Name; | ||
1923 | item.AssetType = asset.Type; | ||
1924 | item.InvType = (int)InventoryType.Object; | ||
2082 | 1925 | ||
2083 | // search through folders to find the asset. | 1926 | InventoryService.UpdateItem(item); |
2084 | while (searchfolders.Count > 0) | ||
2085 | { | ||
2086 | InventoryFolderImpl fld = searchfolders.Dequeue(); | ||
2087 | lock (fld) | ||
2088 | { | ||
2089 | if (fld != null) | ||
2090 | { | ||
2091 | if (fld.Items.ContainsKey(assetID)) | ||
2092 | { | ||
2093 | item = fld.Items[assetID]; | ||
2094 | foundFolder = fld.ID; | ||
2095 | searchfolders.Clear(); | ||
2096 | break; | ||
2097 | } | ||
2098 | else | ||
2099 | { | ||
2100 | foreach (InventoryFolderImpl subfld in fld.RequestListOfFolderImpls()) | ||
2101 | { | ||
2102 | searchfolders.Enqueue(subfld); | ||
2103 | } | ||
2104 | } | ||
2105 | } | ||
2106 | } | ||
2107 | } | ||
2108 | 1927 | ||
2109 | if (foundFolder != UUID.Zero && item != null) | 1928 | // this gets called when the agent loggs off! |
1929 | if (remoteClient != null) | ||
2110 | { | 1930 | { |
2111 | AssetBase asset = CreateAsset( | 1931 | remoteClient.SendInventoryItemCreateUpdate(item, 0); |
2112 | objectGroup.GetPartName(objectGroup.LocalId), | ||
2113 | objectGroup.GetPartDescription(objectGroup.LocalId), | ||
2114 | (sbyte)AssetType.Object, | ||
2115 | Utils.StringToBytes(sceneObjectXml)); | ||
2116 | AssetService.Store(asset); | ||
2117 | |||
2118 | item.AssetID = asset.FullID; | ||
2119 | item.Description = asset.Description; | ||
2120 | item.Name = asset.Name; | ||
2121 | item.AssetType = asset.Type; | ||
2122 | item.InvType = (int)InventoryType.Object; | ||
2123 | item.Folder = foundFolder; | ||
2124 | |||
2125 | userInfo.UpdateItem(item); | ||
2126 | |||
2127 | // this gets called when the agent loggs off! | ||
2128 | if (remoteClient != null) | ||
2129 | { | ||
2130 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
2131 | } | ||
2132 | } | 1932 | } |
2133 | } | 1933 | } |
2134 | } | 1934 | } |
@@ -2140,59 +1940,54 @@ namespace OpenSim.Region.Framework.Scenes | |||
2140 | if (grp != null) | 1940 | if (grp != null) |
2141 | { | 1941 | { |
2142 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); | 1942 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); |
1943 | |||
1944 | AssetBase asset = CreateAsset( | ||
1945 | grp.GetPartName(grp.LocalId), | ||
1946 | grp.GetPartDescription(grp.LocalId), | ||
1947 | (sbyte)AssetType.Object, | ||
1948 | Utils.StringToBytes(sceneObjectXml)); | ||
1949 | AssetService.Store(asset); | ||
2143 | 1950 | ||
2144 | CachedUserInfo userInfo = | 1951 | InventoryItemBase item = new InventoryItemBase(); |
2145 | CommsManager.UserProfileCacheService.GetUserDetails(AgentId); | 1952 | item.CreatorId = grp.RootPart.CreatorID.ToString(); |
2146 | 1953 | item.Owner = remoteClient.AgentId; | |
2147 | if (userInfo != null) | 1954 | item.ID = UUID.Random(); |
2148 | { | 1955 | item.AssetID = asset.FullID; |
2149 | AssetBase asset = CreateAsset( | 1956 | item.Description = asset.Description; |
2150 | grp.GetPartName(grp.LocalId), | 1957 | item.Name = asset.Name; |
2151 | grp.GetPartDescription(grp.LocalId), | 1958 | item.AssetType = asset.Type; |
2152 | (sbyte)AssetType.Object, | 1959 | item.InvType = (int)InventoryType.Object; |
2153 | Utils.StringToBytes(sceneObjectXml)); | ||
2154 | AssetService.Store(asset); | ||
2155 | |||
2156 | InventoryItemBase item = new InventoryItemBase(); | ||
2157 | item.CreatorId = grp.RootPart.CreatorID.ToString(); | ||
2158 | item.Owner = remoteClient.AgentId; | ||
2159 | item.ID = UUID.Random(); | ||
2160 | item.AssetID = asset.FullID; | ||
2161 | item.Description = asset.Description; | ||
2162 | item.Name = asset.Name; | ||
2163 | item.AssetType = asset.Type; | ||
2164 | item.InvType = (int)InventoryType.Object; | ||
2165 | 1960 | ||
2166 | item.Folder = UUID.Zero; // Objects folder! | 1961 | item.Folder = UUID.Zero; // Objects folder! |
2167 | 1962 | ||
2168 | if ((remoteClient.AgentId != grp.RootPart.OwnerID) && Permissions.PropagatePermissions()) | 1963 | if ((remoteClient.AgentId != grp.RootPart.OwnerID) && Permissions.PropagatePermissions()) |
2169 | { | 1964 | { |
2170 | item.BasePermissions = grp.RootPart.NextOwnerMask; | 1965 | item.BasePermissions = grp.RootPart.NextOwnerMask; |
2171 | item.CurrentPermissions = grp.RootPart.NextOwnerMask; | 1966 | item.CurrentPermissions = grp.RootPart.NextOwnerMask; |
2172 | item.NextPermissions = grp.RootPart.NextOwnerMask; | 1967 | item.NextPermissions = grp.RootPart.NextOwnerMask; |
2173 | item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; | 1968 | item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; |
2174 | item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; | 1969 | item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; |
2175 | } | 1970 | } |
2176 | else | 1971 | else |
2177 | { | 1972 | { |
2178 | item.BasePermissions = grp.RootPart.BaseMask; | 1973 | item.BasePermissions = grp.RootPart.BaseMask; |
2179 | item.CurrentPermissions = grp.RootPart.OwnerMask; | 1974 | item.CurrentPermissions = grp.RootPart.OwnerMask; |
2180 | item.NextPermissions = grp.RootPart.NextOwnerMask; | 1975 | item.NextPermissions = grp.RootPart.NextOwnerMask; |
2181 | item.EveryOnePermissions = grp.RootPart.EveryoneMask; | 1976 | item.EveryOnePermissions = grp.RootPart.EveryoneMask; |
2182 | item.GroupPermissions = grp.RootPart.GroupMask; | 1977 | item.GroupPermissions = grp.RootPart.GroupMask; |
2183 | } | 1978 | } |
2184 | item.CreationDate = Util.UnixTimeSinceEpoch(); | 1979 | item.CreationDate = Util.UnixTimeSinceEpoch(); |
2185 | 1980 | ||
2186 | // sets assetID so client can show asset as 'attached' in inventory | 1981 | // sets assetID so client can show asset as 'attached' in inventory |
2187 | grp.SetFromAssetID(item.ID); | 1982 | grp.SetFromAssetID(item.ID); |
2188 | 1983 | ||
2189 | userInfo.AddItem(item); | 1984 | if (InventoryService.AddItem(item)) |
2190 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | 1985 | remoteClient.SendInventoryItemCreateUpdate(item, 0); |
1986 | else | ||
1987 | m_dialogModule.SendAlertToUser(remoteClient, "Operation failed"); | ||
2191 | 1988 | ||
2192 | itemID = item.ID; | 1989 | itemID = item.ID; |
2193 | return item.AssetID; | 1990 | return item.AssetID; |
2194 | } | ||
2195 | return UUID.Zero; | ||
2196 | } | 1991 | } |
2197 | return UUID.Zero; | 1992 | return UUID.Zero; |
2198 | } | 1993 | } |
@@ -2261,180 +2056,164 @@ namespace OpenSim.Region.Framework.Scenes | |||
2261 | BypassRayCast, bRayEndIsIntersection,true,scale, false); | 2056 | BypassRayCast, bRayEndIsIntersection,true,scale, false); |
2262 | 2057 | ||
2263 | // Rez object | 2058 | // Rez object |
2264 | CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 2059 | InventoryItemBase item = InventoryService.QueryItem(new InventoryItemBase(itemID)); |
2265 | if (userInfo != null) | 2060 | |
2061 | if (item != null) | ||
2266 | { | 2062 | { |
2267 | // Do NOT use HasReceivedInventory here, this is called | 2063 | AssetBase rezAsset = AssetService.Get(item.AssetID.ToString()); |
2268 | // from within ItemReceive during login for attachments. | 2064 | |
2269 | // Using HasReceivedInventory here will break attachment | 2065 | if (rezAsset != null) |
2270 | // persistence! | ||
2271 | // | ||
2272 | if (userInfo.RootFolder != null) | ||
2273 | { | 2066 | { |
2274 | InventoryItemBase item = userInfo.RootFolder.FindItem(itemID); | 2067 | UUID itemId = UUID.Zero; |
2275 | 2068 | ||
2276 | if (item != null) | 2069 | // If we have permission to copy then link the rezzed object back to the user inventory |
2070 | // item that it came from. This allows us to enable 'save object to inventory' | ||
2071 | if (!Permissions.BypassPermissions()) | ||
2277 | { | 2072 | { |
2278 | AssetBase rezAsset = AssetService.Get(item.AssetID.ToString()); | 2073 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy) |
2279 | |||
2280 | if (rezAsset != null) | ||
2281 | { | 2074 | { |
2282 | UUID itemId = UUID.Zero; | 2075 | itemId = item.ID; |
2283 | 2076 | } | |
2284 | // If we have permission to copy then link the rezzed object back to the user inventory | 2077 | } |
2285 | // item that it came from. This allows us to enable 'save object to inventory' | 2078 | else |
2286 | if (!Permissions.BypassPermissions()) | 2079 | { |
2287 | { | 2080 | // Brave new fullperm world |
2288 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy) | 2081 | // |
2289 | { | 2082 | itemId = item.ID; |
2290 | itemId = item.ID; | 2083 | } |
2291 | } | ||
2292 | } | ||
2293 | else | ||
2294 | { | ||
2295 | // Brave new fullperm world | ||
2296 | // | ||
2297 | itemId = item.ID; | ||
2298 | } | ||
2299 | |||
2300 | string xmlData = Utils.BytesToString(rezAsset.Data); | ||
2301 | SceneObjectGroup group | ||
2302 | = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData); | ||
2303 | 2084 | ||
2304 | if (!Permissions.CanRezObject( | 2085 | string xmlData = Utils.BytesToString(rezAsset.Data); |
2305 | group.Children.Count, remoteClient.AgentId, pos) | 2086 | SceneObjectGroup group |
2306 | && !attachment) | 2087 | = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData); |
2307 | { | ||
2308 | return null; | ||
2309 | } | ||
2310 | 2088 | ||
2311 | group.ResetIDs(); | 2089 | if (!Permissions.CanRezObject( |
2090 | group.Children.Count, remoteClient.AgentId, pos) | ||
2091 | && !attachment) | ||
2092 | { | ||
2093 | return null; | ||
2094 | } | ||
2312 | 2095 | ||
2313 | if (attachment) | 2096 | group.ResetIDs(); |
2314 | group.RootPart.ObjectFlags |= (uint)PrimFlags.Phantom; | ||
2315 | 2097 | ||
2316 | AddNewSceneObject(group, true); | 2098 | if (attachment) |
2099 | group.RootPart.ObjectFlags |= (uint)PrimFlags.Phantom; | ||
2317 | 2100 | ||
2318 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); | 2101 | AddNewSceneObject(group, true); |
2319 | // if attachment we set it's asset id so object updates can reflect that | ||
2320 | // if not, we set it's position in world. | ||
2321 | if (!attachment) | ||
2322 | { | ||
2323 | float offsetHeight = 0; | ||
2324 | pos = GetNewRezLocation( | ||
2325 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | ||
2326 | BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false); | ||
2327 | pos.Z += offsetHeight; | ||
2328 | group.AbsolutePosition = pos; | ||
2329 | // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight); | ||
2330 | 2102 | ||
2331 | } | 2103 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); |
2332 | else | 2104 | // if attachment we set it's asset id so object updates can reflect that |
2333 | { | 2105 | // if not, we set it's position in world. |
2334 | group.SetFromAssetID(itemID); | 2106 | if (!attachment) |
2335 | } | 2107 | { |
2108 | float offsetHeight = 0; | ||
2109 | pos = GetNewRezLocation( | ||
2110 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | ||
2111 | BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false); | ||
2112 | pos.Z += offsetHeight; | ||
2113 | group.AbsolutePosition = pos; | ||
2114 | // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight); | ||
2336 | 2115 | ||
2337 | SceneObjectPart rootPart = null; | 2116 | } |
2338 | try | 2117 | else |
2339 | { | 2118 | { |
2340 | rootPart = group.GetChildPart(group.UUID); | 2119 | group.SetFromAssetID(itemID); |
2341 | } | 2120 | } |
2342 | catch (NullReferenceException) | ||
2343 | { | ||
2344 | string isAttachment = ""; | ||
2345 | 2121 | ||
2346 | if (attachment) | 2122 | SceneObjectPart rootPart = null; |
2347 | isAttachment = " Object was an attachment"; | 2123 | try |
2124 | { | ||
2125 | rootPart = group.GetChildPart(group.UUID); | ||
2126 | } | ||
2127 | catch (NullReferenceException) | ||
2128 | { | ||
2129 | string isAttachment = ""; | ||
2348 | 2130 | ||
2349 | m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment); | 2131 | if (attachment) |
2350 | } | 2132 | isAttachment = " Object was an attachment"; |
2351 | 2133 | ||
2352 | // Since renaming the item in the inventory does not affect the name stored | 2134 | m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment); |
2353 | // in the serialization, transfer the correct name from the inventory to the | 2135 | } |
2354 | // object itself before we rez. | ||
2355 | rootPart.Name = item.Name; | ||
2356 | rootPart.Description = item.Description; | ||
2357 | 2136 | ||
2358 | List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values); | 2137 | // Since renaming the item in the inventory does not affect the name stored |
2138 | // in the serialization, transfer the correct name from the inventory to the | ||
2139 | // object itself before we rez. | ||
2140 | rootPart.Name = item.Name; | ||
2141 | rootPart.Description = item.Description; | ||
2359 | 2142 | ||
2360 | group.SetGroup(remoteClient.ActiveGroupId, remoteClient); | 2143 | List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values); |
2361 | if (rootPart.OwnerID != item.Owner) | ||
2362 | { | ||
2363 | //Need to kill the for sale here | ||
2364 | rootPart.ObjectSaleType = 0; | ||
2365 | rootPart.SalePrice = 10; | ||
2366 | 2144 | ||
2367 | if (Permissions.PropagatePermissions()) | 2145 | group.SetGroup(remoteClient.ActiveGroupId, remoteClient); |
2368 | { | 2146 | if (rootPart.OwnerID != item.Owner) |
2369 | if ((item.CurrentPermissions & 8) != 0) | 2147 | { |
2370 | { | 2148 | //Need to kill the for sale here |
2371 | foreach (SceneObjectPart part in partList) | 2149 | rootPart.ObjectSaleType = 0; |
2372 | { | 2150 | rootPart.SalePrice = 10; |
2373 | part.EveryoneMask = item.EveryOnePermissions; | ||
2374 | part.NextOwnerMask = item.NextPermissions; | ||
2375 | part.GroupMask = 0; // DO NOT propagate here | ||
2376 | } | ||
2377 | } | ||
2378 | group.ApplyNextOwnerPermissions(); | ||
2379 | } | ||
2380 | } | ||
2381 | 2151 | ||
2382 | foreach (SceneObjectPart part in partList) | 2152 | if (Permissions.PropagatePermissions()) |
2153 | { | ||
2154 | if ((item.CurrentPermissions & 8) != 0) | ||
2383 | { | 2155 | { |
2384 | if (part.OwnerID != item.Owner) | 2156 | foreach (SceneObjectPart part in partList) |
2385 | { | ||
2386 | part.LastOwnerID = part.OwnerID; | ||
2387 | part.OwnerID = item.Owner; | ||
2388 | part.Inventory.ChangeInventoryOwner(item.Owner); | ||
2389 | } | ||
2390 | else if (((item.CurrentPermissions & 8) != 0) && (!attachment)) // Slam! | ||
2391 | { | 2157 | { |
2392 | part.EveryoneMask = item.EveryOnePermissions; | 2158 | part.EveryoneMask = item.EveryOnePermissions; |
2393 | part.NextOwnerMask = item.NextPermissions; | 2159 | part.NextOwnerMask = item.NextPermissions; |
2394 | |||
2395 | part.GroupMask = 0; // DO NOT propagate here | 2160 | part.GroupMask = 0; // DO NOT propagate here |
2396 | } | 2161 | } |
2397 | } | 2162 | } |
2163 | group.ApplyNextOwnerPermissions(); | ||
2164 | } | ||
2165 | } | ||
2398 | 2166 | ||
2399 | rootPart.TrimPermissions(); | 2167 | foreach (SceneObjectPart part in partList) |
2168 | { | ||
2169 | if (part.OwnerID != item.Owner) | ||
2170 | { | ||
2171 | part.LastOwnerID = part.OwnerID; | ||
2172 | part.OwnerID = item.Owner; | ||
2173 | part.Inventory.ChangeInventoryOwner(item.Owner); | ||
2174 | } | ||
2175 | else if (((item.CurrentPermissions & 8) != 0) && (!attachment)) // Slam! | ||
2176 | { | ||
2177 | part.EveryoneMask = item.EveryOnePermissions; | ||
2178 | part.NextOwnerMask = item.NextPermissions; | ||
2400 | 2179 | ||
2401 | if (!attachment) | 2180 | part.GroupMask = 0; // DO NOT propagate here |
2402 | { | 2181 | } |
2403 | if (group.RootPart.Shape.PCode == (byte)PCode.Prim) | 2182 | } |
2404 | { | ||
2405 | group.ClearPartAttachmentData(); | ||
2406 | } | ||
2407 | } | ||
2408 | 2183 | ||
2409 | if (!attachment) | 2184 | rootPart.TrimPermissions(); |
2410 | { | ||
2411 | // Fire on_rez | ||
2412 | group.CreateScriptInstances(0, true, DefaultScriptEngine, 0); | ||
2413 | 2185 | ||
2414 | rootPart.ScheduleFullUpdate(); | 2186 | if (!attachment) |
2415 | } | 2187 | { |
2188 | if (group.RootPart.Shape.PCode == (byte)PCode.Prim) | ||
2189 | { | ||
2190 | group.ClearPartAttachmentData(); | ||
2191 | } | ||
2192 | } | ||
2416 | 2193 | ||
2417 | if (!Permissions.BypassPermissions()) | 2194 | if (!attachment) |
2418 | { | 2195 | { |
2419 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | 2196 | // Fire on_rez |
2420 | { | 2197 | group.CreateScriptInstances(0, true, DefaultScriptEngine, 0); |
2421 | // If this is done on attachments, no | 2198 | |
2422 | // copy ones will be lost, so avoid it | 2199 | rootPart.ScheduleFullUpdate(); |
2423 | // | 2200 | } |
2424 | if (!attachment) | ||
2425 | userInfo.DeleteItem(item.ID); | ||
2426 | } | ||
2427 | } | ||
2428 | 2201 | ||
2429 | return rootPart.ParentGroup; | 2202 | if (!Permissions.BypassPermissions()) |
2203 | { | ||
2204 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
2205 | { | ||
2206 | // If this is done on attachments, no | ||
2207 | // copy ones will be lost, so avoid it | ||
2208 | // | ||
2209 | if (!attachment) | ||
2210 | InventoryService.DeleteItem(item); | ||
2430 | } | 2211 | } |
2431 | } | 2212 | } |
2213 | |||
2214 | return rootPart.ParentGroup; | ||
2432 | } | 2215 | } |
2433 | else | ||
2434 | m_log.WarnFormat("[AGENT INVENTORY]: Root folder not found in {0}", RegionInfo.RegionName); | ||
2435 | } | 2216 | } |
2436 | else | ||
2437 | m_log.WarnFormat("[AGENT INVENTORY]: User profile not found in {0}", RegionInfo.RegionName); | ||
2438 | 2217 | ||
2439 | return null; | 2218 | return null; |
2440 | } | 2219 | } |
@@ -2681,13 +2460,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2681 | ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | 2460 | ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance); |
2682 | } | 2461 | } |
2683 | part.ParentGroup.DetachToGround(); | 2462 | part.ParentGroup.DetachToGround(); |
2684 | CachedUserInfo userInfo = | 2463 | |
2685 | CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 2464 | InventoryService.DeleteItem(new InventoryItemBase(inventoryID)); |
2686 | if (userInfo != null) | 2465 | remoteClient.SendRemoveInventoryItem(inventoryID); |
2687 | { | ||
2688 | userInfo.DeleteItem(inventoryID); | ||
2689 | remoteClient.SendRemoveInventoryItem(inventoryID); | ||
2690 | } | ||
2691 | } | 2466 | } |
2692 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); | 2467 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); |
2693 | } | 2468 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 113918d..ba858ed 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -435,17 +435,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
435 | return; | 435 | return; |
436 | } | 436 | } |
437 | 437 | ||
438 | CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 438 | SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); |
439 | |||
440 | if (null == userProfile) | ||
441 | { | ||
442 | m_log.ErrorFormat( | ||
443 | "[AGENT INVENTORY]: Could not find user profile for {0} {1}", | ||
444 | remoteClient.Name, remoteClient.AgentId); | ||
445 | return; | ||
446 | } | ||
447 | |||
448 | userProfile.SendInventoryDecendents(remoteClient, folderID, fetchFolders, fetchItems); | ||
449 | } | 439 | } |
450 | 440 | ||
451 | /// <summary> | 441 | /// <summary> |
@@ -543,19 +533,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
543 | public void HandleCreateInventoryFolder(IClientAPI remoteClient, UUID folderID, ushort folderType, | 533 | public void HandleCreateInventoryFolder(IClientAPI remoteClient, UUID folderID, ushort folderType, |
544 | string folderName, UUID parentID) | 534 | string folderName, UUID parentID) |
545 | { | 535 | { |
546 | CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 536 | InventoryFolderBase folder = new InventoryFolderBase(folderID, folderName, remoteClient.AgentId, (short)folderType, parentID, 1); |
547 | 537 | if (!InventoryService.AddFolder(folder)) | |
548 | if (null == userProfile) | ||
549 | { | ||
550 | m_log.ErrorFormat( | ||
551 | "[AGENT INVENTORY]: Could not find user profile for {0} {1}", | ||
552 | remoteClient.Name, remoteClient.AgentId); | ||
553 | return; | ||
554 | } | ||
555 | |||
556 | if (!userProfile.CreateFolder(folderName, folderID, folderType, parentID)) | ||
557 | { | 538 | { |
558 | m_log.ErrorFormat( | 539 | m_log.WarnFormat( |
559 | "[AGENT INVENTORY]: Failed to move create folder for user {0} {1}", | 540 | "[AGENT INVENTORY]: Failed to move create folder for user {0} {1}", |
560 | remoteClient.Name, remoteClient.AgentId); | 541 | remoteClient.Name, remoteClient.AgentId); |
561 | } | 542 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 919075c..0c99166 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -3510,59 +3510,53 @@ namespace OpenSim.Region.Framework.Scenes | |||
3510 | case 2: // Sell a copy | 3510 | case 2: // Sell a copy |
3511 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group); | 3511 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group); |
3512 | 3512 | ||
3513 | CachedUserInfo userInfo = | 3513 | uint perms=group.GetEffectivePermissions(); |
3514 | CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | ||
3515 | 3514 | ||
3516 | if (userInfo != null) | 3515 | if ((perms & (uint)PermissionMask.Transfer) == 0) |
3517 | { | 3516 | { |
3518 | uint perms=group.GetEffectivePermissions(); | 3517 | m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); |
3519 | 3518 | return false; | |
3520 | if ((perms & (uint)PermissionMask.Transfer) == 0) | 3519 | } |
3521 | { | ||
3522 | m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale"); | ||
3523 | return false; | ||
3524 | } | ||
3525 | 3520 | ||
3526 | AssetBase asset = CreateAsset( | 3521 | AssetBase asset = CreateAsset( |
3527 | group.GetPartName(localID), | 3522 | group.GetPartName(localID), |
3528 | group.GetPartDescription(localID), | 3523 | group.GetPartDescription(localID), |
3529 | (sbyte)AssetType.Object, | 3524 | (sbyte)AssetType.Object, |
3530 | Utils.StringToBytes(sceneObjectXml)); | 3525 | Utils.StringToBytes(sceneObjectXml)); |
3531 | AssetService.Store(asset); | 3526 | AssetService.Store(asset); |
3532 | 3527 | ||
3533 | InventoryItemBase item = new InventoryItemBase(); | 3528 | InventoryItemBase item = new InventoryItemBase(); |
3534 | item.CreatorId = part.CreatorID.ToString(); | 3529 | item.CreatorId = part.CreatorID.ToString(); |
3535 | 3530 | ||
3536 | item.ID = UUID.Random(); | 3531 | item.ID = UUID.Random(); |
3537 | item.Owner = remoteClient.AgentId; | 3532 | item.Owner = remoteClient.AgentId; |
3538 | item.AssetID = asset.FullID; | 3533 | item.AssetID = asset.FullID; |
3539 | item.Description = asset.Description; | 3534 | item.Description = asset.Description; |
3540 | item.Name = asset.Name; | 3535 | item.Name = asset.Name; |
3541 | item.AssetType = asset.Type; | 3536 | item.AssetType = asset.Type; |
3542 | item.InvType = (int)InventoryType.Object; | 3537 | item.InvType = (int)InventoryType.Object; |
3543 | item.Folder = categoryID; | 3538 | item.Folder = categoryID; |
3544 | 3539 | ||
3545 | uint nextPerms=(perms & 7) << 13; | 3540 | uint nextPerms=(perms & 7) << 13; |
3546 | if ((nextPerms & (uint)PermissionMask.Copy) == 0) | 3541 | if ((nextPerms & (uint)PermissionMask.Copy) == 0) |
3547 | perms &= ~(uint)PermissionMask.Copy; | 3542 | perms &= ~(uint)PermissionMask.Copy; |
3548 | if ((nextPerms & (uint)PermissionMask.Transfer) == 0) | 3543 | if ((nextPerms & (uint)PermissionMask.Transfer) == 0) |
3549 | perms &= ~(uint)PermissionMask.Transfer; | 3544 | perms &= ~(uint)PermissionMask.Transfer; |
3550 | if ((nextPerms & (uint)PermissionMask.Modify) == 0) | 3545 | if ((nextPerms & (uint)PermissionMask.Modify) == 0) |
3551 | perms &= ~(uint)PermissionMask.Modify; | 3546 | perms &= ~(uint)PermissionMask.Modify; |
3552 | 3547 | ||
3553 | item.BasePermissions = perms & part.NextOwnerMask; | 3548 | item.BasePermissions = perms & part.NextOwnerMask; |
3554 | item.CurrentPermissions = perms & part.NextOwnerMask; | 3549 | item.CurrentPermissions = perms & part.NextOwnerMask; |
3555 | item.NextPermissions = part.NextOwnerMask; | 3550 | item.NextPermissions = part.NextOwnerMask; |
3556 | item.EveryOnePermissions = part.EveryoneMask & | 3551 | item.EveryOnePermissions = part.EveryoneMask & |
3557 | part.NextOwnerMask; | 3552 | part.NextOwnerMask; |
3558 | item.GroupPermissions = part.GroupMask & | 3553 | item.GroupPermissions = part.GroupMask & |
3559 | part.NextOwnerMask; | 3554 | part.NextOwnerMask; |
3560 | item.CurrentPermissions |= 8; // Slam! | 3555 | item.CurrentPermissions |= 8; // Slam! |
3561 | item.CreationDate = Util.UnixTimeSinceEpoch(); | 3556 | item.CreationDate = Util.UnixTimeSinceEpoch(); |
3562 | 3557 | ||
3563 | userInfo.AddItem(item); | 3558 | if (InventoryService.AddItem(item)) |
3564 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | 3559 | remoteClient.SendInventoryItemCreateUpdate(item, 0); |
3565 | } | ||
3566 | else | 3560 | else |
3567 | { | 3561 | { |
3568 | m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); | 3562 | m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable"); |
@@ -3577,8 +3571,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3577 | 3571 | ||
3578 | foreach (UUID invID in invList) | 3572 | foreach (UUID invID in invList) |
3579 | { | 3573 | { |
3580 | TaskInventoryItem item = part.Inventory.GetInventoryItem(invID); | 3574 | TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID); |
3581 | if ((item.CurrentPermissions & | 3575 | if ((item1.CurrentPermissions & |
3582 | (uint)PermissionMask.Transfer) == 0) | 3576 | (uint)PermissionMask.Transfer) == 0) |
3583 | { | 3577 | { |
3584 | okToSell = false; | 3578 | okToSell = false; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 0e0999a..9599379 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -542,7 +542,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
542 | group.DetachToInventoryPrep(); | 542 | group.DetachToInventoryPrep(); |
543 | m_log.Debug("[DETACH]: Saving attachpoint: " + | 543 | m_log.Debug("[DETACH]: Saving attachpoint: " + |
544 | ((uint)group.GetAttachmentPoint()).ToString()); | 544 | ((uint)group.GetAttachmentPoint()).ToString()); |
545 | m_parentScene.updateKnownAsset(remoteClient, group, | 545 | m_parentScene.UpdateKnownItem(remoteClient, group, |
546 | group.GetFromAssetID(), group.OwnerID); | 546 | group.GetFromAssetID(), group.OwnerID); |
547 | m_parentScene.DeleteSceneObject(group, false); | 547 | m_parentScene.DeleteSceneObject(group, false); |
548 | return; | 548 | return; |
@@ -1307,7 +1307,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1307 | group.UpdateGroupPosition(pos); | 1307 | group.UpdateGroupPosition(pos); |
1308 | group.RootPart.IsAttachment = false; | 1308 | group.RootPart.IsAttachment = false; |
1309 | group.AbsolutePosition = group.RootPart.AttachedPos; | 1309 | group.AbsolutePosition = group.RootPart.AttachedPos; |
1310 | m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(), group.OwnerID); | 1310 | m_parentScene.UpdateKnownItem(remoteClient, group, group.GetFromAssetID(), group.OwnerID); |
1311 | group.SetAttachmentPoint(attachmentPoint); | 1311 | group.SetAttachmentPoint(attachmentPoint); |
1312 | 1312 | ||
1313 | } | 1313 | } |