From c90dd9e8cd4e9ec90859f188e5cee0ad306debdc Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sat, 18 Jul 2009 15:55:23 +0000 Subject: [PATCH] LIBOMV-638: Allow setting permission of newly created inventory in RequestCreateItemFromAsset() TODO: update examples to take advantage of this new feature git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@3002 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/InventoryManager.cs | 78 +++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index 57d85f48..4bdcd34e 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -917,12 +917,12 @@ namespace OpenMetaverse public delegate void TaskInventoryReplyCallback(UUID itemID, short serial, string assetFilename); /// - /// Reply received when uploading an invetnory asset + /// Reply received when uploading an inventory asset /// /// Has upload been successful /// Error message if upload failed /// Inventory asset UUID - /// New gesture asset UUID + /// New asset UUID public delegate void InventoryUploadedAssetCallback(bool success, string status, UUID itemID, UUID assetID); /// @@ -1882,8 +1882,41 @@ namespace OpenMetaverse return id; } + /// + /// Create an inventory item and upload asset data + /// + /// Asset data + /// Inventory item name + /// Inventory item description + /// Asset type + /// Inventory type + /// Put newly created inventory in this folder + /// Delegate that will receive feedback on success or failure public void RequestCreateItemFromAsset(byte[] data, string name, string description, AssetType assetType, InventoryType invType, UUID folderID, ItemCreatedFromAssetCallback callback) + { + Permissions permissions = new Permissions(); + permissions.EveryoneMask = PermissionMask.None; + permissions.GroupMask = PermissionMask.None; + permissions.NextOwnerMask = PermissionMask.All; + + RequestCreateItemFromAsset(data, name, description, assetType, invType, folderID, permissions, callback); + } + + /// + /// Create an inventory item and upload asset data + /// + /// Asset data + /// Inventory item name + /// Inventory item description + /// Asset type + /// Inventory type + /// Put newly created inventory in this folder + /// Permission of the newly created item + /// (EveryoneMask, GroupMask, and NextOwnerMask of Permissions struct are supported) + /// Delegate that will receive feedback on success or failure + public void RequestCreateItemFromAsset(byte[] data, string name, string description, AssetType assetType, + InventoryType invType, UUID folderID, Permissions permissions, ItemCreatedFromAssetCallback callback) { if (_Client.Network.CurrentSim == null || _Client.Network.CurrentSim.Caps == null) throw new Exception("NewFileAgentInventory capability is not currently available"); @@ -1898,11 +1931,15 @@ namespace OpenMetaverse query.Add("inventory_type", OSD.FromString(Utils.InventoryTypeToString(invType))); query.Add("name", OSD.FromString(name)); query.Add("description", OSD.FromString(description)); + query.Add("everyone_mask", OSD.FromInteger((int)permissions.EveryoneMask)); + query.Add("group_mask", OSD.FromInteger((int)permissions.GroupMask)); + query.Add("next_owner_mask", OSD.FromInteger((int)permissions.NextOwnerMask)); + query.Add("expected_upload_cost", OSD.FromInteger(_Client.Settings.UPLOAD_COST)); // Make the request CapsClient request = new CapsClient(url); request.OnComplete += CreateItemFromAssetResponse; - request.UserData = new object[] { callback, data, _Client.Settings.CAPS_TIMEOUT }; + request.UserData = new object[] { callback, data, _Client.Settings.CAPS_TIMEOUT, query }; request.BeginGetResponse(query, OSDFormat.Xml, _Client.Settings.CAPS_TIMEOUT); } @@ -3184,7 +3221,8 @@ namespace OpenMetaverse ItemCreatedFromAssetCallback callback = (ItemCreatedFromAssetCallback)args[0]; byte[] itemData = (byte[])args[1]; int millisecondsTimeout = (int)args[2]; - + OSDMap request = (OSDMap)args[3]; + if (result == null) { try { callback(false, error.Message, UUID.Zero, UUID.Zero); } @@ -3206,7 +3244,7 @@ namespace OpenMetaverse // the problem of HttpRequestState not knowing anything about simulators CapsClient upload = new CapsClient(new Uri(uploadURL)); upload.OnComplete += CreateItemFromAssetResponse; - upload.UserData = new object[] { callback, itemData, millisecondsTimeout }; + upload.UserData = new object[] { callback, itemData, millisecondsTimeout, request }; upload.BeginGetResponse(itemData, "application/octet-stream", millisecondsTimeout); } else if (status == "complete") @@ -3215,6 +3253,36 @@ namespace OpenMetaverse if (contents.ContainsKey("new_inventory_item") && contents.ContainsKey("new_asset")) { + // Update the local store + InventoryItem item = CreateInventoryItem(Utils.StringToInventoryType(request["inventory_type"].AsString()), contents["new_inventory_item"].AsUUID()); + item.Name = request["name"].AsString(); + item.Description = request["description"].AsString(); + item.OwnerID = _Client.Self.AgentID; + item.CreatorID = _Client.Self.AgentID; + item.AssetUUID = contents["new_asset"].AsUUID(); + item.AssetType = Utils.StringToAssetType(request["asset_type"].AsString()); + item.ParentUUID = request["folder_id"].AsUUID(); + + try + { + item.CreationDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")); + } + catch (Exception) { item.CreationDate = DateTime.Now; } + + if (contents.ContainsKey("new_next_owner_mask")) + item.Permissions.NextOwnerMask = (PermissionMask)contents["new_next_owner_mask"].AsInteger(); + if (contents.ContainsKey("new_everyone_mask")) + item.Permissions.EveryoneMask = (PermissionMask)contents["new_everyone_mask"].AsInteger(); + if (contents.ContainsKey("new_base_mask")) + item.Permissions.BaseMask = (PermissionMask)contents["new_base_mask"].AsInteger(); + if (contents.ContainsKey("new_group_mask")) + item.Permissions.GroupMask = (PermissionMask)contents["new_group_mask"].AsInteger(); + if (contents.ContainsKey("new_owner_mask")) + item.Permissions.OwnerMask = (PermissionMask)contents["new_owner_mask"].AsInteger(); + + try { _Store[item.UUID] = item; } + catch (InventoryException ie) { Logger.Log(ie.Message, Helpers.LogLevel.Warning, _Client, ie); } + try { callback(true, String.Empty, contents["new_inventory_item"].AsUUID(), contents["new_asset"].AsUUID()); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } }