diff --git a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs index bc3798d206..d3fe753742 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/ObjectCaps/UploadObjectAssetModule.cs @@ -27,7 +27,7 @@ using System; using System.Collections; -using System.Collections.Specialized; +using System.Net; using System.Reflection; using System.IO; using System.Web; @@ -54,13 +54,12 @@ namespace OpenSim.Region.ClientStack.Linden [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UploadObjectAssetModule")] public class UploadObjectAssetModule : INonSharedRegionModule { - private static readonly ILog m_log = - LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private Scene m_scene; #region Region Module interfaceBase Members - public Type ReplaceableInterface { get { return null; } @@ -68,7 +67,6 @@ namespace OpenSim.Region.ClientStack.Linden public void Initialise(IConfigSource source) { - } public void AddRegion(Scene pScene) @@ -78,14 +76,12 @@ namespace OpenSim.Region.ClientStack.Linden public void RemoveRegion(Scene scene) { - m_scene.EventManager.OnRegisterCaps -= RegisterCaps; m_scene = null; } public void RegionLoaded(Scene scene) { - m_scene.EventManager.OnRegisterCaps += RegisterCaps; } @@ -94,8 +90,6 @@ namespace OpenSim.Region.ClientStack.Linden #region Region Module interface - - public void Close() { } public string Name { get { return "UploadObjectAssetModuleModule"; } } @@ -103,29 +97,12 @@ namespace OpenSim.Region.ClientStack.Linden public void RegisterCaps(UUID agentID, Caps caps) { - string capUrl = "/CAPS/" + UUID.Random() + "/"; - + caps.RegisterSimpleHandler("UploadObjectAsset", + new SimpleOSDMapHandler("POST","/" + UUID.Random(), delegate (IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap map) + { + ProcessAdd(httpRequest, httpResponse, map, agentID, caps); + })); // m_log.Debug("[UPLOAD OBJECT ASSET MODULE]: /CAPS/" + capID); - caps.RegisterHandler( - "UploadObjectAsset", - new RestHTTPHandler( - "POST", - capUrl, - httpMethod => ProcessAdd(httpMethod, agentID, caps), - "UploadObjectAsset", - agentID.ToString())); - - /* - caps.RegisterHandler("NewFileAgentInventoryVariablePrice", - - new LLSDStreamhandler("POST", - "/CAPS/" + capID.ToString(), - delegate(LLSDAssetUploadRequest req) - { - return NewAgentInventoryRequest(req,agentID); - })); - */ - } #endregion @@ -135,26 +112,23 @@ namespace OpenSim.Region.ClientStack.Linden /// Parses add request /// /// - /// + /// /// /// - public Hashtable ProcessAdd(Hashtable request, UUID AgentId, Caps cap) + public void ProcessAdd(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap map, UUID agentID, Caps cap) { - Hashtable responsedata = new Hashtable(); - responsedata["int_response_code"] = 400; //501; //410; //404; - responsedata["content_type"] = "text/plain"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = "Request wasn't what was expected"; - ScenePresence avatar; + httpResponse.KeepAlive = false; - if (!m_scene.TryGetScenePresence(AgentId, out avatar)) - return responsedata; + if (!m_scene.TryGetScenePresence(agentID, out ScenePresence avatar)) + { + httpResponse.StatusCode = (int)HttpStatusCode.Gone; + return; + } - OSDMap r = (OSDMap)OSDParser.Deserialize((string)request["requestbody"]); UploadObjectAssetMessage message = new UploadObjectAssetMessage(); try { - message.Deserialize(r); + message.Deserialize(map); } catch (Exception ex) @@ -165,208 +139,175 @@ namespace OpenSim.Region.ClientStack.Linden if (message == null) { - responsedata["int_response_code"] = 400; //501; //410; //404; - responsedata["content_type"] = "text/plain"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = - "errorError parsing Object"; - - return responsedata; + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + return; } - Vector3 pos = avatar.AbsolutePosition + (Vector3.UnitX * avatar.Rotation); - Quaternion rot = Quaternion.Identity; - Vector3 rootpos = Vector3.Zero; -// Quaternion rootrot = Quaternion.Identity; - - SceneObjectGroup rootGroup = null; - SceneObjectGroup[] allparts = new SceneObjectGroup[message.Objects.Length]; - for (int i = 0; i < message.Objects.Length; i++) + try { - UploadObjectAssetMessage.Object obj = message.Objects[i]; - PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox(); + Vector3 pos = avatar.AbsolutePosition + (Vector3.UnitX * avatar.Rotation); + Quaternion rot = Quaternion.Identity; + Vector3 rootpos = Vector3.Zero; - if (i == 0) + SceneObjectGroup rootGroup = null; + SceneObjectGroup[] allparts = new SceneObjectGroup[message.Objects.Length]; + for (int i = 0; i < message.Objects.Length; i++) { - rootpos = obj.Position; -// rootrot = obj.Rotation; - } + UploadObjectAssetMessage.Object obj = message.Objects[i]; + PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox(); - // Combine the extraparams data into it's ugly blob again.... - //int bytelength = 0; - //for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++) - //{ - // bytelength += obj.ExtraParams[extparams].ExtraParamData.Length; - //} - //byte[] extraparams = new byte[bytelength]; - //int position = 0; - - - - //for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++) - //{ - // Buffer.BlockCopy(obj.ExtraParams[extparams].ExtraParamData, 0, extraparams, position, - // obj.ExtraParams[extparams].ExtraParamData.Length); - // - // position += obj.ExtraParams[extparams].ExtraParamData.Length; - // } - - //pbs.ExtraParams = extraparams; - for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++) - { - UploadObjectAssetMessage.Object.ExtraParam extraParam = obj.ExtraParams[extparams]; - switch ((ushort)extraParam.Type) + if (i == 0) + rootpos = obj.Position; + + for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++) { - case (ushort)ExtraParamType.Sculpt: - Primitive.SculptData sculpt = new Primitive.SculptData(extraParam.ExtraParamData, 0); + UploadObjectAssetMessage.Object.ExtraParam extraParam = obj.ExtraParams[extparams]; + switch ((ushort)extraParam.Type) + { + case (ushort)ExtraParamType.Sculpt: + Primitive.SculptData sculpt = new Primitive.SculptData(extraParam.ExtraParamData, 0); - pbs.SculptEntry = true; + pbs.SculptEntry = true; - pbs.SculptTexture = obj.SculptID; - pbs.SculptType = (byte)sculpt.Type; + pbs.SculptTexture = obj.SculptID; + pbs.SculptType = (byte)sculpt.Type; - break; - case (ushort)ExtraParamType.Flexible: - Primitive.FlexibleData flex = new Primitive.FlexibleData(extraParam.ExtraParamData, 0); - pbs.FlexiEntry = true; - pbs.FlexiDrag = flex.Drag; - pbs.FlexiForceX = flex.Force.X; - pbs.FlexiForceY = flex.Force.Y; - pbs.FlexiForceZ = flex.Force.Z; - pbs.FlexiGravity = flex.Gravity; - pbs.FlexiSoftness = flex.Softness; - pbs.FlexiTension = flex.Tension; - pbs.FlexiWind = flex.Wind; - break; - case (ushort)ExtraParamType.Light: - Primitive.LightData light = new Primitive.LightData(extraParam.ExtraParamData, 0); - pbs.LightColorA = light.Color.A; - pbs.LightColorB = light.Color.B; - pbs.LightColorG = light.Color.G; - pbs.LightColorR = light.Color.R; - pbs.LightCutoff = light.Cutoff; - pbs.LightEntry = true; - pbs.LightFalloff = light.Falloff; - pbs.LightIntensity = light.Intensity; - pbs.LightRadius = light.Radius; - break; - case 0x40: - pbs.ReadProjectionData(extraParam.ExtraParamData, 0); - break; + break; + case (ushort)ExtraParamType.Flexible: + Primitive.FlexibleData flex = new Primitive.FlexibleData(extraParam.ExtraParamData, 0); + pbs.FlexiEntry = true; + pbs.FlexiDrag = flex.Drag; + pbs.FlexiForceX = flex.Force.X; + pbs.FlexiForceY = flex.Force.Y; + pbs.FlexiForceZ = flex.Force.Z; + pbs.FlexiGravity = flex.Gravity; + pbs.FlexiSoftness = flex.Softness; + pbs.FlexiTension = flex.Tension; + pbs.FlexiWind = flex.Wind; + break; + case (ushort)ExtraParamType.Light: + Primitive.LightData light = new Primitive.LightData(extraParam.ExtraParamData, 0); + pbs.LightColorA = light.Color.A; + pbs.LightColorB = light.Color.B; + pbs.LightColorG = light.Color.G; + pbs.LightColorR = light.Color.R; + pbs.LightCutoff = light.Cutoff; + pbs.LightEntry = true; + pbs.LightFalloff = light.Falloff; + pbs.LightIntensity = light.Intensity; + pbs.LightRadius = light.Radius; + break; + case 0x40: + pbs.ReadProjectionData(extraParam.ExtraParamData, 0); + break; + } } - } - pbs.PathBegin = (ushort) obj.PathBegin; - pbs.PathCurve = (byte) obj.PathCurve; - pbs.PathEnd = (ushort) obj.PathEnd; - pbs.PathRadiusOffset = (sbyte) obj.RadiusOffset; - pbs.PathRevolutions = (byte) obj.Revolutions; - pbs.PathScaleX = (byte) obj.ScaleX; - pbs.PathScaleY = (byte) obj.ScaleY; - pbs.PathShearX = (byte) obj.ShearX; - pbs.PathShearY = (byte) obj.ShearY; - pbs.PathSkew = (sbyte) obj.Skew; - pbs.PathTaperX = (sbyte) obj.TaperX; - pbs.PathTaperY = (sbyte) obj.TaperY; - pbs.PathTwist = (sbyte) obj.Twist; - pbs.PathTwistBegin = (sbyte) obj.TwistBegin; - pbs.HollowShape = (HollowShape) obj.ProfileHollow; - pbs.PCode = (byte) PCode.Prim; - pbs.ProfileBegin = (ushort) obj.ProfileBegin; - pbs.ProfileCurve = (byte) obj.ProfileCurve; - pbs.ProfileEnd = (ushort) obj.ProfileEnd; - pbs.Scale = obj.Scale; - pbs.State = (byte) 0; - pbs.LastAttachPoint = (byte) 0; - SceneObjectPart prim = new SceneObjectPart(); - prim.UUID = UUID.Random(); - prim.CreatorID = AgentId; - prim.OwnerID = AgentId; - prim.GroupID = obj.GroupID; - prim.LastOwnerID = prim.OwnerID; - prim.RezzerID = AgentId; - prim.CreationDate = Util.UnixTimeSinceEpoch(); - prim.Name = obj.Name; - prim.Description = ""; + pbs.PathBegin = (ushort) obj.PathBegin; + pbs.PathCurve = (byte) obj.PathCurve; + pbs.PathEnd = (ushort) obj.PathEnd; + pbs.PathRadiusOffset = (sbyte) obj.RadiusOffset; + pbs.PathRevolutions = (byte) obj.Revolutions; + pbs.PathScaleX = (byte) obj.ScaleX; + pbs.PathScaleY = (byte) obj.ScaleY; + pbs.PathShearX = (byte) obj.ShearX; + pbs.PathShearY = (byte) obj.ShearY; + pbs.PathSkew = (sbyte) obj.Skew; + pbs.PathTaperX = (sbyte) obj.TaperX; + pbs.PathTaperY = (sbyte) obj.TaperY; + pbs.PathTwist = (sbyte) obj.Twist; + pbs.PathTwistBegin = (sbyte) obj.TwistBegin; + pbs.HollowShape = (HollowShape) obj.ProfileHollow; + pbs.PCode = (byte) PCode.Prim; + pbs.ProfileBegin = (ushort) obj.ProfileBegin; + pbs.ProfileCurve = (byte) obj.ProfileCurve; + pbs.ProfileEnd = (ushort) obj.ProfileEnd; + pbs.Scale = obj.Scale; + pbs.State = (byte) 0; + pbs.LastAttachPoint = (byte) 0; + SceneObjectPart prim = new SceneObjectPart(); + prim.UUID = UUID.Random(); + prim.CreatorID = agentID; + prim.OwnerID = agentID; + prim.GroupID = obj.GroupID; + prim.LastOwnerID = prim.OwnerID; + prim.RezzerID = agentID; + prim.CreationDate = Util.UnixTimeSinceEpoch(); + prim.Name = obj.Name; + prim.Description = ""; - prim.PayPrice[0] = -2; - prim.PayPrice[1] = -2; - prim.PayPrice[2] = -2; - prim.PayPrice[3] = -2; - prim.PayPrice[4] = -2; - Primitive.TextureEntry tmp = - new Primitive.TextureEntry(UUID.Parse("89556747-24cb-43ed-920b-47caed15465f")); + prim.PayPrice[0] = -2; + prim.PayPrice[1] = -2; + prim.PayPrice[2] = -2; + prim.PayPrice[3] = -2; + prim.PayPrice[4] = -2; + Primitive.TextureEntry tmp = + new Primitive.TextureEntry(UUID.Parse("89556747-24cb-43ed-920b-47caed15465f")); - for (int j = 0; j < obj.Faces.Length; j++) - { - UploadObjectAssetMessage.Object.Face face = obj.Faces[j]; + for (int j = 0; j < obj.Faces.Length; j++) + { + UploadObjectAssetMessage.Object.Face face = obj.Faces[j]; + Primitive.TextureEntryFace primFace = tmp.CreateFace((uint) j); - Primitive.TextureEntryFace primFace = tmp.CreateFace((uint) j); + primFace.Bump = face.Bump; + primFace.RGBA = face.Color; + primFace.Fullbright = face.Fullbright; + primFace.Glow = face.Glow; + primFace.TextureID = face.ImageID; + primFace.Rotation = face.ImageRot; + primFace.MediaFlags = ((face.MediaFlags & 1) != 0); - primFace.Bump = face.Bump; - primFace.RGBA = face.Color; - primFace.Fullbright = face.Fullbright; - primFace.Glow = face.Glow; - primFace.TextureID = face.ImageID; - primFace.Rotation = face.ImageRot; - primFace.MediaFlags = ((face.MediaFlags & 1) != 0); + primFace.OffsetU = face.OffsetS; + primFace.OffsetV = face.OffsetT; + primFace.RepeatU = face.ScaleS; + primFace.RepeatV = face.ScaleT; + primFace.TexMapType = (MappingType) (face.MediaFlags & 6); + } - primFace.OffsetU = face.OffsetS; - primFace.OffsetV = face.OffsetT; - primFace.RepeatU = face.ScaleS; - primFace.RepeatV = face.ScaleT; - primFace.TexMapType = (MappingType) (face.MediaFlags & 6); - } + pbs.TextureEntry = tmp.GetBytes(); + prim.Shape = pbs; + prim.Scale = obj.Scale; - pbs.TextureEntry = tmp.GetBytes(); - prim.Shape = pbs; - prim.Scale = obj.Scale; + SceneObjectGroup grp = new SceneObjectGroup(); - SceneObjectGroup grp = new SceneObjectGroup(); + grp.SetRootPart(prim); + prim.ParentID = 0; + if (i == 0) - grp.SetRootPart(prim); - prim.ParentID = 0; - if (i == 0) - { - rootGroup = grp; + rootGroup = grp; - } - grp.AttachToScene(m_scene); - grp.AbsolutePosition = obj.Position; - prim.RotationOffset = obj.Rotation; - - - // Required for linking - grp.RootPart.ClearUpdateSchedule(); - - if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos)) - { - m_scene.AddSceneObject(grp); + grp.AttachToScene(m_scene); grp.AbsolutePosition = obj.Position; + prim.RotationOffset = obj.Rotation; + + // Required for linking + grp.RootPart.ClearUpdateSchedule(); + + if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos)) + { + m_scene.AddSceneObject(grp); + grp.AbsolutePosition = obj.Position; + } + + allparts[i] = grp; } - allparts[i] = grp; + for (int j = 1; j < allparts.Length; j++) + { + // Required for linking + rootGroup.RootPart.ClearUpdateSchedule(); + allparts[j].RootPart.ClearUpdateSchedule(); + rootGroup.LinkToGroup(allparts[j]); + } + + rootGroup.ScheduleGroupForFullAnimUpdate(); + + httpResponse.StatusCode = (int)HttpStatusCode.OK; + httpResponse.RawBuffer = Util.UTF8NBGetbytes(String.Format("local_id{0}", ConvertUintToBytes(allparts[0].LocalId))); } + catch{ } - for (int j = 1; j < allparts.Length; j++) - { - // Required for linking - rootGroup.RootPart.ClearUpdateSchedule(); - allparts[j].RootPart.ClearUpdateSchedule(); - rootGroup.LinkToGroup(allparts[j]); - } - - rootGroup.ScheduleGroupForFullAnimUpdate(); - pos - = m_scene.GetNewRezLocation( - Vector3.Zero, rootpos, UUID.Zero, rot, (byte)1, 1, true, allparts[0].GroupScale, false); - - responsedata["int_response_code"] = 200; //501; //410; //404; - responsedata["content_type"] = "text/plain"; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = String.Format("local_id{0}", ConvertUintToBytes(allparts[0].LocalId)); - - return responsedata; + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; } private string ConvertUintToBytes(uint val)