From c062138dad42ef7e52bbcb27c346ddecab94c5af Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Sat, 30 Apr 2011 12:23:40 -0700
Subject: Moved several cap-based-service-providing modules from where they
 were into a newly created CoreModules/Caps. Not all.

---
 .../Agent/Capabilities/CapabilitiesModule.cs       | 255 -------------
 .../CoreModules/Avatar/Assets/GetMeshModule.cs     | 211 -----------
 .../CoreModules/Avatar/Assets/GetTextureModule.cs  | 402 ---------------------
 .../NewFileAgentInventoryVariablePriceModule.cs    | 275 --------------
 .../CoreModules/Avatar/ObjectCaps/ObjectAdd.cs     | 370 -------------------
 .../Avatar/ObjectCaps/UploadObjectAssetModule.cs   | 374 -------------------
 .../Region/CoreModules/Caps/CapabilitiesModule.cs  | 255 +++++++++++++
 OpenSim/Region/CoreModules/Caps/GetMeshModule.cs   | 211 +++++++++++
 .../Region/CoreModules/Caps/GetTextureModule.cs    | 402 +++++++++++++++++++++
 .../NewFileAgentInventoryVariablePriceModule.cs    | 275 ++++++++++++++
 .../CoreModules/Caps/ObjectCaps/ObjectAdd.cs       | 370 +++++++++++++++++++
 .../Caps/ObjectCaps/UploadObjectAssetModule.cs     | 374 +++++++++++++++++++
 12 files changed, 1887 insertions(+), 1887 deletions(-)
 delete mode 100644 OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
 delete mode 100644 OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs
 delete mode 100644 OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
 delete mode 100644 OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs
 delete mode 100644 OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs
 delete mode 100644 OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs
 create mode 100644 OpenSim/Region/CoreModules/Caps/CapabilitiesModule.cs
 create mode 100644 OpenSim/Region/CoreModules/Caps/GetMeshModule.cs
 create mode 100644 OpenSim/Region/CoreModules/Caps/GetTextureModule.cs
 create mode 100644 OpenSim/Region/CoreModules/Caps/NewFileAgentInventoryVariablePriceModule.cs
 create mode 100644 OpenSim/Region/CoreModules/Caps/ObjectCaps/ObjectAdd.cs
 create mode 100644 OpenSim/Region/CoreModules/Caps/ObjectCaps/UploadObjectAssetModule.cs

(limited to 'OpenSim/Region')

diff --git a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
deleted file mode 100644
index 1d8e70e..0000000
--- a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyrightD
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of the OpenSimulator Project nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Reflection;
-using log4net;
-using Nini.Config;
-using OpenMetaverse;
-using OpenSim.Framework;
-using OpenSim.Framework.Console;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes;
-using Caps=OpenSim.Framework.Capabilities.Caps;
-
-namespace OpenSim.Region.CoreModules.Agent.Capabilities
-{
-    public class CapabilitiesModule : INonSharedRegionModule, ICapabilitiesModule
-    { 
-        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-        
-        protected Scene m_scene;
-        
-        /// <summary>
-        /// Each agent has its own capabilities handler.
-        /// </summary>
-        protected Dictionary<UUID, Caps> m_capsHandlers = new Dictionary<UUID, Caps>();
-        
-        protected Dictionary<UUID, string> capsPaths = new Dictionary<UUID, string>();
-        protected Dictionary<UUID, Dictionary<ulong, string>> childrenSeeds 
-            = new Dictionary<UUID, Dictionary<ulong, string>>();
-        
-        public void Initialise(IConfigSource source)
-        {
-        }
-
-        public void AddRegion(Scene scene)
-        {
-            m_scene = scene;
-            m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
-            MainConsole.Instance.Commands.AddCommand("Capabilities", false, "show caps",
-                "show capabilities",
-                "Shows all  registered capabilities", CapabilitiesCommand);
-        }
-
-        public void RegionLoaded(Scene scene)
-        {
-        }
-
-        public void RemoveRegion(Scene scene)
-        {
-            m_scene.UnregisterModuleInterface<ICapabilitiesModule>(this);
-        }
-        
-        public void PostInitialise() 
-        {
-        }
-
-        public void Close() {}
-
-        public string Name 
-        { 
-            get { return "Capabilities Module"; } 
-        }
-
-        public Type ReplaceableInterface
-        {
-            get { return null; }
-        }
-
-        public void AddCapsHandler(UUID agentId)
-        {
-            if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId))
-                return;
-
-            String capsObjectPath = GetCapsPath(agentId);
-
-            if (m_capsHandlers.ContainsKey(agentId))
-            {
-                Caps oldCaps = m_capsHandlers[agentId];
-                
-                m_log.DebugFormat(
-                    "[CAPS]: Reregistering caps for agent {0}.  Old caps path {1}, new caps path {2}. ", 
-                    agentId, oldCaps.CapsObjectPath, capsObjectPath);
-                // This should not happen. The caller code is confused. We need to fix that.
-                // CAPs can never be reregistered, or the client will be confused.
-                // Hence this return here.
-                //return;
-            }
-
-            Caps caps
-                = new Caps(m_scene,
-                    m_scene.AssetService, MainServer.Instance, m_scene.RegionInfo.ExternalHostName,
-                    (MainServer.Instance == null) ? 0: MainServer.Instance.Port,
-                    capsObjectPath, agentId, m_scene.DumpAssetsToFile, m_scene.RegionInfo.RegionName);
-
-            caps.RegisterHandlers();
-
-            m_scene.EventManager.TriggerOnRegisterCaps(agentId, caps);
-
-            caps.AddNewInventoryItem = m_scene.AddUploadedInventoryItem;
-            caps.ItemUpdatedCall = m_scene.CapsUpdateInventoryItemAsset;
-            caps.TaskScriptUpdatedCall = m_scene.CapsUpdateTaskInventoryScriptAsset;
-            caps.CAPSFetchInventoryDescendents = m_scene.HandleFetchInventoryDescendentsCAPS;
-            caps.GetClient = m_scene.SceneContents.GetControllingClient;
-
-            m_capsHandlers[agentId] = caps;
-        }
-
-        public void RemoveCapsHandler(UUID agentId)
-        {
-            if (childrenSeeds.ContainsKey(agentId))
-            {
-                childrenSeeds.Remove(agentId);
-            }
-
-            lock (m_capsHandlers)
-            {
-                if (m_capsHandlers.ContainsKey(agentId))
-                {
-                    m_capsHandlers[agentId].DeregisterHandlers();
-                    m_scene.EventManager.TriggerOnDeregisterCaps(agentId, m_capsHandlers[agentId]);
-                    m_capsHandlers.Remove(agentId);
-                }
-                else
-                {
-                    m_log.WarnFormat(
-                        "[CAPS]: Received request to remove CAPS handler for root agent {0} in {1}, but no such CAPS handler found!",
-                        agentId, m_scene.RegionInfo.RegionName);
-                }
-            }
-        }
-        
-        public Caps GetCapsHandlerForUser(UUID agentId)
-        {
-            lock (m_capsHandlers)
-            {
-                if (m_capsHandlers.ContainsKey(agentId))
-                {
-                    return m_capsHandlers[agentId];
-                }
-            }
-            
-            return null;
-        }
-        
-        public void NewUserConnection(AgentCircuitData agent)
-        {
-            capsPaths[agent.AgentID] = agent.CapsPath;
-            childrenSeeds[agent.AgentID] 
-                = ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds);
-        }
-        
-        public string GetCapsPath(UUID agentId)
-        {
-            if (capsPaths.ContainsKey(agentId))
-            {
-                return capsPaths[agentId];
-            }
-
-            return null;
-        }
-        
-        public Dictionary<ulong, string> GetChildrenSeeds(UUID agentID)
-        {
-            Dictionary<ulong, string> seeds = null;
-            if (childrenSeeds.TryGetValue(agentID, out seeds))
-                return seeds;
-            return new Dictionary<ulong, string>();
-        }
-
-        public void DropChildSeed(UUID agentID, ulong handle)
-        {
-            Dictionary<ulong, string> seeds;
-            if (childrenSeeds.TryGetValue(agentID, out seeds))
-            {
-                seeds.Remove(handle);
-            }
-        }
-
-        public string GetChildSeed(UUID agentID, ulong handle)
-        {
-            Dictionary<ulong, string> seeds;
-            string returnval;
-            if (childrenSeeds.TryGetValue(agentID, out seeds))
-            {
-                if (seeds.TryGetValue(handle, out returnval))
-                    return returnval;
-            }
-            return null;
-        }
-
-        public void SetChildrenSeed(UUID agentID, Dictionary<ulong, string> seeds)
-        {
-            //m_log.DebugFormat(" !!! Setting child seeds in {0} to {1}", m_scene.RegionInfo.RegionName, seeds.Count);
-            childrenSeeds[agentID] = seeds;
-        }
-
-        public void DumpChildrenSeeds(UUID agentID)
-        {
-            m_log.Info("================ ChildrenSeed "+m_scene.RegionInfo.RegionName+" ================");
-            foreach (KeyValuePair<ulong, string> kvp in childrenSeeds[agentID])
-            {
-                uint x, y;
-                Utils.LongToUInts(kvp.Key, out x, out y);
-                x = x / Constants.RegionSize;
-                y = y / Constants.RegionSize;
-                m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
-            }
-        }
-
-        private void CapabilitiesCommand(string module, string[] cmdparams)
-        {
-            System.Text.StringBuilder caps = new System.Text.StringBuilder();
-            caps.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName);
-
-            foreach (KeyValuePair<UUID, Caps> kvp in m_capsHandlers)
-            {
-                caps.AppendFormat("** User {0}:\n", kvp.Key);
-                for (IDictionaryEnumerator kvp2 = kvp.Value.CapsHandlers.CapsDetails.GetEnumerator(); kvp2.MoveNext(); )
-                {
-                    Uri uri = new Uri(kvp2.Value.ToString());
-                    caps.AppendFormat("   {0} = {1}\n", kvp2.Key, uri.PathAndQuery);
-                }
-            }
-
-            MainConsole.Instance.Output(caps.ToString());
-        }
-    }
-}
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs
deleted file mode 100644
index fc1ddef..0000000
--- a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of the OpenSimulator Project nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Reflection;
-using System.IO;
-using System.Web;
-using Mono.Addins;
-using log4net;
-using Nini.Config;
-using OpenMetaverse;
-using OpenMetaverse.StructuredData;
-using OpenSim.Framework;
-using OpenSim.Framework.Servers;
-using OpenSim.Framework.Servers.HttpServer;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes;
-using OpenSim.Services.Interfaces;
-using Caps = OpenSim.Framework.Capabilities.Caps;
-
-namespace OpenSim.Region.CoreModules.Avatar.Assets
-{
-    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
-    public class GetMeshModule : INonSharedRegionModule
-    {
-//        private static readonly ILog m_log =
-//            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-        
-        private Scene m_scene;
-        private IAssetService m_assetService;
-        private bool m_enabled = true;
-
-        #region IRegionModuleBase Members
-
-
-        public Type ReplaceableInterface
-        {
-            get { return null; }
-        }
-
-        public void Initialise(IConfigSource source)
-        {
-            IConfig meshConfig = source.Configs["Mesh"];
-            if (meshConfig == null)
-                return;
-
-            m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true);
-        }
-
-        public void AddRegion(Scene pScene)
-        {
-            m_scene = pScene;
-        }
-
-        public void RemoveRegion(Scene scene)
-        {
-            
-            m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
-            m_scene = null;
-        }
-
-        public void RegionLoaded(Scene scene)
-        {
-            
-            m_assetService = m_scene.RequestModuleInterface<IAssetService>();
-            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
-        }
-
-        #endregion
-
-
-        #region IRegionModule Members
-
-       
-
-        public void Close() { }
-
-        public string Name { get { return "GetMeshModule"; } }
-
-
-        public void RegisterCaps(UUID agentID, Caps caps)
-        {
-            if(!m_enabled)
-                return;
-
-            UUID capID = UUID.Random();
-
-//            m_log.Info("[GETMESH]: /CAPS/" + capID);
-
-            caps.RegisterHandler("GetMesh",
-                                 new RestHTTPHandler("GET", "/CAPS/" + capID,
-                                                       delegate(Hashtable m_dhttpMethod)
-                                                       {
-                                                           return ProcessGetMesh(m_dhttpMethod, agentID, caps);
-                                                       }));
-        }
-
-        #endregion
-
-        public Hashtable ProcessGetMesh(Hashtable request, 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";
-
-            string meshStr = string.Empty;
-
-            if (request.ContainsKey("mesh_id"))
-                meshStr = request["mesh_id"].ToString();
-
-
-            UUID meshID = UUID.Zero;
-            if (!String.IsNullOrEmpty(meshStr) && UUID.TryParse(meshStr, out meshID))
-            {
-                if (m_assetService == null)
-                {
-                    responsedata["int_response_code"] = 404; //501; //410; //404;
-                    responsedata["content_type"] = "text/plain";
-                    responsedata["keepalive"] = false;
-                    responsedata["str_response_string"] = "The asset service is unavailable.  So is your mesh.";
-                    return responsedata;
-                }
-
-                AssetBase mesh;
-                // Only try to fetch locally cached textures. Misses are redirected
-                mesh = m_assetService.GetCached(meshID.ToString());
-                if (mesh != null)
-                {
-                    if (mesh.Type == (SByte)AssetType.Mesh) 
-                    {
-                        responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
-                        responsedata["content_type"] = "application/vnd.ll.mesh";
-                        responsedata["int_response_code"] = 200;
-                    }
-                    // Optionally add additional mesh types here
-                    else
-                    {
-                        responsedata["int_response_code"] = 404; //501; //410; //404;
-                        responsedata["content_type"] = "text/plain";
-                        responsedata["keepalive"] = false;
-                        responsedata["str_response_string"] = "Unfortunately, this asset isn't a mesh.";
-                        return responsedata;
-                    }
-                }
-                else
-                {
-                    mesh = m_assetService.Get(meshID.ToString());
-                    if (mesh != null)
-                    {
-                        if (mesh.Type == (SByte)AssetType.Mesh) 
-                        {
-                            responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
-                            responsedata["content_type"] = "application/vnd.ll.mesh";
-                            responsedata["int_response_code"] = 200;
-                        }
-                        // Optionally add additional mesh types here
-                        else
-                        {
-                            responsedata["int_response_code"] = 404; //501; //410; //404;
-                            responsedata["content_type"] = "text/plain";
-                            responsedata["keepalive"] = false;
-                            responsedata["str_response_string"] = "Unfortunately, this asset isn't a mesh.";
-                            return responsedata;
-                        }
-                    }
-
-                    else
-                    {
-                        responsedata["int_response_code"] = 404; //501; //410; //404;
-                        responsedata["content_type"] = "text/plain";
-                        responsedata["keepalive"] = false;
-                        responsedata["str_response_string"] = "Your Mesh wasn't found.  Sorry!";
-                        return responsedata;
-                    }
-                }
-
-            }
-
-            return responsedata;
-        }
-    }
-}
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
deleted file mode 100644
index df4d561..0000000
--- a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of the OpenSimulator Project nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Drawing;
-using System.Drawing.Imaging;
-using System.Reflection;
-using System.IO;
-using System.Web;
-using log4net;
-using Nini.Config;
-using OpenMetaverse;
-using OpenMetaverse.StructuredData;
-using OpenMetaverse.Imaging;
-using OpenSim.Framework;
-using OpenSim.Framework.Servers;
-using OpenSim.Framework.Servers.HttpServer;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes;
-using OpenSim.Services.Interfaces;
-using Caps = OpenSim.Framework.Capabilities.Caps;
-
-namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
-{
-    #region Stream Handler
-
-    public delegate byte[] StreamHandlerCallback(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse);
-
-    public class StreamHandler : BaseStreamHandler
-    {
-        StreamHandlerCallback m_callback;
-
-        public StreamHandler(string httpMethod, string path, StreamHandlerCallback callback)
-            : base(httpMethod, path)
-        {
-            m_callback = callback;
-        }
-
-        public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
-        {
-            return m_callback(path, request, httpRequest, httpResponse);
-        }
-    }
-
-    #endregion Stream Handler
-
-    public class GetTextureModule : IRegionModule
-    {
-        private static readonly ILog m_log =
-            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-        private Scene m_scene;
-        private IAssetService m_assetService;
-
-        public const string DefaultFormat = "x-j2c";
-
-        // TODO: Change this to a config option
-        const string REDIRECT_URL = null;
-
-
-        #region IRegionModule Members
-
-        public void Initialise(Scene pScene, IConfigSource pSource)
-        {
-            m_scene = pScene;
-        }
-
-        public void PostInitialise()
-        {
-            m_assetService = m_scene.RequestModuleInterface<IAssetService>();
-            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
-        }
-
-        public void Close() { }
-
-        public string Name { get { return "GetTextureModule"; } }
-        public bool IsSharedModule { get { return false; } }
-
-        public void RegisterCaps(UUID agentID, Caps caps)
-        {
-            UUID capID = UUID.Random();
-
-//            m_log.InfoFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName);
-            caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture));
-        }
-
-        #endregion
-
-        private byte[] ProcessGetTexture(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
-        {
-            //m_log.DebugFormat("[GETTEXTURE]: called in {0}", m_scene.RegionInfo.RegionName);
-
-            // Try to parse the texture ID from the request URL
-            NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query);
-            string textureStr = query.GetOne("texture_id");
-            string format = query.GetOne("format");
-
-            if (m_assetService == null)
-            {
-                m_log.Error("[GETTEXTURE]: Cannot fetch texture " + textureStr + " without an asset service");
-                httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
-                return null;
-            }
-
-            UUID textureID;
-            if (!String.IsNullOrEmpty(textureStr) && UUID.TryParse(textureStr, out textureID))
-            {
-                string[] formats;
-                if (format != null && format != string.Empty)
-                {
-                    formats = new string[1] { format.ToLower() };
-                }
-                else
-                {
-                    formats = WebUtil.GetPreferredImageTypes(httpRequest.Headers.Get("Accept"));
-                    if (formats.Length == 0)
-                        formats = new string[1] { DefaultFormat }; // default
-
-                }
-                // OK, we have an array with preferred formats, possibly with only one entry
-
-                httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
-                foreach (string f in formats)
-                {
-                    if (FetchTexture(httpRequest, httpResponse, textureID, f))
-                        break;
-                }
-
-            }
-            else
-            {
-                m_log.Warn("[GETTEXTURE]: Failed to parse a texture_id from GetTexture request: " + httpRequest.Url);
-            }
-
-            httpResponse.Send();
-            return null;
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="httpRequest"></param>
-        /// <param name="httpResponse"></param>
-        /// <param name="textureID"></param>
-        /// <param name="format"></param>
-        /// <returns>False for "caller try another codec"; true otherwise</returns>
-        private bool FetchTexture(OSHttpRequest httpRequest, OSHttpResponse httpResponse, UUID textureID, string format)
-        {
-//            m_log.DebugFormat("[GETTEXTURE]: {0} with requested format {1}", textureID, format);
-            AssetBase texture;
-
-            string fullID = textureID.ToString();
-            if (format != DefaultFormat)
-                fullID = fullID + "-" + format;
-
-            if (!String.IsNullOrEmpty(REDIRECT_URL))
-            {
-                // Only try to fetch locally cached textures. Misses are redirected
-                texture = m_assetService.GetCached(fullID);
-
-                if (texture != null)
-                {
-                    if (texture.Type != (sbyte)AssetType.Texture)
-                    {
-                        httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
-                        return true;
-                    }
-                    WriteTextureData(httpRequest, httpResponse, texture, format);
-                }
-                else
-                {
-                    string textureUrl = REDIRECT_URL + textureID.ToString();
-                    m_log.Debug("[GETTEXTURE]: Redirecting texture request to " + textureUrl);
-                    httpResponse.RedirectLocation = textureUrl;
-                    return true;
-                }
-            }
-            else // no redirect
-            {
-                // try the cache
-                texture = m_assetService.GetCached(fullID);
-
-                if (texture == null)
-                {
-                    //m_log.DebugFormat("[GETTEXTURE]: texture was not in the cache");
-
-                    // Fetch locally or remotely. Misses return a 404
-                    texture = m_assetService.Get(textureID.ToString());
-
-                    if (texture != null)
-                    {
-                        if (texture.Type != (sbyte)AssetType.Texture)
-                        {
-                            httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
-                            return true;
-                        }
-                        if (format == DefaultFormat)
-                        {
-                            WriteTextureData(httpRequest, httpResponse, texture, format);
-                            return true;
-                        }
-                        else
-                        {
-                            AssetBase newTexture = new AssetBase(texture.ID + "-" + format, texture.Name, (sbyte)AssetType.Texture, texture.Metadata.CreatorID);
-                            newTexture.Data = ConvertTextureData(texture, format);
-                            if (newTexture.Data.Length == 0)
-                                return false; // !!! Caller try another codec, please!
-
-                            newTexture.Flags = AssetFlags.Collectable;
-                            newTexture.Temporary = true;
-                            m_assetService.Store(newTexture);
-                            WriteTextureData(httpRequest, httpResponse, newTexture, format);
-                            return true;
-                        }
-                    }
-               }
-               else // it was on the cache
-               {
-                   //m_log.DebugFormat("[GETTEXTURE]: texture was in the cache");
-                   WriteTextureData(httpRequest, httpResponse, texture, format);
-                   return true;
-               }
-            }
-
-            // not found
-//            m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found");
-            httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
-            return true;
-        }
-
-        private void WriteTextureData(OSHttpRequest request, OSHttpResponse response, AssetBase texture, string format)
-        {
-            string range = request.Headers.GetOne("Range");
-            //m_log.DebugFormat("[GETTEXTURE]: Range {0}", range);
-            if (!String.IsNullOrEmpty(range)) // JP2's only
-            {
-                // Range request
-                int start, end;
-                if (TryParseRange(range, out start, out end))
-                {
-                    // Before clamping start make sure we can satisfy it in order to avoid
-                    // sending back the last byte instead of an error status
-                    if (start >= texture.Data.Length)
-                    {
-                        response.StatusCode = (int)System.Net.HttpStatusCode.RequestedRangeNotSatisfiable;
-                        return;
-                    }
-
-                    end = Utils.Clamp(end, 0, texture.Data.Length - 1);
-                    start = Utils.Clamp(start, 0, end);
-                    int len = end - start + 1;
-
-                    //m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID);
-
-                    if (len < texture.Data.Length)
-                        response.StatusCode = (int)System.Net.HttpStatusCode.PartialContent;
-
-                    response.ContentLength = len;
-                    response.ContentType = texture.Metadata.ContentType;
-                    response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length));
-
-                    response.Body.Write(texture.Data, start, len);
-                }
-                else
-                {
-                    m_log.Warn("[GETTEXTURE]: Malformed Range header: " + range);
-                    response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
-                }
-            }
-            else // JP2's or other formats
-            {
-                // Full content request
-                response.StatusCode = (int)System.Net.HttpStatusCode.OK;
-                response.ContentLength = texture.Data.Length;
-                if (format == DefaultFormat)
-                    response.ContentType = texture.Metadata.ContentType;
-                else
-                    response.ContentType = "image/" + format;
-                response.Body.Write(texture.Data, 0, texture.Data.Length);
-            }
-        }
-
-        private bool TryParseRange(string header, out int start, out int end)
-        {
-            if (header.StartsWith("bytes="))
-            {
-                string[] rangeValues = header.Substring(6).Split('-');
-                if (rangeValues.Length == 2)
-                {
-                    if (Int32.TryParse(rangeValues[0], out start) && Int32.TryParse(rangeValues[1], out end))
-                        return true;
-                }
-            }
-
-            start = end = 0;
-            return false;
-        }
-
-
-        private byte[] ConvertTextureData(AssetBase texture, string format)
-        {
-            m_log.DebugFormat("[GETTEXTURE]: Converting texture {0} to {1}", texture.ID, format);
-            byte[] data = new byte[0];
-
-            MemoryStream imgstream = new MemoryStream();
-            Bitmap mTexture = new Bitmap(1, 1);
-            ManagedImage managedImage;
-            Image image = (Image)mTexture;
-
-            try
-            {
-                // Taking our jpeg2000 data, decoding it, then saving it to a byte array with regular data
-
-                imgstream = new MemoryStream();
-
-                // Decode image to System.Drawing.Image
-                if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image))
-                {
-                    // Save to bitmap
-                    mTexture = new Bitmap(image);
-
-                    EncoderParameters myEncoderParameters = new EncoderParameters();
-                    myEncoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 95L);
-
-                    // Save bitmap to stream
-                    ImageCodecInfo codec = GetEncoderInfo("image/" + format);
-                    if (codec != null)
-                    {
-                        mTexture.Save(imgstream, codec, myEncoderParameters);
-                        // Write the stream to a byte array for output
-                        data = imgstream.ToArray();
-                    }
-                    else
-                        m_log.WarnFormat("[GETTEXTURE]: No such codec {0}", format);
-
-                }
-            }
-            catch (Exception e)
-            {
-                m_log.WarnFormat("[GETTEXTURE]: Unable to convert texture {0} to {1}: {2}", texture.ID, format, e.Message);
-            }
-            finally
-            {
-                // Reclaim memory, these are unmanaged resources
-                // If we encountered an exception, one or more of these will be null
-                if (mTexture != null)
-                    mTexture.Dispose();
-
-                if (image != null)
-                    image.Dispose();
-
-                if (imgstream != null)
-                {
-                    imgstream.Close();
-                    imgstream.Dispose();
-                }
-            }
-
-            return data;
-        }
-
-        // From msdn
-        private static ImageCodecInfo GetEncoderInfo(String mimeType)
-        {
-            ImageCodecInfo[] encoders;
-            encoders = ImageCodecInfo.GetImageEncoders();
-            for (int j = 0; j < encoders.Length; ++j)
-            {
-                if (encoders[j].MimeType == mimeType)
-                    return encoders[j];
-            }
-            return null;
-        }
-
-
-    }
-}
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs
deleted file mode 100644
index 3d4c7b7..0000000
--- a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of the OpenSimulator Project nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Reflection;
-using System.IO;
-using System.Web;
-using Mono.Addins;
-using log4net;
-using Nini.Config;
-using OpenMetaverse;
-using OpenMetaverse.StructuredData;
-using OpenSim.Framework;
-using OpenSim.Framework.Servers;
-using OpenSim.Framework.Servers.HttpServer;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes;
-using OpenSim.Services.Interfaces;
-using Caps = OpenSim.Framework.Capabilities.Caps;
-using OpenSim.Framework.Capabilities;
-
-namespace OpenSim.Region.CoreModules.Avatar.Assets
-{
-    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
-    public class NewFileAgentInventoryVariablePriceModule : INonSharedRegionModule
-    {
-//        private static readonly ILog m_log =
-//            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-        
-        private Scene m_scene;
-//        private IAssetService m_assetService;
-        private bool m_dumpAssetsToFile = false;
-        private bool m_enabled = true;
-
-        #region IRegionModuleBase Members
-
-
-        public Type ReplaceableInterface
-        {
-            get { return null; }
-        }
-
-        public void Initialise(IConfigSource source)
-        {
-            IConfig meshConfig = source.Configs["Mesh"];
-            if (meshConfig == null)
-                return;
-
-            m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true);
-        }
-
-        public void AddRegion(Scene pScene)
-        {
-            m_scene = pScene;
-        }
-
-        public void RemoveRegion(Scene scene)
-        {
-            
-            m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
-            m_scene = null;
-        }
-
-        public void RegionLoaded(Scene scene)
-        {
-            
-//            m_assetService = m_scene.RequestModuleInterface<IAssetService>();
-            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
-        }
-
-        #endregion
-
-
-        #region IRegionModule Members
-
-       
-
-        public void Close() { }
-
-        public string Name { get { return "NewFileAgentInventoryVariablePriceModule"; } }
-
-
-        public void RegisterCaps(UUID agentID, Caps caps)
-        {
-            if(!m_enabled)
-                return;
-
-            UUID capID = UUID.Random();
-
-//            m_log.Debug("[NEW FILE AGENT INVENTORY VARIABLE PRICE]: /CAPS/" + capID);
-            caps.RegisterHandler("NewFileAgentInventoryVariablePrice",
-
-                    new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDNewFileAngentInventoryVariablePriceReplyResponse>("POST",
-                                                                                           "/CAPS/" + capID.ToString(),
-                                                                                           delegate(LLSDAssetUploadRequest req)
-                                                       {
-                                                           return NewAgentInventoryRequest(req,agentID);
-                                                       }));
-         
-        }
-
-        #endregion
-
-        public LLSDNewFileAngentInventoryVariablePriceReplyResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest, UUID agentID)
-        {
-
-            //TODO:  The Mesh uploader uploads many types of content. If you're going to implement a Money based limit
-            // You need to be aware of this and 
-
-
-            //if (llsdRequest.asset_type == "texture" ||
-           //     llsdRequest.asset_type == "animation" ||
-           //     llsdRequest.asset_type == "sound")
-           // {
-                IClientAPI client = null;
-
-                
-                IMoneyModule mm = m_scene.RequestModuleInterface<IMoneyModule>();
-                
-                if (mm != null)
-                {
-                    if (m_scene.TryGetClient(agentID, out client))
-                    {
-                        if (!mm.UploadCovered(client, mm.UploadCharge))
-                        {
-                            if (client != null)
-                                client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
-
-                            LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse();
-                            errorResponse.rsvp = "";
-                            errorResponse.state = "error";
-                            return errorResponse;
-                        }
-                    }
-                }
-           // }
-            
-
-
-            string assetName = llsdRequest.name;
-            string assetDes = llsdRequest.description;
-            string capsBase = "/CAPS/NewFileAgentInventoryVariablePrice/";
-            UUID newAsset = UUID.Random();
-            UUID newInvItem = UUID.Random();
-            UUID parentFolder = llsdRequest.folder_id;
-            string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000") + "/";
-
-            Caps.AssetUploader uploader =
-                new Caps.AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
-                                  llsdRequest.asset_type, capsBase + uploaderPath, MainServer.Instance, m_dumpAssetsToFile);
-            MainServer.Instance.AddStreamHandler(
-                new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
-
-            string protocol = "http://";
-
-            if (MainServer.Instance.UseSSL)
-                protocol = "https://";
-
-            string uploaderURL = protocol + m_scene.RegionInfo.ExternalHostName + ":" + MainServer.Instance.Port.ToString() + capsBase +
-                                 uploaderPath;
-         
-
-            LLSDNewFileAngentInventoryVariablePriceReplyResponse uploadResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse();
-           
-            
-            uploadResponse.rsvp = uploaderURL;
-            uploadResponse.state = "upload";
-            uploadResponse.resource_cost = 0;
-            uploadResponse.upload_price = 0;
-
-            uploader.OnUpLoad += //UploadCompleteHandler;
-                
-                delegate(
-                string passetName, string passetDescription, UUID passetID,
-                UUID pinventoryItem, UUID pparentFolder, byte[] pdata, string pinventoryType,
-                string passetType)
-               {
-                   UploadCompleteHandler(passetName, passetDescription,  passetID,
-                                          pinventoryItem, pparentFolder, pdata,  pinventoryType,
-                                          passetType,agentID);
-               };
-            return uploadResponse;
-        }
-
-       
-        public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
-                                          UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
-                                          string assetType,UUID AgentID)
-        {
-            
-            sbyte assType = 0;
-            sbyte inType = 0;
-
-            if (inventoryType == "sound")
-            {
-                inType = 1;
-                assType = 1;
-            }
-            else if (inventoryType == "animation")
-            {
-                inType = 19;
-                assType = 20;
-            }
-            else if (inventoryType == "wearable")
-            {
-                inType = 18;
-                switch (assetType)
-                {
-                    case "bodypart":
-                        assType = 13;
-                        break;
-                    case "clothing":
-                        assType = 5;
-                        break;
-                }
-            }
-            else if (inventoryType == "mesh")
-            {
-                inType = (sbyte)InventoryType.Mesh; 
-                assType = (sbyte)AssetType.Mesh;
-            }
-
-            AssetBase asset;
-            asset = new AssetBase(assetID, assetName, assType, AgentID.ToString());
-            asset.Data = data;
-    
-            if (m_scene.AssetService != null)
-                m_scene.AssetService.Store(asset);
-
-            InventoryItemBase item = new InventoryItemBase();
-            item.Owner = AgentID;
-            item.CreatorId = AgentID.ToString();
-            item.ID = inventoryItem;
-            item.AssetID = asset.FullID;
-            item.Description = assetDescription;
-            item.Name = assetName;
-            item.AssetType = assType;
-            item.InvType = inType;
-            item.Folder = parentFolder;
-            item.CurrentPermissions = (uint)PermissionMask.All;
-            item.BasePermissions = (uint)PermissionMask.All;
-            item.EveryOnePermissions = 0;
-            item.NextPermissions = (uint)(PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer);
-            item.CreationDate = Util.UnixTimeSinceEpoch();
-            m_scene.AddInventoryItem(item);
-            
-        }
-    }
-}
diff --git a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs
deleted file mode 100644
index a0d72ed..0000000
--- a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of the OpenSimulator Project nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Reflection;
-using log4net;
-using Nini.Config;
-using OpenMetaverse;
-using OpenMetaverse.StructuredData;
-using OpenSim.Framework;
-using OpenSim.Framework.Servers;
-using OpenSim.Framework.Servers.HttpServer;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes;
-using Caps=OpenSim.Framework.Capabilities.Caps;
-
-namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
-{
-    public class ObjectAdd : IRegionModule
-    {
-//        private static readonly ILog m_log =
-//            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-        
-        private Scene m_scene;
-        #region IRegionModule Members
-
-        public void Initialise(Scene pScene, IConfigSource pSource)
-        {
-            m_scene = pScene;
-            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
-        }
-
-        public void PostInitialise()
-        {
-            
-        }
-
-        public void RegisterCaps(UUID agentID, Caps caps)
-        {
-            UUID capuuid = UUID.Random();
-            
-//            m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/");
-
-            caps.RegisterHandler("ObjectAdd",
-                                 new RestHTTPHandler("POST", "/CAPS/OA/" + capuuid + "/",
-                                                       delegate(Hashtable m_dhttpMethod)
-                                                       {
-                                                           return ProcessAdd(m_dhttpMethod, agentID, caps);
-                                                       }));
-        }
-
-        public Hashtable ProcessAdd(Hashtable request, 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;
-            
-            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
-                return responsedata;
-
-
-            OSD r = OSDParser.DeserializeLLSDXml((string)request["requestbody"]);
-            //UUID session_id = UUID.Zero;
-            bool bypass_raycast = false;
-            uint everyone_mask = 0;
-            uint group_mask = 0;
-            uint next_owner_mask = 0;
-            uint flags = 0;
-            UUID group_id = UUID.Zero;
-            int hollow = 0;
-            int material = 0;
-            int p_code = 0;
-            int path_begin = 0;
-            int path_curve = 0;
-            int path_end = 0;
-            int path_radius_offset = 0;
-            int path_revolutions = 0;
-            int path_scale_x = 0;
-            int path_scale_y = 0;
-            int path_shear_x = 0;
-            int path_shear_y = 0;
-            int path_skew = 0;
-            int path_taper_x = 0;
-            int path_taper_y = 0;
-            int path_twist = 0;
-            int path_twist_begin = 0;
-            int profile_begin = 0;
-            int profile_curve = 0;
-            int profile_end = 0;
-            Vector3 ray_end = Vector3.Zero;
-            bool ray_end_is_intersection = false;
-            Vector3 ray_start = Vector3.Zero;
-            UUID ray_target_id = UUID.Zero;
-            Quaternion rotation = Quaternion.Identity;
-            Vector3 scale = Vector3.Zero;
-            int state = 0;
-
-            if (r.Type != OSDType.Map) // not a proper req
-                return responsedata;
-            
-            OSDMap rm = (OSDMap)r;
-
-            if (rm.ContainsKey("ObjectData")) //v2
-            {
-                if (rm["ObjectData"].Type != OSDType.Map)
-                {
-                    responsedata["str_response_string"] = "Has ObjectData key, but data not in expected format";
-                    return responsedata;
-                }
-
-                OSDMap ObjMap = (OSDMap) rm["ObjectData"];
-
-                bypass_raycast = ObjMap["BypassRaycast"].AsBoolean();
-                everyone_mask = readuintval(ObjMap["EveryoneMask"]);
-                flags = readuintval(ObjMap["Flags"]);
-                group_mask = readuintval(ObjMap["GroupMask"]);
-                material = ObjMap["Material"].AsInteger();
-                next_owner_mask = readuintval(ObjMap["NextOwnerMask"]);
-                p_code = ObjMap["PCode"].AsInteger();
-
-                if (ObjMap.ContainsKey("Path"))
-                {
-                    if (ObjMap["Path"].Type != OSDType.Map)
-                    {
-                        responsedata["str_response_string"] = "Has Path key, but data not in expected format";
-                        return responsedata;
-                    }
-
-                    OSDMap PathMap = (OSDMap)ObjMap["Path"];
-                    path_begin = PathMap["Begin"].AsInteger();
-                    path_curve = PathMap["Curve"].AsInteger();
-                    path_end = PathMap["End"].AsInteger();
-                    path_radius_offset = PathMap["RadiusOffset"].AsInteger();
-                    path_revolutions = PathMap["Revolutions"].AsInteger();
-                    path_scale_x = PathMap["ScaleX"].AsInteger();
-                    path_scale_y = PathMap["ScaleY"].AsInteger();
-                    path_shear_x = PathMap["ShearX"].AsInteger();
-                    path_shear_y = PathMap["ShearY"].AsInteger();
-                    path_skew = PathMap["Skew"].AsInteger();
-                    path_taper_x = PathMap["TaperX"].AsInteger();
-                    path_taper_y = PathMap["TaperY"].AsInteger();
-                    path_twist = PathMap["Twist"].AsInteger();
-                    path_twist_begin = PathMap["TwistBegin"].AsInteger();
-
-                }
-
-                if (ObjMap.ContainsKey("Profile"))
-                {
-                    if (ObjMap["Profile"].Type != OSDType.Map)
-                    {
-                        responsedata["str_response_string"] = "Has Profile key, but data not in expected format";
-                        return responsedata;
-                    }
-                        
-                    OSDMap ProfileMap = (OSDMap)ObjMap["Profile"];
-
-                    profile_begin = ProfileMap["Begin"].AsInteger();
-                    profile_curve = ProfileMap["Curve"].AsInteger();
-                    profile_end = ProfileMap["End"].AsInteger();
-                    hollow = ProfileMap["Hollow"].AsInteger();
-                }
-                ray_end_is_intersection = ObjMap["RayEndIsIntersection"].AsBoolean();
-                
-                ray_target_id = ObjMap["RayTargetId"].AsUUID();
-                state = ObjMap["State"].AsInteger();
-                try
-                {
-                    ray_end = ((OSDArray) ObjMap["RayEnd"]).AsVector3();
-                    ray_start = ((OSDArray) ObjMap["RayStart"]).AsVector3();
-                    scale = ((OSDArray) ObjMap["Scale"]).AsVector3();
-                    rotation = ((OSDArray)ObjMap["Rotation"]).AsQuaternion();
-                }
-                catch (Exception)
-                {
-                    responsedata["str_response_string"] = "RayEnd, RayStart, Scale or Rotation wasn't in the expected format";
-                    return responsedata;
-                }
-
-                if (rm.ContainsKey("AgentData"))
-                {
-                    if (rm["AgentData"].Type != OSDType.Map)
-                    {
-                        responsedata["str_response_string"] = "Has AgentData key, but data not in expected format";
-                        return responsedata;
-                    }
-
-                    OSDMap AgentDataMap = (OSDMap) rm["AgentData"];
-
-                    //session_id = AgentDataMap["SessionId"].AsUUID();
-                    group_id = AgentDataMap["GroupId"].AsUUID();
-                }
-
-            }
-            else
-            { //v1
-                bypass_raycast = rm["bypass_raycast"].AsBoolean();
-
-                everyone_mask = readuintval(rm["everyone_mask"]);
-                flags = readuintval(rm["flags"]);
-                group_id = rm["group_id"].AsUUID();
-                group_mask = readuintval(rm["group_mask"]);
-                hollow = rm["hollow"].AsInteger();
-                material = rm["material"].AsInteger();
-                next_owner_mask = readuintval(rm["next_owner_mask"]);
-                hollow = rm["hollow"].AsInteger();
-                p_code = rm["p_code"].AsInteger();
-                path_begin = rm["path_begin"].AsInteger();
-                path_curve = rm["path_curve"].AsInteger();
-                path_end = rm["path_end"].AsInteger();
-                path_radius_offset = rm["path_radius_offset"].AsInteger();
-                path_revolutions = rm["path_revolutions"].AsInteger();
-                path_scale_x = rm["path_scale_x"].AsInteger();
-                path_scale_y = rm["path_scale_y"].AsInteger();
-                path_shear_x = rm["path_shear_x"].AsInteger();
-                path_shear_y = rm["path_shear_y"].AsInteger();
-                path_skew = rm["path_skew"].AsInteger();
-                path_taper_x = rm["path_taper_x"].AsInteger();
-                path_taper_y = rm["path_taper_y"].AsInteger();
-                path_twist = rm["path_twist"].AsInteger();
-                path_twist_begin = rm["path_twist_begin"].AsInteger();
-                profile_begin = rm["profile_begin"].AsInteger();
-                profile_curve = rm["profile_curve"].AsInteger();
-                profile_end = rm["profile_end"].AsInteger();
-                
-                ray_end_is_intersection = rm["ray_end_is_intersection"].AsBoolean();
-                
-                ray_target_id = rm["ray_target_id"].AsUUID();
-                
-                
-                //session_id = rm["session_id"].AsUUID();
-                state = rm["state"].AsInteger();
-                try 
-                {
-                    ray_end = ((OSDArray)rm["ray_end"]).AsVector3();
-                    ray_start = ((OSDArray)rm["ray_start"]).AsVector3();
-                    rotation = ((OSDArray)rm["rotation"]).AsQuaternion();
-                    scale = ((OSDArray)rm["scale"]).AsVector3();
-                } 
-                catch (Exception)
-                {
-                    responsedata["str_response_string"] = "RayEnd, RayStart, Scale or Rotation wasn't in the expected format";
-                    return responsedata;
-                }
-            }
-
-           
-
-            Vector3 pos = m_scene.GetNewRezLocation(ray_start, ray_end, ray_target_id, rotation, (bypass_raycast) ? (byte)1 : (byte)0,  (ray_end_is_intersection) ? (byte)1 : (byte)0, true, scale, false);
-
-            PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
-
-            pbs.PathBegin = (ushort)path_begin;
-            pbs.PathCurve = (byte)path_curve;
-            pbs.PathEnd = (ushort)path_end;
-            pbs.PathRadiusOffset = (sbyte)path_radius_offset;
-            pbs.PathRevolutions = (byte)path_revolutions;
-            pbs.PathScaleX = (byte)path_scale_x;
-            pbs.PathScaleY = (byte)path_scale_y;
-            pbs.PathShearX = (byte) path_shear_x;
-            pbs.PathShearY = (byte)path_shear_y;
-            pbs.PathSkew = (sbyte)path_skew;
-            pbs.PathTaperX = (sbyte)path_taper_x;
-            pbs.PathTaperY = (sbyte)path_taper_y;
-            pbs.PathTwist = (sbyte)path_twist;
-            pbs.PathTwistBegin = (sbyte)path_twist_begin;
-            pbs.HollowShape = (HollowShape) hollow;
-            pbs.PCode = (byte)p_code;
-            pbs.ProfileBegin = (ushort) profile_begin;
-            pbs.ProfileCurve = (byte) profile_curve;
-            pbs.ProfileEnd = (ushort)profile_end;
-            pbs.Scale = scale;
-            pbs.State = (byte)state;
-
-            SceneObjectGroup obj = null; ;
-
-            if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos))
-            {
-                // rez ON the ground, not IN the ground
-               // pos.Z += 0.25F;
-
-                obj = m_scene.AddNewPrim(avatar.UUID, group_id, pos, rotation, pbs);
-            }
-
-
-            if (obj == null)
-                return responsedata;
-
-            SceneObjectPart rootpart = obj.RootPart;
-            rootpart.Shape = pbs;
-            rootpart.Flags |= (PrimFlags)flags;
-            rootpart.EveryoneMask = everyone_mask;
-            rootpart.GroupID = group_id;
-            rootpart.GroupMask = group_mask;
-            rootpart.NextOwnerMask = next_owner_mask;
-            rootpart.Material = (byte)material;
-            
-            
-            
-            m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor);
-            
-            responsedata["int_response_code"] = 200; //501; //410; //404;
-            responsedata["content_type"] = "text/plain";
-            responsedata["keepalive"] = false;
-            responsedata["str_response_string"] = String.Format("<llsd><map><key>local_id</key>{0}</map></llsd>",ConvertUintToBytes(obj.LocalId));
-
-            return responsedata;
-        }
-
-        private uint readuintval(OSD obj)
-        {
-            byte[] tmp = obj.AsBinary();
-            if (BitConverter.IsLittleEndian)
-                Array.Reverse(tmp);
-            return Utils.BytesToUInt(tmp);
-
-        }
-        private string ConvertUintToBytes(uint val)
-        {
-            byte[] resultbytes = Utils.UIntToBytes(val);
-            if (BitConverter.IsLittleEndian)
-                Array.Reverse(resultbytes);
-            return String.Format("<binary encoding=\"base64\">{0}</binary>",Convert.ToBase64String(resultbytes));
-        }
-
-        public void Close()
-        {
-            
-        }
-
-        public string Name
-        {
-            get { return "ObjectAddModule"; }
-        }
-
-        public bool IsSharedModule
-        {
-            get { return false; }
-        }
-
-        #endregion
-    }
-}
diff --git a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs
deleted file mode 100644
index 3114d7f..0000000
--- a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of the OpenSimulator Project nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Reflection;
-using System.IO;
-using System.Web;
-using Mono.Addins;
-using log4net;
-using Nini.Config;
-using OpenMetaverse;
-using OpenMetaverse.StructuredData;
-using OpenMetaverse.Messages.Linden;
-using OpenSim.Framework;
-using OpenSim.Framework.Servers;
-using OpenSim.Framework.Servers.HttpServer;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes;
-using OpenSim.Services.Interfaces;
-using Caps = OpenSim.Framework.Capabilities.Caps;
-using OSD = OpenMetaverse.StructuredData.OSD;
-using OSDMap = OpenMetaverse.StructuredData.OSDMap;
-using OpenSim.Framework.Capabilities;
-using ExtraParamType = OpenMetaverse.ExtraParamType;
-
-namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
-{
-    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
-    public class UploadObjectAssetModule : INonSharedRegionModule
-    {
-        private static readonly ILog m_log =
-            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-        private Scene m_scene;
-
-        #region IRegionModuleBase Members
-
-
-        public Type ReplaceableInterface
-        {
-            get { return null; }
-        }
-
-        public void Initialise(IConfigSource source)
-        {
-
-        }
-
-        public void AddRegion(Scene pScene)
-        {
-            m_scene = pScene;
-        }
-
-        public void RemoveRegion(Scene scene)
-        {
-
-            m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
-            m_scene = null;
-        }
-
-        public void RegionLoaded(Scene scene)
-        {
-
-            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
-        }
-
-        #endregion
-
-
-        #region IRegionModule Members
-
-
-
-        public void Close() { }
-
-        public string Name { get { return "UploadObjectAssetModuleModule"; } }
-
-
-        public void RegisterCaps(UUID agentID, Caps caps)
-        {
-            UUID capID = UUID.Random();
-
-//            m_log.Debug("[UPLOAD OBJECT ASSET MODULE]: /CAPS/" + capID);
-            caps.RegisterHandler("UploadObjectAsset",
-                                 new RestHTTPHandler("POST", "/CAPS/OA/" + capID + "/",
-                                                       delegate(Hashtable m_dhttpMethod)
-                                                       {
-                                                           return ProcessAdd(m_dhttpMethod, agentID, caps);
-                                                       }));
-            /*
-                   caps.RegisterHandler("NewFileAgentInventoryVariablePrice",
-
-                           new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDNewFileAngentInventoryVariablePriceReplyResponse>("POST",
-                                                                                                  "/CAPS/" + capID.ToString(),
-                                                                                                  delegate(LLSDAssetUploadRequest req)
-                                                              {
-                                                                  return NewAgentInventoryRequest(req,agentID);
-                                                              }));
-             */
-
-        }
-
-        #endregion
-
-
-        /// <summary>
-        /// Parses ad request
-        /// </summary>
-        /// <param name="request"></param>
-        /// <param name="AgentId"></param>
-        /// <param name="cap"></param>
-        /// <returns></returns>
-        public Hashtable ProcessAdd(Hashtable request, 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;
-
-            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
-                return responsedata;
-
-            OSDMap r = (OSDMap)OSDParser.Deserialize((string)request["requestbody"]);
-            UploadObjectAssetMessage message = new UploadObjectAssetMessage();
-            try
-            {
-                message.Deserialize(r);
-
-            }
-            catch (Exception ex)
-            {
-                m_log.Error("[UPLOAD OBJECT ASSET MODULE]: Error deserializing message " + ex.ToString());
-                message = null;
-            }
-
-            if (message == null)
-            {
-                responsedata["int_response_code"] = 400; //501; //410; //404;
-                responsedata["content_type"] = "text/plain";
-                responsedata["keepalive"] = false;
-                responsedata["str_response_string"] =
-                    "<llsd><map><key>error</key><string>Error parsing Object</string></map></llsd>";
-
-                return responsedata;
-            }
-
-            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++)
-            {
-                UploadObjectAssetMessage.Object obj = message.Objects[i];
-                PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
-
-                if (i == 0)
-                {
-                    rootpos = obj.Position;
-//                    rootrot = obj.Rotation;                    
-                }
-
-                // 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)
-                    {
-                        case (ushort)ExtraParamType.Sculpt:
-                            Primitive.SculptData sculpt = new Primitive.SculptData(extraParam.ExtraParamData, 0);
-
-                            pbs.SculptEntry = true;
-
-                            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;
-                       
-                    }
-                    
-                    
-                }
-                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;
-                SceneObjectPart prim = new SceneObjectPart();
-                prim.UUID = UUID.Random();
-                prim.CreatorID = AgentId;
-                prim.OwnerID = AgentId;
-                prim.GroupID = obj.GroupID;
-                prim.LastOwnerID = prim.OwnerID;
-                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"));
-
-                for (int j = 0; j < obj.Faces.Length; j++)
-                {
-                    UploadObjectAssetMessage.Object.Face face = obj.Faces[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.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;
-                
-
-                SceneObjectGroup grp = new SceneObjectGroup();
-
-                grp.SetRootPart(prim);
-                prim.ParentID = 0;
-                if (i == 0)
-                {
-                    rootGroup = grp;
-                   
-                }
-                grp.AttachToScene(m_scene);
-                grp.AbsolutePosition = obj.Position;
-                prim.RotationOffset = obj.Rotation;
-                
-                grp.RootPart.IsAttachment = false;
-                // Required for linking
-                grp.RootPart.UpdateFlag = 0;
-                
-                if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos))
-                {
-                    m_scene.AddSceneObject(grp);
-                    grp.AbsolutePosition = obj.Position;
-                }
-                allparts[i] = grp;
-                
-            }
-
-            for (int j = 1; j < allparts.Length; j++)
-            {
-                rootGroup.RootPart.UpdateFlag = 0;
-                allparts[j].RootPart.UpdateFlag = 0;
-                rootGroup.LinkToGroup(allparts[j]);
-            }
-
-            rootGroup.ScheduleGroupForFullUpdate();
-            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("<llsd><map><key>local_id</key>{0}</map></llsd>", ConvertUintToBytes(allparts[0].LocalId));
-
-            return responsedata;
-        }
-        
-        private string ConvertUintToBytes(uint val)
-        {
-            byte[] resultbytes = Utils.UIntToBytes(val);
-            if (BitConverter.IsLittleEndian)
-                Array.Reverse(resultbytes);
-            return String.Format("<binary encoding=\"base64\">{0}</binary>", Convert.ToBase64String(resultbytes));
-        }
-    }
-}
\ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Caps/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Caps/CapabilitiesModule.cs
new file mode 100644
index 0000000..ab388b9
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Caps/CapabilitiesModule.cs
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyrightD
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Framework.Console;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using Caps=OpenSim.Framework.Capabilities.Caps;
+
+namespace OpenSim.Region.CoreModules.Capabilities
+{
+    public class CapabilitiesModule : INonSharedRegionModule, ICapabilitiesModule
+    { 
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        
+        protected Scene m_scene;
+        
+        /// <summary>
+        /// Each agent has its own capabilities handler.
+        /// </summary>
+        protected Dictionary<UUID, Caps> m_capsHandlers = new Dictionary<UUID, Caps>();
+        
+        protected Dictionary<UUID, string> capsPaths = new Dictionary<UUID, string>();
+        protected Dictionary<UUID, Dictionary<ulong, string>> childrenSeeds 
+            = new Dictionary<UUID, Dictionary<ulong, string>>();
+        
+        public void Initialise(IConfigSource source)
+        {
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            m_scene = scene;
+            m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
+            MainConsole.Instance.Commands.AddCommand("Capabilities", false, "show caps",
+                "show capabilities",
+                "Shows all  registered capabilities", CapabilitiesCommand);
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            m_scene.UnregisterModuleInterface<ICapabilitiesModule>(this);
+        }
+        
+        public void PostInitialise() 
+        {
+        }
+
+        public void Close() {}
+
+        public string Name 
+        { 
+            get { return "Capabilities Module"; } 
+        }
+
+        public Type ReplaceableInterface
+        {
+            get { return null; }
+        }
+
+        public void AddCapsHandler(UUID agentId)
+        {
+            if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId))
+                return;
+
+            String capsObjectPath = GetCapsPath(agentId);
+
+            if (m_capsHandlers.ContainsKey(agentId))
+            {
+                Caps oldCaps = m_capsHandlers[agentId];
+                
+                m_log.DebugFormat(
+                    "[CAPS]: Reregistering caps for agent {0}.  Old caps path {1}, new caps path {2}. ", 
+                    agentId, oldCaps.CapsObjectPath, capsObjectPath);
+                // This should not happen. The caller code is confused. We need to fix that.
+                // CAPs can never be reregistered, or the client will be confused.
+                // Hence this return here.
+                //return;
+            }
+
+            Caps caps
+                = new Caps(m_scene,
+                    m_scene.AssetService, MainServer.Instance, m_scene.RegionInfo.ExternalHostName,
+                    (MainServer.Instance == null) ? 0: MainServer.Instance.Port,
+                    capsObjectPath, agentId, m_scene.DumpAssetsToFile, m_scene.RegionInfo.RegionName);
+
+            caps.RegisterHandlers();
+
+            m_scene.EventManager.TriggerOnRegisterCaps(agentId, caps);
+
+            caps.AddNewInventoryItem = m_scene.AddUploadedInventoryItem;
+            caps.ItemUpdatedCall = m_scene.CapsUpdateInventoryItemAsset;
+            caps.TaskScriptUpdatedCall = m_scene.CapsUpdateTaskInventoryScriptAsset;
+            caps.CAPSFetchInventoryDescendents = m_scene.HandleFetchInventoryDescendentsCAPS;
+            caps.GetClient = m_scene.SceneContents.GetControllingClient;
+
+            m_capsHandlers[agentId] = caps;
+        }
+
+        public void RemoveCapsHandler(UUID agentId)
+        {
+            if (childrenSeeds.ContainsKey(agentId))
+            {
+                childrenSeeds.Remove(agentId);
+            }
+
+            lock (m_capsHandlers)
+            {
+                if (m_capsHandlers.ContainsKey(agentId))
+                {
+                    m_capsHandlers[agentId].DeregisterHandlers();
+                    m_scene.EventManager.TriggerOnDeregisterCaps(agentId, m_capsHandlers[agentId]);
+                    m_capsHandlers.Remove(agentId);
+                }
+                else
+                {
+                    m_log.WarnFormat(
+                        "[CAPS]: Received request to remove CAPS handler for root agent {0} in {1}, but no such CAPS handler found!",
+                        agentId, m_scene.RegionInfo.RegionName);
+                }
+            }
+        }
+        
+        public Caps GetCapsHandlerForUser(UUID agentId)
+        {
+            lock (m_capsHandlers)
+            {
+                if (m_capsHandlers.ContainsKey(agentId))
+                {
+                    return m_capsHandlers[agentId];
+                }
+            }
+            
+            return null;
+        }
+        
+        public void NewUserConnection(AgentCircuitData agent)
+        {
+            capsPaths[agent.AgentID] = agent.CapsPath;
+            childrenSeeds[agent.AgentID] 
+                = ((agent.ChildrenCapSeeds == null) ? new Dictionary<ulong, string>() : agent.ChildrenCapSeeds);
+        }
+        
+        public string GetCapsPath(UUID agentId)
+        {
+            if (capsPaths.ContainsKey(agentId))
+            {
+                return capsPaths[agentId];
+            }
+
+            return null;
+        }
+        
+        public Dictionary<ulong, string> GetChildrenSeeds(UUID agentID)
+        {
+            Dictionary<ulong, string> seeds = null;
+            if (childrenSeeds.TryGetValue(agentID, out seeds))
+                return seeds;
+            return new Dictionary<ulong, string>();
+        }
+
+        public void DropChildSeed(UUID agentID, ulong handle)
+        {
+            Dictionary<ulong, string> seeds;
+            if (childrenSeeds.TryGetValue(agentID, out seeds))
+            {
+                seeds.Remove(handle);
+            }
+        }
+
+        public string GetChildSeed(UUID agentID, ulong handle)
+        {
+            Dictionary<ulong, string> seeds;
+            string returnval;
+            if (childrenSeeds.TryGetValue(agentID, out seeds))
+            {
+                if (seeds.TryGetValue(handle, out returnval))
+                    return returnval;
+            }
+            return null;
+        }
+
+        public void SetChildrenSeed(UUID agentID, Dictionary<ulong, string> seeds)
+        {
+            //m_log.DebugFormat(" !!! Setting child seeds in {0} to {1}", m_scene.RegionInfo.RegionName, seeds.Count);
+            childrenSeeds[agentID] = seeds;
+        }
+
+        public void DumpChildrenSeeds(UUID agentID)
+        {
+            m_log.Info("================ ChildrenSeed "+m_scene.RegionInfo.RegionName+" ================");
+            foreach (KeyValuePair<ulong, string> kvp in childrenSeeds[agentID])
+            {
+                uint x, y;
+                Utils.LongToUInts(kvp.Key, out x, out y);
+                x = x / Constants.RegionSize;
+                y = y / Constants.RegionSize;
+                m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
+            }
+        }
+
+        private void CapabilitiesCommand(string module, string[] cmdparams)
+        {
+            System.Text.StringBuilder caps = new System.Text.StringBuilder();
+            caps.AppendFormat("Region {0}:\n", m_scene.RegionInfo.RegionName);
+
+            foreach (KeyValuePair<UUID, Caps> kvp in m_capsHandlers)
+            {
+                caps.AppendFormat("** User {0}:\n", kvp.Key);
+                for (IDictionaryEnumerator kvp2 = kvp.Value.CapsHandlers.CapsDetails.GetEnumerator(); kvp2.MoveNext(); )
+                {
+                    Uri uri = new Uri(kvp2.Value.ToString());
+                    caps.AppendFormat("   {0} = {1}\n", kvp2.Key, uri.PathAndQuery);
+                }
+            }
+
+            MainConsole.Instance.Output(caps.ToString());
+        }
+    }
+}
diff --git a/OpenSim/Region/CoreModules/Caps/GetMeshModule.cs b/OpenSim/Region/CoreModules/Caps/GetMeshModule.cs
new file mode 100644
index 0000000..46b2378
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Caps/GetMeshModule.cs
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Reflection;
+using System.IO;
+using System.Web;
+using Mono.Addins;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using Caps = OpenSim.Framework.Capabilities.Caps;
+
+namespace OpenSim.Region.CoreModules.Capabilities
+{
+    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
+    public class GetMeshModule : INonSharedRegionModule
+    {
+//        private static readonly ILog m_log =
+//            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        
+        private Scene m_scene;
+        private IAssetService m_assetService;
+        private bool m_enabled = true;
+
+        #region IRegionModuleBase Members
+
+
+        public Type ReplaceableInterface
+        {
+            get { return null; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+            IConfig meshConfig = source.Configs["Mesh"];
+            if (meshConfig == null)
+                return;
+
+            m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true);
+        }
+
+        public void AddRegion(Scene pScene)
+        {
+            m_scene = pScene;
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            
+            m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
+            m_scene = null;
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+            
+            m_assetService = m_scene.RequestModuleInterface<IAssetService>();
+            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
+        }
+
+        #endregion
+
+
+        #region IRegionModule Members
+
+       
+
+        public void Close() { }
+
+        public string Name { get { return "GetMeshModule"; } }
+
+
+        public void RegisterCaps(UUID agentID, Caps caps)
+        {
+            if(!m_enabled)
+                return;
+
+            UUID capID = UUID.Random();
+
+//            m_log.Info("[GETMESH]: /CAPS/" + capID);
+
+            caps.RegisterHandler("GetMesh",
+                                 new RestHTTPHandler("GET", "/CAPS/" + capID,
+                                                       delegate(Hashtable m_dhttpMethod)
+                                                       {
+                                                           return ProcessGetMesh(m_dhttpMethod, agentID, caps);
+                                                       }));
+        }
+
+        #endregion
+
+        public Hashtable ProcessGetMesh(Hashtable request, 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";
+
+            string meshStr = string.Empty;
+
+            if (request.ContainsKey("mesh_id"))
+                meshStr = request["mesh_id"].ToString();
+
+
+            UUID meshID = UUID.Zero;
+            if (!String.IsNullOrEmpty(meshStr) && UUID.TryParse(meshStr, out meshID))
+            {
+                if (m_assetService == null)
+                {
+                    responsedata["int_response_code"] = 404; //501; //410; //404;
+                    responsedata["content_type"] = "text/plain";
+                    responsedata["keepalive"] = false;
+                    responsedata["str_response_string"] = "The asset service is unavailable.  So is your mesh.";
+                    return responsedata;
+                }
+
+                AssetBase mesh;
+                // Only try to fetch locally cached textures. Misses are redirected
+                mesh = m_assetService.GetCached(meshID.ToString());
+                if (mesh != null)
+                {
+                    if (mesh.Type == (SByte)AssetType.Mesh) 
+                    {
+                        responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
+                        responsedata["content_type"] = "application/vnd.ll.mesh";
+                        responsedata["int_response_code"] = 200;
+                    }
+                    // Optionally add additional mesh types here
+                    else
+                    {
+                        responsedata["int_response_code"] = 404; //501; //410; //404;
+                        responsedata["content_type"] = "text/plain";
+                        responsedata["keepalive"] = false;
+                        responsedata["str_response_string"] = "Unfortunately, this asset isn't a mesh.";
+                        return responsedata;
+                    }
+                }
+                else
+                {
+                    mesh = m_assetService.Get(meshID.ToString());
+                    if (mesh != null)
+                    {
+                        if (mesh.Type == (SByte)AssetType.Mesh) 
+                        {
+                            responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data);
+                            responsedata["content_type"] = "application/vnd.ll.mesh";
+                            responsedata["int_response_code"] = 200;
+                        }
+                        // Optionally add additional mesh types here
+                        else
+                        {
+                            responsedata["int_response_code"] = 404; //501; //410; //404;
+                            responsedata["content_type"] = "text/plain";
+                            responsedata["keepalive"] = false;
+                            responsedata["str_response_string"] = "Unfortunately, this asset isn't a mesh.";
+                            return responsedata;
+                        }
+                    }
+
+                    else
+                    {
+                        responsedata["int_response_code"] = 404; //501; //410; //404;
+                        responsedata["content_type"] = "text/plain";
+                        responsedata["keepalive"] = false;
+                        responsedata["str_response_string"] = "Your Mesh wasn't found.  Sorry!";
+                        return responsedata;
+                    }
+                }
+
+            }
+
+            return responsedata;
+        }
+    }
+}
diff --git a/OpenSim/Region/CoreModules/Caps/GetTextureModule.cs b/OpenSim/Region/CoreModules/Caps/GetTextureModule.cs
new file mode 100644
index 0000000..34095a2
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Caps/GetTextureModule.cs
@@ -0,0 +1,402 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Reflection;
+using System.IO;
+using System.Web;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using OpenMetaverse.Imaging;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using Caps = OpenSim.Framework.Capabilities.Caps;
+
+namespace OpenSim.Region.CoreModules.Capabilities
+{
+    #region Stream Handler
+
+    public delegate byte[] StreamHandlerCallback(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse);
+
+    public class StreamHandler : BaseStreamHandler
+    {
+        StreamHandlerCallback m_callback;
+
+        public StreamHandler(string httpMethod, string path, StreamHandlerCallback callback)
+            : base(httpMethod, path)
+        {
+            m_callback = callback;
+        }
+
+        public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+        {
+            return m_callback(path, request, httpRequest, httpResponse);
+        }
+    }
+
+    #endregion Stream Handler
+
+    public class GetTextureModule : IRegionModule
+    {
+        private static readonly ILog m_log =
+            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private Scene m_scene;
+        private IAssetService m_assetService;
+
+        public const string DefaultFormat = "x-j2c";
+
+        // TODO: Change this to a config option
+        const string REDIRECT_URL = null;
+
+
+        #region IRegionModule Members
+
+        public void Initialise(Scene pScene, IConfigSource pSource)
+        {
+            m_scene = pScene;
+        }
+
+        public void PostInitialise()
+        {
+            m_assetService = m_scene.RequestModuleInterface<IAssetService>();
+            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
+        }
+
+        public void Close() { }
+
+        public string Name { get { return "GetTextureModule"; } }
+        public bool IsSharedModule { get { return false; } }
+
+        public void RegisterCaps(UUID agentID, Caps caps)
+        {
+            UUID capID = UUID.Random();
+
+//            m_log.InfoFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName);
+            caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture));
+        }
+
+        #endregion
+
+        private byte[] ProcessGetTexture(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+        {
+            //m_log.DebugFormat("[GETTEXTURE]: called in {0}", m_scene.RegionInfo.RegionName);
+
+            // Try to parse the texture ID from the request URL
+            NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query);
+            string textureStr = query.GetOne("texture_id");
+            string format = query.GetOne("format");
+
+            if (m_assetService == null)
+            {
+                m_log.Error("[GETTEXTURE]: Cannot fetch texture " + textureStr + " without an asset service");
+                httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+                return null;
+            }
+
+            UUID textureID;
+            if (!String.IsNullOrEmpty(textureStr) && UUID.TryParse(textureStr, out textureID))
+            {
+                string[] formats;
+                if (format != null && format != string.Empty)
+                {
+                    formats = new string[1] { format.ToLower() };
+                }
+                else
+                {
+                    formats = WebUtil.GetPreferredImageTypes(httpRequest.Headers.Get("Accept"));
+                    if (formats.Length == 0)
+                        formats = new string[1] { DefaultFormat }; // default
+
+                }
+                // OK, we have an array with preferred formats, possibly with only one entry
+
+                httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+                foreach (string f in formats)
+                {
+                    if (FetchTexture(httpRequest, httpResponse, textureID, f))
+                        break;
+                }
+
+            }
+            else
+            {
+                m_log.Warn("[GETTEXTURE]: Failed to parse a texture_id from GetTexture request: " + httpRequest.Url);
+            }
+
+            httpResponse.Send();
+            return null;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="httpRequest"></param>
+        /// <param name="httpResponse"></param>
+        /// <param name="textureID"></param>
+        /// <param name="format"></param>
+        /// <returns>False for "caller try another codec"; true otherwise</returns>
+        private bool FetchTexture(OSHttpRequest httpRequest, OSHttpResponse httpResponse, UUID textureID, string format)
+        {
+//            m_log.DebugFormat("[GETTEXTURE]: {0} with requested format {1}", textureID, format);
+            AssetBase texture;
+
+            string fullID = textureID.ToString();
+            if (format != DefaultFormat)
+                fullID = fullID + "-" + format;
+
+            if (!String.IsNullOrEmpty(REDIRECT_URL))
+            {
+                // Only try to fetch locally cached textures. Misses are redirected
+                texture = m_assetService.GetCached(fullID);
+
+                if (texture != null)
+                {
+                    if (texture.Type != (sbyte)AssetType.Texture)
+                    {
+                        httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+                        return true;
+                    }
+                    WriteTextureData(httpRequest, httpResponse, texture, format);
+                }
+                else
+                {
+                    string textureUrl = REDIRECT_URL + textureID.ToString();
+                    m_log.Debug("[GETTEXTURE]: Redirecting texture request to " + textureUrl);
+                    httpResponse.RedirectLocation = textureUrl;
+                    return true;
+                }
+            }
+            else // no redirect
+            {
+                // try the cache
+                texture = m_assetService.GetCached(fullID);
+
+                if (texture == null)
+                {
+                    //m_log.DebugFormat("[GETTEXTURE]: texture was not in the cache");
+
+                    // Fetch locally or remotely. Misses return a 404
+                    texture = m_assetService.Get(textureID.ToString());
+
+                    if (texture != null)
+                    {
+                        if (texture.Type != (sbyte)AssetType.Texture)
+                        {
+                            httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+                            return true;
+                        }
+                        if (format == DefaultFormat)
+                        {
+                            WriteTextureData(httpRequest, httpResponse, texture, format);
+                            return true;
+                        }
+                        else
+                        {
+                            AssetBase newTexture = new AssetBase(texture.ID + "-" + format, texture.Name, (sbyte)AssetType.Texture, texture.Metadata.CreatorID);
+                            newTexture.Data = ConvertTextureData(texture, format);
+                            if (newTexture.Data.Length == 0)
+                                return false; // !!! Caller try another codec, please!
+
+                            newTexture.Flags = AssetFlags.Collectable;
+                            newTexture.Temporary = true;
+                            m_assetService.Store(newTexture);
+                            WriteTextureData(httpRequest, httpResponse, newTexture, format);
+                            return true;
+                        }
+                    }
+               }
+               else // it was on the cache
+               {
+                   //m_log.DebugFormat("[GETTEXTURE]: texture was in the cache");
+                   WriteTextureData(httpRequest, httpResponse, texture, format);
+                   return true;
+               }
+            }
+
+            // not found
+//            m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found");
+            httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+            return true;
+        }
+
+        private void WriteTextureData(OSHttpRequest request, OSHttpResponse response, AssetBase texture, string format)
+        {
+            string range = request.Headers.GetOne("Range");
+            //m_log.DebugFormat("[GETTEXTURE]: Range {0}", range);
+            if (!String.IsNullOrEmpty(range)) // JP2's only
+            {
+                // Range request
+                int start, end;
+                if (TryParseRange(range, out start, out end))
+                {
+                    // Before clamping start make sure we can satisfy it in order to avoid
+                    // sending back the last byte instead of an error status
+                    if (start >= texture.Data.Length)
+                    {
+                        response.StatusCode = (int)System.Net.HttpStatusCode.RequestedRangeNotSatisfiable;
+                        return;
+                    }
+
+                    end = Utils.Clamp(end, 0, texture.Data.Length - 1);
+                    start = Utils.Clamp(start, 0, end);
+                    int len = end - start + 1;
+
+                    //m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID);
+
+                    if (len < texture.Data.Length)
+                        response.StatusCode = (int)System.Net.HttpStatusCode.PartialContent;
+
+                    response.ContentLength = len;
+                    response.ContentType = texture.Metadata.ContentType;
+                    response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length));
+
+                    response.Body.Write(texture.Data, start, len);
+                }
+                else
+                {
+                    m_log.Warn("[GETTEXTURE]: Malformed Range header: " + range);
+                    response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
+                }
+            }
+            else // JP2's or other formats
+            {
+                // Full content request
+                response.StatusCode = (int)System.Net.HttpStatusCode.OK;
+                response.ContentLength = texture.Data.Length;
+                if (format == DefaultFormat)
+                    response.ContentType = texture.Metadata.ContentType;
+                else
+                    response.ContentType = "image/" + format;
+                response.Body.Write(texture.Data, 0, texture.Data.Length);
+            }
+        }
+
+        private bool TryParseRange(string header, out int start, out int end)
+        {
+            if (header.StartsWith("bytes="))
+            {
+                string[] rangeValues = header.Substring(6).Split('-');
+                if (rangeValues.Length == 2)
+                {
+                    if (Int32.TryParse(rangeValues[0], out start) && Int32.TryParse(rangeValues[1], out end))
+                        return true;
+                }
+            }
+
+            start = end = 0;
+            return false;
+        }
+
+
+        private byte[] ConvertTextureData(AssetBase texture, string format)
+        {
+            m_log.DebugFormat("[GETTEXTURE]: Converting texture {0} to {1}", texture.ID, format);
+            byte[] data = new byte[0];
+
+            MemoryStream imgstream = new MemoryStream();
+            Bitmap mTexture = new Bitmap(1, 1);
+            ManagedImage managedImage;
+            Image image = (Image)mTexture;
+
+            try
+            {
+                // Taking our jpeg2000 data, decoding it, then saving it to a byte array with regular data
+
+                imgstream = new MemoryStream();
+
+                // Decode image to System.Drawing.Image
+                if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image))
+                {
+                    // Save to bitmap
+                    mTexture = new Bitmap(image);
+
+                    EncoderParameters myEncoderParameters = new EncoderParameters();
+                    myEncoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 95L);
+
+                    // Save bitmap to stream
+                    ImageCodecInfo codec = GetEncoderInfo("image/" + format);
+                    if (codec != null)
+                    {
+                        mTexture.Save(imgstream, codec, myEncoderParameters);
+                        // Write the stream to a byte array for output
+                        data = imgstream.ToArray();
+                    }
+                    else
+                        m_log.WarnFormat("[GETTEXTURE]: No such codec {0}", format);
+
+                }
+            }
+            catch (Exception e)
+            {
+                m_log.WarnFormat("[GETTEXTURE]: Unable to convert texture {0} to {1}: {2}", texture.ID, format, e.Message);
+            }
+            finally
+            {
+                // Reclaim memory, these are unmanaged resources
+                // If we encountered an exception, one or more of these will be null
+                if (mTexture != null)
+                    mTexture.Dispose();
+
+                if (image != null)
+                    image.Dispose();
+
+                if (imgstream != null)
+                {
+                    imgstream.Close();
+                    imgstream.Dispose();
+                }
+            }
+
+            return data;
+        }
+
+        // From msdn
+        private static ImageCodecInfo GetEncoderInfo(String mimeType)
+        {
+            ImageCodecInfo[] encoders;
+            encoders = ImageCodecInfo.GetImageEncoders();
+            for (int j = 0; j < encoders.Length; ++j)
+            {
+                if (encoders[j].MimeType == mimeType)
+                    return encoders[j];
+            }
+            return null;
+        }
+
+
+    }
+}
diff --git a/OpenSim/Region/CoreModules/Caps/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/CoreModules/Caps/NewFileAgentInventoryVariablePriceModule.cs
new file mode 100644
index 0000000..3ebaf1f
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Caps/NewFileAgentInventoryVariablePriceModule.cs
@@ -0,0 +1,275 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Reflection;
+using System.IO;
+using System.Web;
+using Mono.Addins;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using Caps = OpenSim.Framework.Capabilities.Caps;
+using OpenSim.Framework.Capabilities;
+
+namespace OpenSim.Region.CoreModules.Capabilities
+{
+    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
+    public class NewFileAgentInventoryVariablePriceModule : INonSharedRegionModule
+    {
+//        private static readonly ILog m_log =
+//            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        
+        private Scene m_scene;
+//        private IAssetService m_assetService;
+        private bool m_dumpAssetsToFile = false;
+        private bool m_enabled = true;
+
+        #region IRegionModuleBase Members
+
+
+        public Type ReplaceableInterface
+        {
+            get { return null; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+            IConfig meshConfig = source.Configs["Mesh"];
+            if (meshConfig == null)
+                return;
+
+            m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true);
+        }
+
+        public void AddRegion(Scene pScene)
+        {
+            m_scene = pScene;
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            
+            m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
+            m_scene = null;
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+            
+//            m_assetService = m_scene.RequestModuleInterface<IAssetService>();
+            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
+        }
+
+        #endregion
+
+
+        #region IRegionModule Members
+
+       
+
+        public void Close() { }
+
+        public string Name { get { return "NewFileAgentInventoryVariablePriceModule"; } }
+
+
+        public void RegisterCaps(UUID agentID, Caps caps)
+        {
+            if(!m_enabled)
+                return;
+
+            UUID capID = UUID.Random();
+
+//            m_log.Debug("[NEW FILE AGENT INVENTORY VARIABLE PRICE]: /CAPS/" + capID);
+            caps.RegisterHandler("NewFileAgentInventoryVariablePrice",
+
+                    new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDNewFileAngentInventoryVariablePriceReplyResponse>("POST",
+                                                                                           "/CAPS/" + capID.ToString(),
+                                                                                           delegate(LLSDAssetUploadRequest req)
+                                                       {
+                                                           return NewAgentInventoryRequest(req,agentID);
+                                                       }));
+         
+        }
+
+        #endregion
+
+        public LLSDNewFileAngentInventoryVariablePriceReplyResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest, UUID agentID)
+        {
+
+            //TODO:  The Mesh uploader uploads many types of content. If you're going to implement a Money based limit
+            // You need to be aware of this and 
+
+
+            //if (llsdRequest.asset_type == "texture" ||
+           //     llsdRequest.asset_type == "animation" ||
+           //     llsdRequest.asset_type == "sound")
+           // {
+                IClientAPI client = null;
+
+                
+                IMoneyModule mm = m_scene.RequestModuleInterface<IMoneyModule>();
+                
+                if (mm != null)
+                {
+                    if (m_scene.TryGetClient(agentID, out client))
+                    {
+                        if (!mm.UploadCovered(client, mm.UploadCharge))
+                        {
+                            if (client != null)
+                                client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
+
+                            LLSDNewFileAngentInventoryVariablePriceReplyResponse errorResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse();
+                            errorResponse.rsvp = "";
+                            errorResponse.state = "error";
+                            return errorResponse;
+                        }
+                    }
+                }
+           // }
+            
+
+
+            string assetName = llsdRequest.name;
+            string assetDes = llsdRequest.description;
+            string capsBase = "/CAPS/NewFileAgentInventoryVariablePrice/";
+            UUID newAsset = UUID.Random();
+            UUID newInvItem = UUID.Random();
+            UUID parentFolder = llsdRequest.folder_id;
+            string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000") + "/";
+
+            Caps.AssetUploader uploader =
+                new Caps.AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
+                                  llsdRequest.asset_type, capsBase + uploaderPath, MainServer.Instance, m_dumpAssetsToFile);
+            MainServer.Instance.AddStreamHandler(
+                new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
+
+            string protocol = "http://";
+
+            if (MainServer.Instance.UseSSL)
+                protocol = "https://";
+
+            string uploaderURL = protocol + m_scene.RegionInfo.ExternalHostName + ":" + MainServer.Instance.Port.ToString() + capsBase +
+                                 uploaderPath;
+         
+
+            LLSDNewFileAngentInventoryVariablePriceReplyResponse uploadResponse = new LLSDNewFileAngentInventoryVariablePriceReplyResponse();
+           
+            
+            uploadResponse.rsvp = uploaderURL;
+            uploadResponse.state = "upload";
+            uploadResponse.resource_cost = 0;
+            uploadResponse.upload_price = 0;
+
+            uploader.OnUpLoad += //UploadCompleteHandler;
+                
+                delegate(
+                string passetName, string passetDescription, UUID passetID,
+                UUID pinventoryItem, UUID pparentFolder, byte[] pdata, string pinventoryType,
+                string passetType)
+               {
+                   UploadCompleteHandler(passetName, passetDescription,  passetID,
+                                          pinventoryItem, pparentFolder, pdata,  pinventoryType,
+                                          passetType,agentID);
+               };
+            return uploadResponse;
+        }
+
+       
+        public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
+                                          UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
+                                          string assetType,UUID AgentID)
+        {
+            
+            sbyte assType = 0;
+            sbyte inType = 0;
+
+            if (inventoryType == "sound")
+            {
+                inType = 1;
+                assType = 1;
+            }
+            else if (inventoryType == "animation")
+            {
+                inType = 19;
+                assType = 20;
+            }
+            else if (inventoryType == "wearable")
+            {
+                inType = 18;
+                switch (assetType)
+                {
+                    case "bodypart":
+                        assType = 13;
+                        break;
+                    case "clothing":
+                        assType = 5;
+                        break;
+                }
+            }
+            else if (inventoryType == "mesh")
+            {
+                inType = (sbyte)InventoryType.Mesh; 
+                assType = (sbyte)AssetType.Mesh;
+            }
+
+            AssetBase asset;
+            asset = new AssetBase(assetID, assetName, assType, AgentID.ToString());
+            asset.Data = data;
+    
+            if (m_scene.AssetService != null)
+                m_scene.AssetService.Store(asset);
+
+            InventoryItemBase item = new InventoryItemBase();
+            item.Owner = AgentID;
+            item.CreatorId = AgentID.ToString();
+            item.ID = inventoryItem;
+            item.AssetID = asset.FullID;
+            item.Description = assetDescription;
+            item.Name = assetName;
+            item.AssetType = assType;
+            item.InvType = inType;
+            item.Folder = parentFolder;
+            item.CurrentPermissions = (uint)PermissionMask.All;
+            item.BasePermissions = (uint)PermissionMask.All;
+            item.EveryOnePermissions = 0;
+            item.NextPermissions = (uint)(PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer);
+            item.CreationDate = Util.UnixTimeSinceEpoch();
+            m_scene.AddInventoryItem(item);
+            
+        }
+    }
+}
diff --git a/OpenSim/Region/CoreModules/Caps/ObjectCaps/ObjectAdd.cs b/OpenSim/Region/CoreModules/Caps/ObjectCaps/ObjectAdd.cs
new file mode 100644
index 0000000..5cd0fe7
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Caps/ObjectCaps/ObjectAdd.cs
@@ -0,0 +1,370 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Reflection;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using Caps=OpenSim.Framework.Capabilities.Caps;
+
+namespace OpenSim.Region.CoreModules.Capabilities
+{
+    public class ObjectAdd : IRegionModule
+    {
+//        private static readonly ILog m_log =
+//            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        
+        private Scene m_scene;
+        #region IRegionModule Members
+
+        public void Initialise(Scene pScene, IConfigSource pSource)
+        {
+            m_scene = pScene;
+            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
+        }
+
+        public void PostInitialise()
+        {
+            
+        }
+
+        public void RegisterCaps(UUID agentID, Caps caps)
+        {
+            UUID capuuid = UUID.Random();
+            
+//            m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/");
+
+            caps.RegisterHandler("ObjectAdd",
+                                 new RestHTTPHandler("POST", "/CAPS/OA/" + capuuid + "/",
+                                                       delegate(Hashtable m_dhttpMethod)
+                                                       {
+                                                           return ProcessAdd(m_dhttpMethod, agentID, caps);
+                                                       }));
+        }
+
+        public Hashtable ProcessAdd(Hashtable request, 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;
+            
+            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
+                return responsedata;
+
+
+            OSD r = OSDParser.DeserializeLLSDXml((string)request["requestbody"]);
+            //UUID session_id = UUID.Zero;
+            bool bypass_raycast = false;
+            uint everyone_mask = 0;
+            uint group_mask = 0;
+            uint next_owner_mask = 0;
+            uint flags = 0;
+            UUID group_id = UUID.Zero;
+            int hollow = 0;
+            int material = 0;
+            int p_code = 0;
+            int path_begin = 0;
+            int path_curve = 0;
+            int path_end = 0;
+            int path_radius_offset = 0;
+            int path_revolutions = 0;
+            int path_scale_x = 0;
+            int path_scale_y = 0;
+            int path_shear_x = 0;
+            int path_shear_y = 0;
+            int path_skew = 0;
+            int path_taper_x = 0;
+            int path_taper_y = 0;
+            int path_twist = 0;
+            int path_twist_begin = 0;
+            int profile_begin = 0;
+            int profile_curve = 0;
+            int profile_end = 0;
+            Vector3 ray_end = Vector3.Zero;
+            bool ray_end_is_intersection = false;
+            Vector3 ray_start = Vector3.Zero;
+            UUID ray_target_id = UUID.Zero;
+            Quaternion rotation = Quaternion.Identity;
+            Vector3 scale = Vector3.Zero;
+            int state = 0;
+
+            if (r.Type != OSDType.Map) // not a proper req
+                return responsedata;
+            
+            OSDMap rm = (OSDMap)r;
+
+            if (rm.ContainsKey("ObjectData")) //v2
+            {
+                if (rm["ObjectData"].Type != OSDType.Map)
+                {
+                    responsedata["str_response_string"] = "Has ObjectData key, but data not in expected format";
+                    return responsedata;
+                }
+
+                OSDMap ObjMap = (OSDMap) rm["ObjectData"];
+
+                bypass_raycast = ObjMap["BypassRaycast"].AsBoolean();
+                everyone_mask = readuintval(ObjMap["EveryoneMask"]);
+                flags = readuintval(ObjMap["Flags"]);
+                group_mask = readuintval(ObjMap["GroupMask"]);
+                material = ObjMap["Material"].AsInteger();
+                next_owner_mask = readuintval(ObjMap["NextOwnerMask"]);
+                p_code = ObjMap["PCode"].AsInteger();
+
+                if (ObjMap.ContainsKey("Path"))
+                {
+                    if (ObjMap["Path"].Type != OSDType.Map)
+                    {
+                        responsedata["str_response_string"] = "Has Path key, but data not in expected format";
+                        return responsedata;
+                    }
+
+                    OSDMap PathMap = (OSDMap)ObjMap["Path"];
+                    path_begin = PathMap["Begin"].AsInteger();
+                    path_curve = PathMap["Curve"].AsInteger();
+                    path_end = PathMap["End"].AsInteger();
+                    path_radius_offset = PathMap["RadiusOffset"].AsInteger();
+                    path_revolutions = PathMap["Revolutions"].AsInteger();
+                    path_scale_x = PathMap["ScaleX"].AsInteger();
+                    path_scale_y = PathMap["ScaleY"].AsInteger();
+                    path_shear_x = PathMap["ShearX"].AsInteger();
+                    path_shear_y = PathMap["ShearY"].AsInteger();
+                    path_skew = PathMap["Skew"].AsInteger();
+                    path_taper_x = PathMap["TaperX"].AsInteger();
+                    path_taper_y = PathMap["TaperY"].AsInteger();
+                    path_twist = PathMap["Twist"].AsInteger();
+                    path_twist_begin = PathMap["TwistBegin"].AsInteger();
+
+                }
+
+                if (ObjMap.ContainsKey("Profile"))
+                {
+                    if (ObjMap["Profile"].Type != OSDType.Map)
+                    {
+                        responsedata["str_response_string"] = "Has Profile key, but data not in expected format";
+                        return responsedata;
+                    }
+                        
+                    OSDMap ProfileMap = (OSDMap)ObjMap["Profile"];
+
+                    profile_begin = ProfileMap["Begin"].AsInteger();
+                    profile_curve = ProfileMap["Curve"].AsInteger();
+                    profile_end = ProfileMap["End"].AsInteger();
+                    hollow = ProfileMap["Hollow"].AsInteger();
+                }
+                ray_end_is_intersection = ObjMap["RayEndIsIntersection"].AsBoolean();
+                
+                ray_target_id = ObjMap["RayTargetId"].AsUUID();
+                state = ObjMap["State"].AsInteger();
+                try
+                {
+                    ray_end = ((OSDArray) ObjMap["RayEnd"]).AsVector3();
+                    ray_start = ((OSDArray) ObjMap["RayStart"]).AsVector3();
+                    scale = ((OSDArray) ObjMap["Scale"]).AsVector3();
+                    rotation = ((OSDArray)ObjMap["Rotation"]).AsQuaternion();
+                }
+                catch (Exception)
+                {
+                    responsedata["str_response_string"] = "RayEnd, RayStart, Scale or Rotation wasn't in the expected format";
+                    return responsedata;
+                }
+
+                if (rm.ContainsKey("AgentData"))
+                {
+                    if (rm["AgentData"].Type != OSDType.Map)
+                    {
+                        responsedata["str_response_string"] = "Has AgentData key, but data not in expected format";
+                        return responsedata;
+                    }
+
+                    OSDMap AgentDataMap = (OSDMap) rm["AgentData"];
+
+                    //session_id = AgentDataMap["SessionId"].AsUUID();
+                    group_id = AgentDataMap["GroupId"].AsUUID();
+                }
+
+            }
+            else
+            { //v1
+                bypass_raycast = rm["bypass_raycast"].AsBoolean();
+
+                everyone_mask = readuintval(rm["everyone_mask"]);
+                flags = readuintval(rm["flags"]);
+                group_id = rm["group_id"].AsUUID();
+                group_mask = readuintval(rm["group_mask"]);
+                hollow = rm["hollow"].AsInteger();
+                material = rm["material"].AsInteger();
+                next_owner_mask = readuintval(rm["next_owner_mask"]);
+                hollow = rm["hollow"].AsInteger();
+                p_code = rm["p_code"].AsInteger();
+                path_begin = rm["path_begin"].AsInteger();
+                path_curve = rm["path_curve"].AsInteger();
+                path_end = rm["path_end"].AsInteger();
+                path_radius_offset = rm["path_radius_offset"].AsInteger();
+                path_revolutions = rm["path_revolutions"].AsInteger();
+                path_scale_x = rm["path_scale_x"].AsInteger();
+                path_scale_y = rm["path_scale_y"].AsInteger();
+                path_shear_x = rm["path_shear_x"].AsInteger();
+                path_shear_y = rm["path_shear_y"].AsInteger();
+                path_skew = rm["path_skew"].AsInteger();
+                path_taper_x = rm["path_taper_x"].AsInteger();
+                path_taper_y = rm["path_taper_y"].AsInteger();
+                path_twist = rm["path_twist"].AsInteger();
+                path_twist_begin = rm["path_twist_begin"].AsInteger();
+                profile_begin = rm["profile_begin"].AsInteger();
+                profile_curve = rm["profile_curve"].AsInteger();
+                profile_end = rm["profile_end"].AsInteger();
+                
+                ray_end_is_intersection = rm["ray_end_is_intersection"].AsBoolean();
+                
+                ray_target_id = rm["ray_target_id"].AsUUID();
+                
+                
+                //session_id = rm["session_id"].AsUUID();
+                state = rm["state"].AsInteger();
+                try 
+                {
+                    ray_end = ((OSDArray)rm["ray_end"]).AsVector3();
+                    ray_start = ((OSDArray)rm["ray_start"]).AsVector3();
+                    rotation = ((OSDArray)rm["rotation"]).AsQuaternion();
+                    scale = ((OSDArray)rm["scale"]).AsVector3();
+                } 
+                catch (Exception)
+                {
+                    responsedata["str_response_string"] = "RayEnd, RayStart, Scale or Rotation wasn't in the expected format";
+                    return responsedata;
+                }
+            }
+
+           
+
+            Vector3 pos = m_scene.GetNewRezLocation(ray_start, ray_end, ray_target_id, rotation, (bypass_raycast) ? (byte)1 : (byte)0,  (ray_end_is_intersection) ? (byte)1 : (byte)0, true, scale, false);
+
+            PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
+
+            pbs.PathBegin = (ushort)path_begin;
+            pbs.PathCurve = (byte)path_curve;
+            pbs.PathEnd = (ushort)path_end;
+            pbs.PathRadiusOffset = (sbyte)path_radius_offset;
+            pbs.PathRevolutions = (byte)path_revolutions;
+            pbs.PathScaleX = (byte)path_scale_x;
+            pbs.PathScaleY = (byte)path_scale_y;
+            pbs.PathShearX = (byte) path_shear_x;
+            pbs.PathShearY = (byte)path_shear_y;
+            pbs.PathSkew = (sbyte)path_skew;
+            pbs.PathTaperX = (sbyte)path_taper_x;
+            pbs.PathTaperY = (sbyte)path_taper_y;
+            pbs.PathTwist = (sbyte)path_twist;
+            pbs.PathTwistBegin = (sbyte)path_twist_begin;
+            pbs.HollowShape = (HollowShape) hollow;
+            pbs.PCode = (byte)p_code;
+            pbs.ProfileBegin = (ushort) profile_begin;
+            pbs.ProfileCurve = (byte) profile_curve;
+            pbs.ProfileEnd = (ushort)profile_end;
+            pbs.Scale = scale;
+            pbs.State = (byte)state;
+
+            SceneObjectGroup obj = null; ;
+
+            if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos))
+            {
+                // rez ON the ground, not IN the ground
+               // pos.Z += 0.25F;
+
+                obj = m_scene.AddNewPrim(avatar.UUID, group_id, pos, rotation, pbs);
+            }
+
+
+            if (obj == null)
+                return responsedata;
+
+            SceneObjectPart rootpart = obj.RootPart;
+            rootpart.Shape = pbs;
+            rootpart.Flags |= (PrimFlags)flags;
+            rootpart.EveryoneMask = everyone_mask;
+            rootpart.GroupID = group_id;
+            rootpart.GroupMask = group_mask;
+            rootpart.NextOwnerMask = next_owner_mask;
+            rootpart.Material = (byte)material;
+            
+            
+            
+            m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor);
+            
+            responsedata["int_response_code"] = 200; //501; //410; //404;
+            responsedata["content_type"] = "text/plain";
+            responsedata["keepalive"] = false;
+            responsedata["str_response_string"] = String.Format("<llsd><map><key>local_id</key>{0}</map></llsd>",ConvertUintToBytes(obj.LocalId));
+
+            return responsedata;
+        }
+
+        private uint readuintval(OSD obj)
+        {
+            byte[] tmp = obj.AsBinary();
+            if (BitConverter.IsLittleEndian)
+                Array.Reverse(tmp);
+            return Utils.BytesToUInt(tmp);
+
+        }
+        private string ConvertUintToBytes(uint val)
+        {
+            byte[] resultbytes = Utils.UIntToBytes(val);
+            if (BitConverter.IsLittleEndian)
+                Array.Reverse(resultbytes);
+            return String.Format("<binary encoding=\"base64\">{0}</binary>",Convert.ToBase64String(resultbytes));
+        }
+
+        public void Close()
+        {
+            
+        }
+
+        public string Name
+        {
+            get { return "ObjectAddModule"; }
+        }
+
+        public bool IsSharedModule
+        {
+            get { return false; }
+        }
+
+        #endregion
+    }
+}
diff --git a/OpenSim/Region/CoreModules/Caps/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/CoreModules/Caps/ObjectCaps/UploadObjectAssetModule.cs
new file mode 100644
index 0000000..33bffeb
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Caps/ObjectCaps/UploadObjectAssetModule.cs
@@ -0,0 +1,374 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Reflection;
+using System.IO;
+using System.Web;
+using Mono.Addins;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using OpenMetaverse.Messages.Linden;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using Caps = OpenSim.Framework.Capabilities.Caps;
+using OSD = OpenMetaverse.StructuredData.OSD;
+using OSDMap = OpenMetaverse.StructuredData.OSDMap;
+using OpenSim.Framework.Capabilities;
+using ExtraParamType = OpenMetaverse.ExtraParamType;
+
+namespace OpenSim.Region.CoreModules.Capabilities
+{
+    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
+    public class UploadObjectAssetModule : INonSharedRegionModule
+    {
+        private static readonly ILog m_log =
+            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private Scene m_scene;
+
+        #region IRegionModuleBase Members
+
+
+        public Type ReplaceableInterface
+        {
+            get { return null; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+
+        }
+
+        public void AddRegion(Scene pScene)
+        {
+            m_scene = pScene;
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+
+            m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
+            m_scene = null;
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+
+            m_scene.EventManager.OnRegisterCaps += RegisterCaps;
+        }
+
+        #endregion
+
+
+        #region IRegionModule Members
+
+
+
+        public void Close() { }
+
+        public string Name { get { return "UploadObjectAssetModuleModule"; } }
+
+
+        public void RegisterCaps(UUID agentID, Caps caps)
+        {
+            UUID capID = UUID.Random();
+
+//            m_log.Debug("[UPLOAD OBJECT ASSET MODULE]: /CAPS/" + capID);
+            caps.RegisterHandler("UploadObjectAsset",
+                                 new RestHTTPHandler("POST", "/CAPS/OA/" + capID + "/",
+                                                       delegate(Hashtable m_dhttpMethod)
+                                                       {
+                                                           return ProcessAdd(m_dhttpMethod, agentID, caps);
+                                                       }));
+            /*
+                   caps.RegisterHandler("NewFileAgentInventoryVariablePrice",
+
+                           new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDNewFileAngentInventoryVariablePriceReplyResponse>("POST",
+                                                                                                  "/CAPS/" + capID.ToString(),
+                                                                                                  delegate(LLSDAssetUploadRequest req)
+                                                              {
+                                                                  return NewAgentInventoryRequest(req,agentID);
+                                                              }));
+             */
+
+        }
+
+        #endregion
+
+
+        /// <summary>
+        /// Parses ad request
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="AgentId"></param>
+        /// <param name="cap"></param>
+        /// <returns></returns>
+        public Hashtable ProcessAdd(Hashtable request, 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;
+
+            if (!m_scene.TryGetScenePresence(AgentId, out avatar))
+                return responsedata;
+
+            OSDMap r = (OSDMap)OSDParser.Deserialize((string)request["requestbody"]);
+            UploadObjectAssetMessage message = new UploadObjectAssetMessage();
+            try
+            {
+                message.Deserialize(r);
+
+            }
+            catch (Exception ex)
+            {
+                m_log.Error("[UPLOAD OBJECT ASSET MODULE]: Error deserializing message " + ex.ToString());
+                message = null;
+            }
+
+            if (message == null)
+            {
+                responsedata["int_response_code"] = 400; //501; //410; //404;
+                responsedata["content_type"] = "text/plain";
+                responsedata["keepalive"] = false;
+                responsedata["str_response_string"] =
+                    "<llsd><map><key>error</key><string>Error parsing Object</string></map></llsd>";
+
+                return responsedata;
+            }
+
+            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++)
+            {
+                UploadObjectAssetMessage.Object obj = message.Objects[i];
+                PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
+
+                if (i == 0)
+                {
+                    rootpos = obj.Position;
+//                    rootrot = obj.Rotation;                    
+                }
+
+                // 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)
+                    {
+                        case (ushort)ExtraParamType.Sculpt:
+                            Primitive.SculptData sculpt = new Primitive.SculptData(extraParam.ExtraParamData, 0);
+
+                            pbs.SculptEntry = true;
+
+                            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;
+                       
+                    }
+                    
+                    
+                }
+                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;
+                SceneObjectPart prim = new SceneObjectPart();
+                prim.UUID = UUID.Random();
+                prim.CreatorID = AgentId;
+                prim.OwnerID = AgentId;
+                prim.GroupID = obj.GroupID;
+                prim.LastOwnerID = prim.OwnerID;
+                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"));
+
+                for (int j = 0; j < obj.Faces.Length; j++)
+                {
+                    UploadObjectAssetMessage.Object.Face face = obj.Faces[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.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;
+                
+
+                SceneObjectGroup grp = new SceneObjectGroup();
+
+                grp.SetRootPart(prim);
+                prim.ParentID = 0;
+                if (i == 0)
+                {
+                    rootGroup = grp;
+                   
+                }
+                grp.AttachToScene(m_scene);
+                grp.AbsolutePosition = obj.Position;
+                prim.RotationOffset = obj.Rotation;
+                
+                grp.RootPart.IsAttachment = false;
+                // Required for linking
+                grp.RootPart.UpdateFlag = 0;
+                
+                if (m_scene.Permissions.CanRezObject(1, avatar.UUID, pos))
+                {
+                    m_scene.AddSceneObject(grp);
+                    grp.AbsolutePosition = obj.Position;
+                }
+                allparts[i] = grp;
+                
+            }
+
+            for (int j = 1; j < allparts.Length; j++)
+            {
+                rootGroup.RootPart.UpdateFlag = 0;
+                allparts[j].RootPart.UpdateFlag = 0;
+                rootGroup.LinkToGroup(allparts[j]);
+            }
+
+            rootGroup.ScheduleGroupForFullUpdate();
+            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("<llsd><map><key>local_id</key>{0}</map></llsd>", ConvertUintToBytes(allparts[0].LocalId));
+
+            return responsedata;
+        }
+        
+        private string ConvertUintToBytes(uint val)
+        {
+            byte[] resultbytes = Utils.UIntToBytes(val);
+            if (BitConverter.IsLittleEndian)
+                Array.Reverse(resultbytes);
+            return String.Format("<binary encoding=\"base64\">{0}</binary>", Convert.ToBase64String(resultbytes));
+        }
+    }
+}
\ No newline at end of file
-- 
cgit v1.1