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 -
 .../MapImage/MapImageServiceConnector.cs           |  81 +++++++-------
 .../Services/MapImageService/MapImageService.cs    |   2 +-
 bin/Robust.HG.ini.example                          |   8 +-
 bin/Robust.ini.example                             |   9 +-
 bin/config-include/Grid.ini                        |   6 +
 bin/config-include/GridCommon.ini.example          |   3 +
 bin/config-include/GridHypergrid.ini               |   8 +-
 9 files changed, 193 insertions(+), 49 deletions(-)

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;
diff --git a/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs b/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs
index ff0e9d9..520d639 100644
--- a/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs
+++ b/OpenSim/Services/Connectors/MapImage/MapImageServiceConnector.cs
@@ -36,6 +36,7 @@ using Nini.Config;
 using OpenSim.Framework;
 using OpenSim.Framework.Console;
 using OpenSim.Framework.Communications;
+using OpenSim.Server.Base;
 using OpenSim.Services.Interfaces;
 using OpenMetaverse;
 using OpenMetaverse.StructuredData;
@@ -83,60 +84,57 @@ namespace OpenSim.Services.Connectors
                 throw new Exception("MapImage connector init error");
             }
             m_ServerURI = serviceURI;
+            m_ServerURI = serviceURI.TrimEnd('/');
         }
 
-        public bool AddMapTile(int x, int y, byte[] pngData, out string reason)
+        public bool AddMapTile(int x, int y, byte[] jpgData, out string reason)
         {
-            List<MultipartForm.Element> postParameters = new List<MultipartForm.Element>()
-            {
-                new MultipartForm.Parameter("X", x.ToString()),
-                new MultipartForm.Parameter("Y", y.ToString()),
-                new MultipartForm.File("Tile", "tile.png", "image/png", pngData)
-            };
-
-           reason = string.Empty;
+            reason = string.Empty;
             int tickstart = Util.EnvironmentTickCount();
+            Dictionary<string, object> sendData = new Dictionary<string, object>();
+            sendData["X"] = x.ToString();
+            sendData["Y"] = y.ToString();
+            sendData["TYPE"] = "image/jpeg";
+            sendData["DATA"] = Convert.ToBase64String(jpgData);
+
+            string reqString = ServerUtils.BuildQueryString(sendData);
 
-            // Make the remote storage request
             try
             {
-                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI);
-                request.Timeout = 20000;
-                request.ReadWriteTimeout = 5000;
-
-                using (HttpWebResponse response = MultipartForm.Post(request, postParameters))
+                string reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/map",
+                        reqString);
+                if (reply != string.Empty)
                 {
-                    using (Stream responseStream = response.GetResponseStream())
+                    Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+
+                    if (replyData.ContainsKey("Result") && (replyData["Result"].ToString().ToLower() == "success"))
                     {
-                        string responseStr = responseStream.GetStreamString();
-                        OSD responseOSD = OSDParser.Deserialize(responseStr);
-                        if (responseOSD.Type == OSDType.Map)
-                        {
-                            OSDMap responseMap = (OSDMap)responseOSD;
-                            if (responseMap["Success"].AsBoolean())
-                                return true;
-
-                            reason = "Upload failed: " + responseMap["Message"].AsString();
-                        }
-                        else
-                        {
-                            reason = "Response format was invalid:\n" + responseStr;
-                        }
+                        return true;
                     }
+                    else if (replyData.ContainsKey("Result") && (replyData["Result"].ToString().ToLower() == "failure"))
+                    {
+                        m_log.DebugFormat("[MAP IMAGE CONNECTOR]: Registration failed: {0}", replyData["Message"].ToString());
+                        reason = replyData["Message"].ToString();
+                        return false;
+                    }
+                    else if (!replyData.ContainsKey("Result"))
+                    {
+                        m_log.DebugFormat("[MAP IMAGE CONNECTOR]: reply data does not contain result field");
+                    }
+                    else
+                    {
+                        m_log.DebugFormat("[MAP IMAGE CONNECTOR]: unexpected result {0}", replyData["Result"].ToString());
+                        reason = "Unexpected result " + replyData["Result"].ToString();
+                    }
+
                 }
+                else
+                    m_log.DebugFormat("[MAP IMAGE CONNECTOR]: RegisterRegion received null reply");
             }
-            catch (WebException we)
-            {
-                reason = we.Message;
-                if (we.Status == WebExceptionStatus.ProtocolError)
-                {
-                    HttpWebResponse webResponse = (HttpWebResponse)we.Response;
-                    reason = String.Format("[{0}] {1}", webResponse.StatusCode, webResponse.StatusDescription);
-                }
-            }
-            catch (Exception ex)
+            catch (Exception e)
             {
-                reason = ex.Message;
+                m_log.DebugFormat("[MAP IMAGE CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
             }
             finally
             {
@@ -146,6 +144,7 @@ namespace OpenSim.Services.Connectors
             }
 
             return false;
+
         }
 
         public byte[] GetMapTile(string fileName, out string format)
diff --git a/OpenSim/Services/MapImageService/MapImageService.cs b/OpenSim/Services/MapImageService/MapImageService.cs
index 27722bb..7e7391c 100644
--- a/OpenSim/Services/MapImageService/MapImageService.cs
+++ b/OpenSim/Services/MapImageService/MapImageService.cs
@@ -143,7 +143,7 @@ namespace OpenSim.Services.MapImageService
             if (File.Exists(fullName))
             {
                 format = Path.GetExtension(fileName).ToLower();
-                m_log.DebugFormat("[MAP IMAGE SERVICE]: Found file {0}, extension {1}", fileName, format);
+                //m_log.DebugFormat("[MAP IMAGE SERVICE]: Found file {0}, extension {1}", fileName, format);
                 return File.ReadAllBytes(fullName);
             }
             else if (File.Exists(m_WaterTileFile))
diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example
index 812d265..00ece88 100644
--- a/bin/Robust.HG.ini.example
+++ b/bin/Robust.HG.ini.example
@@ -21,7 +21,7 @@
 ; * [[<ConfigName>@]<port>/]<dll name>[:<class name>]
 ; *
 [Startup]
-ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8004/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8002/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,HGAssetService@8002/OpenSim.Server.Handlers.dll:AssetServiceConnector,8002/OpenSim.Server.Handlers.dll:HeloServiceInConnector,8002/OpenSim.Server.Handlers.dll:HGFriendsServerConnector,8002/OpenSim.Server.Handlers.dll:InstantMessageServerConnector"
+ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8004/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8002/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8002/OpenSim.Server.Handlers.dll:GatekeeperServiceInConnector,8002/OpenSim.Server.Handlers.dll:UserAgentServerConnector,HGInventoryService@8002/OpenSim.Server.Handlers.dll:XInventoryInConnector,HGAssetService@8002/OpenSim.Server.Handlers.dll:AssetServiceConnector,8002/OpenSim.Server.Handlers.dll:HeloServiceInConnector,8002/OpenSim.Server.Handlers.dll:HGFriendsServerConnector,8002/OpenSim.Server.Handlers.dll:InstantMessageServerConnector,8003/OpenSim.Server.Handlers.dll:MapAddServiceConnector,8002/OpenSim.Server.Handlers.dll:MapGetServiceConnector"
 
 ; * This is common for all services, it's the network setup for the entire
 ; * server instance, if none is specified above
@@ -206,6 +206,9 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
     WelcomeMessage = "Welcome, Avatar!"
     AllowRemoteSetLoginLevel = "false"
     
+    ; For V2 map
+    ; MapTileURL = "http://127.0.0.1:8002";
+
     ; If you run this login server behind a proxy, set this to true
     ; HasProxy = false
     
@@ -237,6 +240,9 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
     ;AllowedClients = ""
     ;DeniedClients = ""
 
+[MapImageService]
+    LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService"
+
 [GridInfoService]
     ; These settings are used to return information on a get_grid_info call.
     ; Client launcher scripts and third-party clients make use of this to
diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example
index 5d0ec09..e29e9db 100644
--- a/bin/Robust.ini.example
+++ b/bin/Robust.ini.example
@@ -13,7 +13,7 @@
 ; * [[<ConfigName>@]<port>/]<dll name>[:<class name>]
 ; *
 [Startup]
-ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8004/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8002/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector"
+ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003/OpenSim.Server.Handlers.dll:XInventoryInConnector,8004/OpenSim.Server.Handlers.dll:FreeswitchServerConnector,8003/OpenSim.Server.Handlers.dll:GridServiceConnector,8002/OpenSim.Server.Handlers.dll:GridInfoServerInConnector,8003/OpenSim.Server.Handlers.dll:AuthenticationServiceConnector,8002/OpenSim.Server.Handlers.dll:OpenIdServerConnector,8003/OpenSim.Server.Handlers.dll:AvatarServiceConnector,8002/OpenSim.Server.Handlers.dll:LLLoginServiceInConnector,8003/OpenSim.Server.Handlers.dll:PresenceServiceConnector,8003/OpenSim.Server.Handlers.dll:UserAccountServiceConnector,8003/OpenSim.Server.Handlers.dll:GridUserServiceConnector,8003/OpenSim.Server.Handlers.dll:FriendsServiceConnector,8003/OpenSim.Server.Handlers.dll:MapAddServiceConnector,8002/OpenSim.Server.Handlers.dll:MapGetServiceConnector"
 
 ; * This is common for all services, it's the network setup for the entire
 ; * server instance, if none is specified above
@@ -191,8 +191,8 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
     WelcomeMessage = "Welcome, Avatar!"
     AllowRemoteSetLoginLevel = "false"
 
-    ; For snowglobe's web map
-    ; MapTileURL = "";
+    ; For V2 map
+    ; MapTileURL = "http://127.0.0.1:8002";
 
     ; If you run this login server behind a proxy, set this to true
     ; HasProxy = false
@@ -214,6 +214,9 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
     ;AllowedClients = ""
     ;DeniedClients = ""
 
+[MapImageService]
+    LocalServiceModule = "OpenSim.Services.MapImageService.dll:MapImageService"
+
 [GridInfoService]
     ; These settings are used to return information on a get_grid_info call.
     ; Client launcher scripts and third-party clients make use of this to
diff --git a/bin/config-include/Grid.ini b/bin/config-include/Grid.ini
index 5220573..da860c6 100644
--- a/bin/config-include/Grid.ini
+++ b/bin/config-include/Grid.ini
@@ -21,6 +21,7 @@
     EntityTransferModule	= "BasicEntityTransferModule"
     InventoryAccessModule	= "BasicInventoryAccessModule"
     LandServices            = "RemoteLandServicesConnector"
+	MapImageService			= "MapImageServiceModule"
     
     LandServiceInConnector			= true
     NeighbourServiceInConnector		= true
@@ -50,3 +51,8 @@
 
 [Friends]
     Connector = "OpenSim.Services.Connectors.dll:FriendsServicesConnector"
+
+[MapImageService]
+	LocalServiceModule = "OpenSim.Services.Connectors.dll:MapImageServicesConnector"
+	; in minutes
+	RefreshTime = 60
diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example
index 27f262f..4eb6fcf 100644
--- a/bin/config-include/GridCommon.ini.example
+++ b/bin/config-include/GridCommon.ini.example
@@ -116,6 +116,9 @@
     ;
     UserAgentServerURI = "http://mygridserver.com:8002"
 
+[MapImageService]
+   	MapImageServerURI = "http://mygridserver.com:8003"
+
 [Modules]
     ;; Choose 0 or 1 cache modules, and the corresponding config file, if it exists.
     ;; Copy the config .example file into your own .ini file and change configs there
diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini
index b8e66c2..60a3c62 100644
--- a/bin/config-include/GridHypergrid.ini
+++ b/bin/config-include/GridHypergrid.ini
@@ -25,6 +25,7 @@
     InventoryAccessModule	= "HGInventoryAccessModule"
     LandServices            = "RemoteLandServicesConnector"
 	FriendsModule			= "HGFriendsModule"
+	MapImageService			= "MapImageServiceModule"
     
     LandServiceInConnector			= true
     NeighbourServiceInConnector		= true
@@ -76,4 +77,9 @@
 	LocalServiceModule = "OpenSim.Services.HypergridService.dll:HGInstantMessageService"
 	GridService = "OpenSim.Services.Connectors.dll:GridServicesConnector"
 	PresenceService	= "OpenSim.Services.Connectors.dll:PresenceServicesConnector"
-	UserAgentService = "OpenSim.Services.Connectors.dll:UserAgentServiceConnector"
\ No newline at end of file
+	UserAgentService = "OpenSim.Services.Connectors.dll:UserAgentServiceConnector"
+
+[MapImageService]
+	LocalServiceModule = "OpenSim.Services.Connectors.dll:MapImageServicesConnector"
+	; in minutes
+	RefreshTime = 60
-- 
cgit v1.1