aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs175
1 files changed, 149 insertions, 26 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 568e216..774202e 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -44,11 +44,13 @@ using OpenSim.Region.Framework.Scenes;
44using OpenSim.Region.Framework.Scenes.Serialization; 44using OpenSim.Region.Framework.Scenes.Serialization;
45using OpenSim.Framework.Servers; 45using OpenSim.Framework.Servers;
46using OpenSim.Framework.Servers.HttpServer; 46using OpenSim.Framework.Servers.HttpServer;
47using OpenSim.Framework.Client;
47using OpenSim.Services.Interfaces; 48using OpenSim.Services.Interfaces;
48 49
49using Caps = OpenSim.Framework.Capabilities.Caps; 50using Caps = OpenSim.Framework.Capabilities.Caps;
50using OSDArray = OpenMetaverse.StructuredData.OSDArray; 51using OSDArray = OpenMetaverse.StructuredData.OSDArray;
51using OSDMap = OpenMetaverse.StructuredData.OSDMap; 52using OSDMap = OpenMetaverse.StructuredData.OSDMap;
53using PermissionMask = OpenSim.Framework.PermissionMask;
52 54
53namespace OpenSim.Region.ClientStack.Linden 55namespace OpenSim.Region.ClientStack.Linden
54{ 56{
@@ -96,6 +98,8 @@ namespace OpenSim.Region.ClientStack.Linden
96 // private static readonly string m_fetchInventoryPath = "0006/"; 98 // private static readonly string m_fetchInventoryPath = "0006/";
97 private static readonly string m_copyFromNotecardPath = "0007/"; 99 private static readonly string m_copyFromNotecardPath = "0007/";
98 // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule. 100 // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule.
101 private static readonly string m_getObjectPhysicsDataPath = "0101/";
102 /* 0102 - 0103 RESERVED */
99 private static readonly string m_UpdateAgentInformationPath = "0500/"; 103 private static readonly string m_UpdateAgentInformationPath = "0500/";
100 104
101 // These are callbacks which will be setup by the scene so that we can update scene data when we 105 // These are callbacks which will be setup by the scene so that we can update scene data when we
@@ -204,7 +208,15 @@ namespace OpenSim.Region.ClientStack.Linden
204 m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req); 208 m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req);
205 m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req); 209 m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req);
206 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); 210 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
207 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation); 211
212 IRequestHandler getObjectPhysicsDataHandler
213 = new RestStreamHandler(
214 "POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData, "GetObjectPhysicsData", null);
215 m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler);
216
217 IRequestHandler UpdateAgentInformationHandler
218 = new RestStreamHandler(
219 "POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation, "UpdateAgentInformation", null);
208 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler); 220 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler);
209 221
210 m_HostCapsObj.RegisterHandler( 222 m_HostCapsObj.RegisterHandler(
@@ -256,8 +268,8 @@ namespace OpenSim.Region.ClientStack.Linden
256 public string SeedCapRequest(string request, string path, string param, 268 public string SeedCapRequest(string request, string path, string param,
257 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 269 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
258 { 270 {
259 m_log.DebugFormat( 271// m_log.DebugFormat(
260 "[CAPS]: Received SEED caps request in {0} for agent {1}", m_regionName, m_HostCapsObj.AgentID); 272// "[CAPS]: Received SEED caps request in {0} for agent {1}", m_regionName, m_HostCapsObj.AgentID);
261 273
262 if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint)) 274 if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint))
263 { 275 {
@@ -268,13 +280,13 @@ namespace OpenSim.Region.ClientStack.Linden
268 return string.Empty; 280 return string.Empty;
269 } 281 }
270 282
271 Hashtable caps = m_HostCapsObj.CapsHandlers.GetCapsDetails(true); 283 OSDArray capsRequested = (OSDArray)OSDParser.DeserializeLLSDXml(request);
284 List<string> validCaps = new List<string>();
272 285
273 // Add the external too 286 foreach (OSD c in capsRequested)
274 foreach (KeyValuePair<string, string> kvp in m_HostCapsObj.ExternalCapsHandlers) 287 validCaps.Add(c.AsString());
275 caps[kvp.Key] = kvp.Value;
276 288
277 string result = LLSDHelpers.SerialiseLLSDReply(caps); 289 string result = LLSDHelpers.SerialiseLLSDReply(m_HostCapsObj.GetCapsDetails(true, validCaps));
278 290
279 //m_log.DebugFormat("[CAPS] CapsRequest {0}", result); 291 //m_log.DebugFormat("[CAPS] CapsRequest {0}", result);
280 292
@@ -487,24 +499,28 @@ namespace OpenSim.Region.ClientStack.Linden
487 499
488 if (inventoryType == "sound") 500 if (inventoryType == "sound")
489 { 501 {
490 inType = 1; 502 inType = (sbyte)InventoryType.Sound;
491 assType = 1; 503 assType = (sbyte)AssetType.Sound;
504 }
505 else if (inventoryType == "snapshot")
506 {
507 inType = (sbyte)InventoryType.Snapshot;
492 } 508 }
493 else if (inventoryType == "animation") 509 else if (inventoryType == "animation")
494 { 510 {
495 inType = 19; 511 inType = (sbyte)InventoryType.Animation;
496 assType = 20; 512 assType = (sbyte)AssetType.Animation;
497 } 513 }
498 else if (inventoryType == "wearable") 514 else if (inventoryType == "wearable")
499 { 515 {
500 inType = 18; 516 inType = (sbyte)InventoryType.Wearable;
501 switch (assetType) 517 switch (assetType)
502 { 518 {
503 case "bodypart": 519 case "bodypart":
504 assType = 13; 520 assType = (sbyte)AssetType.Bodypart;
505 break; 521 break;
506 case "clothing": 522 case "clothing":
507 assType = 5; 523 assType = (sbyte)AssetType.Clothing;
508 break; 524 break;
509 } 525 }
510 } 526 }
@@ -521,6 +537,41 @@ namespace OpenSim.Region.ClientStack.Linden
521 OSDArray texture_list = (OSDArray)request["texture_list"]; 537 OSDArray texture_list = (OSDArray)request["texture_list"];
522 SceneObjectGroup grp = null; 538 SceneObjectGroup grp = null;
523 539
540 InventoryFolderBase textureUploadFolder = null;
541
542 List<InventoryFolderBase> foldersToUpdate = new List<InventoryFolderBase>();
543 List<InventoryItemBase> itemsToUpdate = new List<InventoryItemBase>();
544 IClientInventory clientInv = null;
545
546 if (texture_list.Count > 0)
547 {
548 ScenePresence avatar = null;
549 m_Scene.TryGetScenePresence(m_HostCapsObj.AgentID, out avatar);
550
551 if (avatar != null)
552 {
553 IClientCore core = (IClientCore)avatar.ControllingClient;
554
555 if (core.TryGet<IClientInventory>(out clientInv))
556 {
557 var systemTextureFolder = m_Scene.InventoryService.GetFolderForType(m_HostCapsObj.AgentID, FolderType.Texture);
558 textureUploadFolder = new InventoryFolderBase(UUID.Random(), assetName, m_HostCapsObj.AgentID, (short)FolderType.None, systemTextureFolder.ID, 1);
559 if (m_Scene.InventoryService.AddFolder(textureUploadFolder))
560 {
561 foldersToUpdate.Add(textureUploadFolder);
562
563 m_log.DebugFormat(
564 "[BUNCH OF CAPS]: Created new folder '{0}' ({1}) for textures uploaded with mesh object {2}",
565 textureUploadFolder.Name, textureUploadFolder.ID, assetName);
566 }
567 else
568 {
569 textureUploadFolder = null;
570 }
571 }
572 }
573 }
574
524 List<UUID> textures = new List<UUID>(); 575 List<UUID> textures = new List<UUID>();
525 for (int i = 0; i < texture_list.Count; i++) 576 for (int i = 0; i < texture_list.Count; i++)
526 { 577 {
@@ -528,6 +579,38 @@ namespace OpenSim.Region.ClientStack.Linden
528 textureAsset.Data = texture_list[i].AsBinary(); 579 textureAsset.Data = texture_list[i].AsBinary();
529 m_assetService.Store(textureAsset); 580 m_assetService.Store(textureAsset);
530 textures.Add(textureAsset.FullID); 581 textures.Add(textureAsset.FullID);
582
583 if (textureUploadFolder != null)
584 {
585 InventoryItemBase textureItem = new InventoryItemBase();
586 textureItem.Owner = m_HostCapsObj.AgentID;
587 textureItem.CreatorId = m_HostCapsObj.AgentID.ToString();
588 textureItem.CreatorData = String.Empty;
589 textureItem.ID = UUID.Random();
590 textureItem.AssetID = textureAsset.FullID;
591 textureItem.Description = assetDescription;
592 textureItem.Name = assetName + " - Texture " + (i + 1).ToString();
593 textureItem.AssetType = (int)AssetType.Texture;
594 textureItem.InvType = (int)InventoryType.Texture;
595 textureItem.Folder = textureUploadFolder.ID;
596 textureItem.CurrentPermissions
597 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Export);
598 textureItem.BasePermissions = (uint)PermissionMask.All | (uint)PermissionMask.Export;
599 textureItem.EveryOnePermissions = 0;
600 textureItem.NextPermissions = (uint)PermissionMask.All;
601 textureItem.CreationDate = Util.UnixTimeSinceEpoch();
602 m_Scene.InventoryService.AddItem(textureItem);
603 itemsToUpdate.Add(textureItem);
604
605 m_log.DebugFormat(
606 "[BUNCH OF CAPS]: Created new inventory item '{0}' ({1}) for texture uploaded with mesh object {2}",
607 textureItem.Name, textureItem.ID, assetName);
608 }
609 }
610
611 if (clientInv != null && (foldersToUpdate.Count > 0 || itemsToUpdate.Count > 0))
612 {
613 clientInv.SendBulkUpdateInventory(foldersToUpdate.ToArray(), itemsToUpdate.ToArray());
531 } 614 }
532 615
533 for (int i = 0; i < mesh_list.Count; i++) 616 for (int i = 0; i < mesh_list.Count; i++)
@@ -701,9 +784,9 @@ namespace OpenSim.Region.ClientStack.Linden
701 // If we set PermissionMask.All then when we rez the item the next permissions will replace the current 784 // If we set PermissionMask.All then when we rez the item the next permissions will replace the current
702 // (owner) permissions. This becomes a problem if next permissions are changed. 785 // (owner) permissions. This becomes a problem if next permissions are changed.
703 item.CurrentPermissions 786 item.CurrentPermissions
704 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); 787 = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Export);
705 788
706 item.BasePermissions = (uint)PermissionMask.All; 789 item.BasePermissions = (uint)PermissionMask.All | (uint)PermissionMask.Export;
707 item.EveryOnePermissions = 0; 790 item.EveryOnePermissions = 0;
708 item.NextPermissions = (uint)PermissionMask.All; 791 item.NextPermissions = (uint)PermissionMask.All;
709 item.CreationDate = Util.UnixTimeSinceEpoch(); 792 item.CreationDate = Util.UnixTimeSinceEpoch();
@@ -850,18 +933,26 @@ namespace OpenSim.Region.ClientStack.Linden
850 item = m_Scene.InventoryService.GetItem(new InventoryItemBase(itemID)); 933 item = m_Scene.InventoryService.GetItem(new InventoryItemBase(itemID));
851 if (item != null) 934 if (item != null)
852 { 935 {
853 copyItem = m_Scene.GiveInventoryItem(m_HostCapsObj.AgentID, item.Owner, itemID, folderID); 936 string message;
854 if (copyItem != null && client != null) 937 copyItem = m_Scene.GiveInventoryItem(m_HostCapsObj.AgentID, item.Owner, itemID, folderID, out message);
938 if (client != null)
855 { 939 {
856 m_log.InfoFormat("[CAPS]: CopyInventoryFromNotecard, ItemID:{0}, FolderID:{1}", copyItem.ID, copyItem.Folder); 940 if (copyItem != null)
857 client.SendBulkUpdateInventory(copyItem); 941 {
942 m_log.InfoFormat("[CAPS]: CopyInventoryFromNotecard, ItemID:{0}, FolderID:{1}", copyItem.ID, copyItem.Folder);
943 client.SendBulkUpdateInventory(copyItem);
944 }
945 else
946 {
947 client.SendAgentAlertMessage(message, false);
948 }
858 } 949 }
859 } 950 }
860 else 951 else
861 { 952 {
862 m_log.ErrorFormat("[CAPS]: CopyInventoryFromNotecard - Failed to retrieve item {0} from notecard {1}", itemID, notecardID); 953 m_log.ErrorFormat("[CAPS]: CopyInventoryFromNotecard - Failed to retrieve item {0} from notecard {1}", itemID, notecardID);
863 if (client != null) 954 if (client != null)
864 client.SendAlertMessage("Failed to retrieve item"); 955 client.SendAgentAlertMessage("Failed to retrieve item", false);
865 } 956 }
866 } 957 }
867 catch (Exception e) 958 catch (Exception e)
@@ -873,17 +964,49 @@ namespace OpenSim.Region.ClientStack.Linden
873 return LLSDHelpers.SerialiseLLSDReply(response); 964 return LLSDHelpers.SerialiseLLSDReply(response);
874 } 965 }
875 966
876 public string UpdateAgentInformation(string request, string path, 967 public string GetObjectPhysicsData(string request, string path,
877 string param, IOSHttpRequest httpRequest, 968 string param, IOSHttpRequest httpRequest,
878 IOSHttpResponse httpResponse) 969 IOSHttpResponse httpResponse)
879 { 970 {
880 OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request); 971 OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
881 OSDMap resp = new OSDMap(); 972 OSDMap resp = new OSDMap();
973 OSDArray object_ids = (OSDArray)req["object_ids"];
882 974
883 OSDMap accessPrefs = new OSDMap(); 975 for (int i = 0 ; i < object_ids.Count ; i++)
884 accessPrefs["max"] = "A"; 976 {
977 UUID uuid = object_ids[i].AsUUID();
978
979 SceneObjectPart obj = m_Scene.GetSceneObjectPart(uuid);
980 if (obj != null)
981 {
982 OSDMap object_data = new OSDMap();
885 983
886 resp["access_prefs"] = accessPrefs; 984 object_data["PhysicsShapeType"] = obj.PhysicsShapeType;
985 object_data["Density"] = obj.Density;
986 object_data["Friction"] = obj.Friction;
987 object_data["Restitution"] = obj.Restitution;
988 object_data["GravityMultiplier"] = obj.GravityModifier;
989
990 resp[uuid.ToString()] = object_data;
991 }
992 }
993
994 string response = OSDParser.SerializeLLSDXmlString(resp);
995 return response;
996 }
997
998 public string UpdateAgentInformation(string request, string path,
999 string param, IOSHttpRequest httpRequest,
1000 IOSHttpResponse httpResponse)
1001 {
1002 OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
1003 OSDMap accessPrefs = (OSDMap)req["access_prefs"];
1004 string desiredMaturity = accessPrefs["max"];
1005
1006 OSDMap resp = new OSDMap();
1007 OSDMap respAccessPrefs = new OSDMap();
1008 respAccessPrefs["max"] = desiredMaturity; // echoing the maturity back means success
1009 resp["access_prefs"] = respAccessPrefs;
887 1010
888 string response = OSDParser.SerializeLLSDXmlString(resp); 1011 string response = OSDParser.SerializeLLSDXmlString(resp);
889 return response; 1012 return response;