From ecb28ae130d1fc212c72af887fc75ae2bf64ab97 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Mon, 13 Jun 2011 09:13:44 -0700
Subject: V2 map now working in grids too. WARNING: A few visible configuration
 variables added in order for this to work. See .ini.example changes

---
 .../Server/Handlers/Map/MapAddServerConnector.cs   | 124 ++++++++++++++++++++-
 .../Server/Handlers/Map/MapGetServerConnector.cs   |   1 -
 2 files changed, 123 insertions(+), 2 deletions(-)

(limited to 'OpenSim/Server')

diff --git a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs
index a953cd7..99f98b6 100644
--- a/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs
+++ b/OpenSim/Server/Handlers/Map/MapAddServerConnector.cs
@@ -26,7 +26,14 @@
  */
 
 using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+
 using Nini.Config;
+using log4net;
+
 using OpenSim.Server.Base;
 using OpenSim.Services.Interfaces;
 using OpenSim.Framework.Servers.HttpServer;
@@ -55,7 +62,122 @@ namespace OpenSim.Server.Handlers.MapImage
             Object[] args = new Object[] { config };
             m_MapService = ServerUtils.LoadPlugin<IMapImageService>(gridService, args);
 
-            //server.AddStreamHandler(new PresenceServerPostHandler(m_PresenceService));
+            server.AddStreamHandler(new MapServerPostHandler(m_MapService));
+        }
+    }
+
+    class MapServerPostHandler : BaseStreamHandler
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private IMapImageService m_MapService;
+
+        public MapServerPostHandler(IMapImageService service) :
+            base("POST", "/map")
+        {
+            m_MapService = service;
+        }
+
+        public override byte[] Handle(string path, Stream requestData, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+        {
+            m_log.DebugFormat("[MAP SERVICE IMAGE HANDLER]: Received {0}", path);
+            StreamReader sr = new StreamReader(requestData);
+            string body = sr.ReadToEnd();
+            sr.Close();
+            body = body.Trim();
+
+            try
+            {
+                Dictionary<string, object> request = ServerUtils.ParseQueryString(body);
+
+                if (!request.ContainsKey("X") || !request.ContainsKey("Y") || !request.ContainsKey("DATA"))
+                {
+                    httpResponse.StatusCode = (int)OSHttpStatusCode.ClientErrorBadRequest;
+                    return FailureResult("Bad request.");
+                }
+                int x = 0, y = 0;
+                Int32.TryParse(request["X"].ToString(), out x);
+                Int32.TryParse(request["Y"].ToString(), out y);
+                string type = "image/jpeg";
+                if (request.ContainsKey("TYPE"))
+                    type = request["TYPE"].ToString();
+                byte[] data = Convert.FromBase64String(request["DATA"].ToString());
+
+                string reason = string.Empty;
+                bool result = m_MapService.AddMapTile(x, y, data, out reason);
+
+                if (result)
+                    return SuccessResult();
+                else
+                    return FailureResult(reason);
+
+            }
+            catch (Exception e)
+            {
+                m_log.ErrorFormat("[MAP SERVICE IMAGE HANDLER]: Exception {0} {1}", e.Message, e.StackTrace);
+            }
+
+            return FailureResult("Unexpected server error");
+
+        }
+
+        private byte[] SuccessResult()
+        {
+            XmlDocument doc = new XmlDocument();
+
+            XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
+                    "", "");
+
+            doc.AppendChild(xmlnode);
+
+            XmlElement rootElement = doc.CreateElement("", "ServerResponse",
+                    "");
+
+            doc.AppendChild(rootElement);
+
+            XmlElement result = doc.CreateElement("", "Result", "");
+            result.AppendChild(doc.CreateTextNode("Success"));
+
+            rootElement.AppendChild(result);
+
+            return DocToBytes(doc);
+        }
+
+        private byte[] FailureResult(string msg)
+        {
+            XmlDocument doc = new XmlDocument();
+
+            XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
+                    "", "");
+
+            doc.AppendChild(xmlnode);
+
+            XmlElement rootElement = doc.CreateElement("", "ServerResponse",
+                    "");
+
+            doc.AppendChild(rootElement);
+
+            XmlElement result = doc.CreateElement("", "Result", "");
+            result.AppendChild(doc.CreateTextNode("Failure"));
+
+            rootElement.AppendChild(result);
+
+            XmlElement message = doc.CreateElement("", "Message", "");
+            message.AppendChild(doc.CreateTextNode(msg));
+
+            rootElement.AppendChild(message);
+
+            return DocToBytes(doc);
+        }
+
+        private byte[] DocToBytes(XmlDocument doc)
+        {
+            MemoryStream ms = new MemoryStream();
+            XmlTextWriter xw = new XmlTextWriter(ms, null);
+            xw.Formatting = Formatting.Indented;
+            doc.WriteTo(xw);
+            xw.Flush();
+
+            return ms.ToArray();
         }
     }
 }
diff --git a/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs b/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs
index 53d08fa..e8a424f 100644
--- a/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs
+++ b/OpenSim/Server/Handlers/Map/MapGetServerConnector.cs
@@ -80,7 +80,6 @@ namespace OpenSim.Server.Handlers.MapImage
 
         public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
         {
-            m_log.DebugFormat("[MAP SERVICE IMAGE HANDLER]: retrieving {0}", path);
             byte[] result = new byte[0];
 
             string format = string.Empty;
-- 
cgit v1.1