Allow GetMesh capability to be served directly by a server like GetTexture
To do this required GetMesh to be converted to a BaseStreamHandler Unlike GetTexture connector, no redirect URL functionality yet (this wasn't present in the first place).ghosts
							parent
							
								
									22020927c6
								
							
						
					
					
						commit
						493a86dfed
					
				|  | @ -30,6 +30,7 @@ using System.Collections; | |||
| using System.Collections.Specialized; | ||||
| using System.Reflection; | ||||
| using System.IO; | ||||
| using System.Text; | ||||
| using System.Web; | ||||
| using log4net; | ||||
| using Nini.Config; | ||||
|  | @ -43,41 +44,37 @@ using Caps = OpenSim.Framework.Capabilities.Caps; | |||
| 
 | ||||
| namespace OpenSim.Capabilities.Handlers | ||||
| { | ||||
|     public class GetMeshHandler  | ||||
|     public class GetMeshHandler : BaseStreamHandler | ||||
|     { | ||||
| //        private static readonly ILog m_log = | ||||
| //            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
|          | ||||
|         private IAssetService m_assetService; | ||||
| 
 | ||||
|         public GetMeshHandler(IAssetService assService) | ||||
|         public GetMeshHandler(string path, IAssetService assService, string name, string description) | ||||
|             : base("GET", path, name, description) | ||||
|         { | ||||
|             m_assetService = assService; | ||||
|         } | ||||
| 
 | ||||
|         public Hashtable ProcessGetMesh(Hashtable request, UUID AgentId, Caps cap) | ||||
|         protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | ||||
|         { | ||||
|             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"; | ||||
|             // Try to parse the texture ID from the request URL | ||||
|             NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query); | ||||
|             string meshStr = query.GetOne("mesh_id"); | ||||
| 
 | ||||
|             string meshStr = string.Empty; | ||||
| 
 | ||||
|             if (request.ContainsKey("mesh_id")) | ||||
|                 meshStr = request["mesh_id"].ToString(); | ||||
| //            m_log.DebugFormat("Fetching mesh {0}", meshStr); | ||||
| 
 | ||||
|             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; | ||||
|                     httpResponse.StatusCode = 404; | ||||
|                     httpResponse.ContentType = "text/plain"; | ||||
|                     byte[] data = Encoding.UTF8.GetBytes("The asset service is unavailable.  So is your mesh."); | ||||
|                     httpResponse.Body.Write(data, 0, data.Length); | ||||
|                     return null; | ||||
|                 } | ||||
| 
 | ||||
|                 AssetBase mesh = m_assetService.Get(meshID.ToString()); | ||||
|  | @ -86,31 +83,32 @@ namespace OpenSim.Capabilities.Handlers | |||
|                 { | ||||
|                     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; | ||||
|                         byte[] data = mesh.Data; | ||||
|                         httpResponse.Body.Write(data, 0, data.Length); | ||||
|                         httpResponse.ContentType = "application/vnd.ll.mesh"; | ||||
|                         httpResponse.StatusCode = 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; | ||||
|                         httpResponse.StatusCode = 404; | ||||
|                         httpResponse.ContentType = "text/plain"; | ||||
|                         byte[] data = Encoding.UTF8.GetBytes("Unfortunately, this asset isn't a mesh."); | ||||
|                         httpResponse.Body.Write(data, 0, data.Length); | ||||
|                         httpResponse.KeepAlive = false; | ||||
|                     } | ||||
|                 } | ||||
|                 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; | ||||
|                     httpResponse.StatusCode = 404; | ||||
|                     httpResponse.ContentType = "text/plain"; | ||||
|                     byte[] data = Encoding.UTF8.GetBytes("Your Mesh wasn't found.  Sorry!"); | ||||
|                     httpResponse.Body.Write(data, 0, data.Length); | ||||
|                     httpResponse.KeepAlive = false; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             return responsedata; | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -65,15 +65,8 @@ namespace OpenSim.Capabilities.Handlers | |||
|             if (m_AssetService == null) | ||||
|                 throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName)); | ||||
| 
 | ||||
|             GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); | ||||
|             IRequestHandler reqHandler | ||||
|                 = new RestHTTPHandler( | ||||
|                     "GET", | ||||
|                     "/CAPS/" + UUID.Random(), | ||||
|                     httpMethod => gmeshHandler.ProcessGetMesh(httpMethod, UUID.Zero, null), | ||||
|                     "GetMesh", | ||||
|                     null); | ||||
|             server.AddStreamHandler(reqHandler); | ||||
|             server.AddStreamHandler( | ||||
|                 new GetMeshHandler("/CAPS/GetMesh/" /*+ UUID.Random() */, m_AssetService, "GetMesh", null)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -110,32 +110,29 @@ namespace OpenSim.Region.ClientStack.Linden | |||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
| 
 | ||||
|         public void RegisterCaps(UUID agentID, Caps caps) | ||||
|         { | ||||
| //            UUID capID = UUID.Random(); | ||||
| 
 | ||||
|             //caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture)); | ||||
|             if (m_URL == "localhost") | ||||
|             { | ||||
| //                m_log.DebugFormat("[GETMESH]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); | ||||
|                 GetMeshHandler gmeshHandler = new GetMeshHandler(m_AssetService); | ||||
|                 IRequestHandler reqHandler | ||||
|                     = new RestHTTPHandler( | ||||
|                         "GET", | ||||
|                         "/CAPS/" + UUID.Random(), | ||||
|                         httpMethod => gmeshHandler.ProcessGetMesh(httpMethod, UUID.Zero, null), | ||||
|                         "GetMesh", | ||||
|                         agentID.ToString()); | ||||
|                 //                m_log.DebugFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); | ||||
| 
 | ||||
|                 caps.RegisterHandler("GetMesh", reqHandler); | ||||
|                 UUID capID = UUID.Random(); | ||||
| 
 | ||||
|                 caps.RegisterHandler( | ||||
|                     "GetMesh", | ||||
|                     new GetMeshHandler("/CAPS/" + capID + "/", m_AssetService, "GetMesh", agentID.ToString())); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
| //                m_log.DebugFormat("[GETMESH]: {0} in region {1}", m_URL, m_scene.RegionInfo.RegionName); | ||||
|                 caps.RegisterHandler("GetMesh", m_URL); | ||||
|                 //                m_log.DebugFormat("[GETTEXTURE]: {0} in region {1}", m_URL, m_scene.RegionInfo.RegionName); | ||||
|                 IExternalCapsModule handler = m_scene.RequestModuleInterface<IExternalCapsModule>(); | ||||
|                 if (handler != null) | ||||
|                     handler.RegisterExternalUserCapsHandler(agentID, caps, "GetMesh", m_URL); | ||||
|                 else | ||||
|                     caps.RegisterHandler("GetMesh", m_URL); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         }                              | ||||
|     } | ||||
| } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Justin Clark-Casey (justincc)
						Justin Clark-Casey (justincc)