Esempio n. 1
0
        public string GetHandlerRegion(OSHttpResponse httpResponse, string param)
        {
            // be resilient and don't get confused by a terminating '/'
            param = param.TrimEnd(new char[]{'/'});
            string[] comps = param.Split('/');
            UUID regionID = (UUID)comps[0];

            m_log.DebugFormat("{0} GET region UUID {1}", MsgID, regionID.ToString());

            if (UUID.Zero == regionID) throw new Exception("missing region ID");

            Scene scene = null;
            App.SceneManager.TryGetScene(regionID, out scene);
            if (null == scene) return Failure(httpResponse, OSHttpStatusCode.ClientErrorNotFound,
                                              "GET", "cannot find region {0}", regionID.ToString());

            RegionDetails details = new RegionDetails(scene.RegionInfo);

            // m_log.DebugFormat("{0} GET comps {1}", MsgID, comps.Length);
            // for (int i = 0; i < comps.Length; i++)  m_log.DebugFormat("{0} GET comps[{1}] >{2}<", MsgID, i, comps[i]);

            if (1 == comps.Length)
            {
                // complete region details requested
                RestXmlWriter rxw = new RestXmlWriter(new StringWriter());
                XmlSerializer xs = new XmlSerializer(typeof(RegionDetails));
                xs.Serialize(rxw, details, _xmlNs);
                return rxw.ToString();
            }

            if (2 == comps.Length)
            {
                string resp = ShortRegionInfo(comps[1], details[comps[1]]);
                if (null != resp) return resp;

                // m_log.DebugFormat("{0} GET comps advanced: >{1}<", MsgID, comps[1]);

                // check for {terrain,stats,prims}
                switch (comps[1].ToLower())
                {
                case "terrain":
                    return RegionTerrain(httpResponse, scene);

                case "stats":
                    return RegionStats(httpResponse, scene);

                case "prims":
                    return RegionPrims(httpResponse, scene, Vector3.Zero, Vector3.Zero);
                }
            }

            if (3 == comps.Length)
            {
                switch (comps[1].ToLower())
                {
                case "prims":
                    string[] subregion = comps[2].Split(',');
                    if (subregion.Length == 6)
                    {
                        Vector3 min, max;
                        try
                        {
                            min = new Vector3((float)Double.Parse(subregion[0]), (float)Double.Parse(subregion[1]), (float)Double.Parse(subregion[2]));
                            max = new Vector3((float)Double.Parse(subregion[3]), (float)Double.Parse(subregion[4]), (float)Double.Parse(subregion[5]));
                        }
                        catch (Exception)
                        {
                            return Failure(httpResponse, OSHttpStatusCode.ClientErrorBadRequest,
                                           "GET", "invalid subregion parameter");
                        }
                        return RegionPrims(httpResponse, scene, min, max);
                    }
                    else
                    {
                        return Failure(httpResponse, OSHttpStatusCode.ClientErrorBadRequest,
                                       "GET", "invalid subregion parameter");
                    }
                }
            }

            return Failure(httpResponse, OSHttpStatusCode.ClientErrorBadRequest,
                           "GET", "too many parameters {0}", param);
        }
Esempio n. 2
0
        public string GetHandlerRegion(IOSHttpResponse httpResponse, string param)
        {
            // be resilient and don't get confused by a terminating '/'
            param = param.TrimEnd(new char[] { '/' });
            string[] comps    = param.Split('/');
            UUID     regionID = (UUID)comps[0];

            m_log.DebugFormat("{0} GET region UUID {1}", MsgID, regionID.ToString());

            if (UUID.Zero == regionID)
            {
                throw new Exception("missing region ID");
            }

            Scene scene = null;

            App.SceneManager.TryGetScene(regionID, out scene);
            if (null == scene)
            {
                return(Failure(httpResponse, OSHttpStatusCode.ClientErrorNotFound,
                               "GET", "cannot find region {0}", regionID.ToString()));
            }

            RegionDetails details = new RegionDetails(scene.RegionInfo);

            // m_log.DebugFormat("{0} GET comps {1}", MsgID, comps.Length);
            // for (int i = 0; i < comps.Length; i++)  m_log.DebugFormat("{0} GET comps[{1}] >{2}<", MsgID, i, comps[i]);

            if (1 == comps.Length)
            {
                // complete region details requested
                RestXmlWriter rxw = new RestXmlWriter(new StringWriter());
                XmlSerializer xs  = new XmlSerializer(typeof(RegionDetails));
                xs.Serialize(rxw, details, _xmlNs);
                return(rxw.ToString());
            }

            if (2 == comps.Length)
            {
                string resp = ShortRegionInfo(comps[1], details[comps[1]]);
                if (null != resp)
                {
                    return(resp);
                }

                // m_log.DebugFormat("{0} GET comps advanced: >{1}<", MsgID, comps[1]);

                // check for {terrain,stats,prims}
                switch (comps[1].ToLower())
                {
                case "terrain":
                    return(RegionTerrain(httpResponse, scene));

                case "stats":
                    return(RegionStats(httpResponse, scene));

                case "prims":
                    return(RegionPrims(httpResponse, scene, Vector3.Zero, Vector3.Zero));
                }
            }

            if (3 == comps.Length)
            {
                switch (comps[1].ToLower())
                {
                case "prims":
                    string[] subregion = comps[2].Split(',');
                    if (subregion.Length == 6)
                    {
                        Vector3 min, max;
                        try
                        {
                            min = new Vector3((float)Double.Parse(subregion[0], Culture.NumberFormatInfo), (float)Double.Parse(subregion[1], Culture.NumberFormatInfo), (float)Double.Parse(subregion[2], Culture.NumberFormatInfo));
                            max = new Vector3((float)Double.Parse(subregion[3], Culture.NumberFormatInfo), (float)Double.Parse(subregion[4], Culture.NumberFormatInfo), (float)Double.Parse(subregion[5], Culture.NumberFormatInfo));
                        }
                        catch (Exception)
                        {
                            return(Failure(httpResponse, OSHttpStatusCode.ClientErrorBadRequest,
                                           "GET", "invalid subregion parameter"));
                        }
                        return(RegionPrims(httpResponse, scene, min, max));
                    }
                    else
                    {
                        return(Failure(httpResponse, OSHttpStatusCode.ClientErrorBadRequest,
                                       "GET", "invalid subregion parameter"));
                    }
                }
            }

            return(Failure(httpResponse, OSHttpStatusCode.ClientErrorBadRequest,
                           "GET", "too many parameters {0}", param));
        }