aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-05-09 23:25:01 +0100
committerJustin Clark-Casey (justincc)2012-05-09 23:25:01 +0100
commitd8a78374aa11c5460d6e58a6f4110fca61dfded4 (patch)
tree4214094c092eeff11f2dcd60f71cfc294ab887be /OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs
parentImprove logging on the prim inventory script asset request path for future use. (diff)
downloadopensim-SC-d8a78374aa11c5460d6e58a6f4110fca61dfded4.zip
opensim-SC-d8a78374aa11c5460d6e58a6f4110fca61dfded4.tar.gz
opensim-SC-d8a78374aa11c5460d6e58a6f4110fca61dfded4.tar.bz2
opensim-SC-d8a78374aa11c5460d6e58a6f4110fca61dfded4.tar.xz
Where necessary, rename OpenSim/Services/Connectors/*.cs files to reflect the actual class names.
This is usually because the file name was singular (*Service*) but the class name was plural (*Services*). This is to make configuration easier rather than having to look in the c# code itself to find the slightly different name of the connector. This does not affect existing configuration since the files are being renamed rather than the classes.
Diffstat (limited to 'OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs')
-rw-r--r--OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs206
1 files changed, 206 insertions, 0 deletions
diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs
new file mode 100644
index 0000000..888b072
--- /dev/null
+++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs
@@ -0,0 +1,206 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using log4net;
29using System;
30using System.Collections;
31using System.Collections.Generic;
32using System.IO;
33using System.Net;
34using System.Reflection;
35using System.Text;
36using Nini.Config;
37using OpenSim.Framework;
38using OpenSim.Framework.Communications;
39using OpenSim.Services.Interfaces;
40using OpenMetaverse;
41using OpenMetaverse.StructuredData;
42
43using GridRegion = OpenSim.Services.Interfaces.GridRegion;
44
45namespace OpenSim.Services.Connectors
46{
47 public class NeighbourServicesConnector : INeighbourService
48 {
49 private static readonly ILog m_log =
50 LogManager.GetLogger(
51 MethodBase.GetCurrentMethod().DeclaringType);
52
53 protected IGridService m_GridService = null;
54
55 public NeighbourServicesConnector()
56 {
57 }
58
59 public NeighbourServicesConnector(IGridService gridServices)
60 {
61 Initialise(gridServices);
62 }
63
64 public virtual void Initialise(IGridService gridServices)
65 {
66 m_GridService = gridServices;
67 }
68
69 public virtual GridRegion HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
70 {
71 uint x = 0, y = 0;
72 Utils.LongToUInts(regionHandle, out x, out y);
73 GridRegion regInfo = m_GridService.GetRegionByPosition(thisRegion.ScopeID, (int)x, (int)y);
74 if ((regInfo != null) &&
75 // Don't remote-call this instance; that's a startup hickup
76 !((regInfo.ExternalHostName == thisRegion.ExternalHostName) && (regInfo.HttpPort == thisRegion.HttpPort)))
77 {
78 if (!DoHelloNeighbourCall(regInfo, thisRegion))
79 return null;
80 }
81 else
82 return null;
83
84 return regInfo;
85 }
86
87 public bool DoHelloNeighbourCall(GridRegion region, RegionInfo thisRegion)
88 {
89 string uri = region.ServerURI + "region/" + thisRegion.RegionID + "/";
90// m_log.Debug(" >>> DoHelloNeighbourCall <<< " + uri);
91
92 WebRequest helloNeighbourRequest;
93
94 try
95 {
96 helloNeighbourRequest = WebRequest.Create(uri);
97 }
98 catch (Exception e)
99 {
100 m_log.WarnFormat(
101 "[NEIGHBOUR SERVICE CONNCTOR]: Unable to parse uri {0} to send HelloNeighbour from {1} to {2}. Exception {3}{4}",
102 uri, thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace);
103
104 return false;
105 }
106
107 helloNeighbourRequest.Method = "POST";
108 helloNeighbourRequest.ContentType = "application/json";
109 helloNeighbourRequest.Timeout = 10000;
110
111 // Fill it in
112 OSDMap args = null;
113 try
114 {
115 args = thisRegion.PackRegionInfoData();
116 }
117 catch (Exception e)
118 {
119 m_log.WarnFormat(
120 "[NEIGHBOUR SERVICE CONNCTOR]: PackRegionInfoData failed for HelloNeighbour from {0} to {1}. Exception {2}{3}",
121 thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace);
122
123 return false;
124 }
125
126 // Add the regionhandle of the destination region
127 args["destination_handle"] = OSD.FromString(region.RegionHandle.ToString());
128
129 string strBuffer = "";
130 byte[] buffer = new byte[1];
131
132 try
133 {
134 strBuffer = OSDParser.SerializeJsonString(args);
135 UTF8Encoding str = new UTF8Encoding();
136 buffer = str.GetBytes(strBuffer);
137 }
138 catch (Exception e)
139 {
140 m_log.WarnFormat(
141 "[NEIGHBOUR SERVICE CONNCTOR]: Exception thrown on serialization of HelloNeighbour from {0} to {1}. Exception {2}{3}",
142 thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace);
143
144 return false;
145 }
146
147 Stream os = null;
148 try
149 { // send the Post
150 helloNeighbourRequest.ContentLength = buffer.Length; //Count bytes to send
151 os = helloNeighbourRequest.GetRequestStream();
152 os.Write(buffer, 0, strBuffer.Length); //Send it
153 //m_log.InfoFormat("[REST COMMS]: Posted HelloNeighbour request to remote sim {0}", uri);
154 }
155 catch (Exception e)
156 {
157 m_log.WarnFormat(
158 "[NEIGHBOUR SERVICE CONNCTOR]: Unable to send HelloNeighbour from {0} to {1}. Exception {2}{3}",
159 thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace);
160
161 return false;
162 }
163 finally
164 {
165 if (os != null)
166 os.Close();
167 }
168
169 // Let's wait for the response
170 //m_log.Info("[REST COMMS]: Waiting for a reply after DoHelloNeighbourCall");
171
172 StreamReader sr = null;
173 try
174 {
175 WebResponse webResponse = helloNeighbourRequest.GetResponse();
176 if (webResponse == null)
177 {
178 m_log.DebugFormat(
179 "[REST COMMS]: Null reply on DoHelloNeighbourCall post from {0} to {1}",
180 thisRegion.RegionName, region.RegionName);
181 }
182
183 sr = new StreamReader(webResponse.GetResponseStream());
184 //reply = sr.ReadToEnd().Trim();
185 sr.ReadToEnd().Trim();
186 //m_log.InfoFormat("[REST COMMS]: DoHelloNeighbourCall reply was {0} ", reply);
187
188 }
189 catch (Exception e)
190 {
191 m_log.WarnFormat(
192 "[NEIGHBOUR SERVICE CONNCTOR]: Exception on reply of DoHelloNeighbourCall from {0} back to {1}. Exception {2}{3}",
193 region.RegionName, thisRegion.RegionName, e.Message, e.StackTrace);
194
195 return false;
196 }
197 finally
198 {
199 if (sr != null)
200 sr.Close();
201 }
202
203 return true;
204 }
205 }
206} \ No newline at end of file