Donation of robust network connectors for estate service, as promised. This allows to have one central database for estates without having to open the MySql port. This is off by default, so not to disturb everyone's existing installations. To use it, see GridCommon.ini.example [EstateDataStore] section and Robust*.ini.example's new additions.
Note that I also made things consistent by removing both the EstateDataService and the SimulationService into their own dlls, just like all other services. They really didn't belong in Services.Connectors, since everything in that component is about network connectors to robust backends. We may have too many dlls, and at some point it might not be a bad idea to merge all services into one single dll, since they all have more or less the same dependencies.sedebug
parent
502aa7bb15
commit
8e562f04d1
|
@ -0,0 +1,345 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
using Nini.Config;
|
||||||
|
using log4net;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
using OpenSim.Server.Base;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.ServiceAuth;
|
||||||
|
using OpenSim.Framework.Servers.HttpServer;
|
||||||
|
using OpenSim.Server.Handlers.Base;
|
||||||
|
|
||||||
|
namespace OpenSim.Server.Handlers
|
||||||
|
{
|
||||||
|
public class EstateDataRobustConnector : ServiceConnector
|
||||||
|
{
|
||||||
|
private string m_ConfigName = "EstateService";
|
||||||
|
|
||||||
|
public EstateDataRobustConnector(IConfigSource config, IHttpServer server, string configName) :
|
||||||
|
base(config, server, configName)
|
||||||
|
{
|
||||||
|
IConfig serverConfig = config.Configs[m_ConfigName];
|
||||||
|
if (serverConfig == null)
|
||||||
|
throw new Exception(String.Format("No section {0} in config file", m_ConfigName));
|
||||||
|
|
||||||
|
string service = serverConfig.GetString("LocalServiceModule",
|
||||||
|
String.Empty);
|
||||||
|
|
||||||
|
if (service == String.Empty)
|
||||||
|
throw new Exception("No LocalServiceModule in config file");
|
||||||
|
|
||||||
|
Object[] args = new Object[] { config };
|
||||||
|
IEstateDataService e_service = ServerUtils.LoadPlugin<IEstateDataService>(service, args);
|
||||||
|
|
||||||
|
IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName); ;
|
||||||
|
|
||||||
|
server.AddStreamHandler(new EstateServerGetHandler(e_service, auth));
|
||||||
|
server.AddStreamHandler(new EstateServerPostHandler(e_service, auth));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class EstateServerGetHandler : BaseStreamHandler
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
IEstateDataService m_EstateService;
|
||||||
|
|
||||||
|
// Possibilities
|
||||||
|
// /estates/estate/?region=uuid&create=[t|f]
|
||||||
|
// /estates/estate/?eid=int
|
||||||
|
// /estates/?name=string
|
||||||
|
// /estates/?owner=uuid
|
||||||
|
// /estates/ (all)
|
||||||
|
// /estates/regions/?eid=int
|
||||||
|
|
||||||
|
public EstateServerGetHandler(IEstateDataService service, IServiceAuth auth) :
|
||||||
|
base("GET", "/estates", auth)
|
||||||
|
{
|
||||||
|
m_EstateService = service;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override byte[] ProcessRequest(string path, Stream request,
|
||||||
|
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
byte[] result = new byte[0];
|
||||||
|
Dictionary<string, object> data = null;
|
||||||
|
|
||||||
|
string[] p = SplitParams(path);
|
||||||
|
|
||||||
|
// /estates/ (all)
|
||||||
|
// /estates/?name=string
|
||||||
|
// /estates/?owner=uuid
|
||||||
|
if (p.Length == 0)
|
||||||
|
data = GetEstates(httpRequest, httpResponse);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string resource = p[0];
|
||||||
|
|
||||||
|
// /estates/estate/?region=uuid&create=[t|f]
|
||||||
|
// /estates/estate/?eid=int
|
||||||
|
if ("estate".Equals(resource))
|
||||||
|
data = GetEstate(httpRequest, httpResponse);
|
||||||
|
// /estates/regions/?eid=int
|
||||||
|
else if ("regions".Equals(resource))
|
||||||
|
data = GetRegions(httpRequest, httpResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data == null)
|
||||||
|
data = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
string xmlString = ServerUtils.BuildXmlResponse(data);
|
||||||
|
return Util.UTF8NoBomEncoding.GetBytes(xmlString);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<string, object> GetEstates(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
// /estates/ (all)
|
||||||
|
// /estates/?name=string
|
||||||
|
// /estates/?owner=uuid
|
||||||
|
|
||||||
|
Dictionary<string, object> data = null;
|
||||||
|
string name = (string)httpRequest.Query["name"];
|
||||||
|
string owner = (string)httpRequest.Query["owner"];
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(name) || !string.IsNullOrEmpty(owner))
|
||||||
|
{
|
||||||
|
List<int> estateIDs = null;
|
||||||
|
if (!string.IsNullOrEmpty(name))
|
||||||
|
{
|
||||||
|
estateIDs = m_EstateService.GetEstates(name);
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(owner))
|
||||||
|
{
|
||||||
|
UUID ownerID = UUID.Zero;
|
||||||
|
if (UUID.TryParse(owner, out ownerID))
|
||||||
|
estateIDs = m_EstateService.GetEstatesByOwner(ownerID);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (estateIDs == null || (estateIDs != null && estateIDs.Count == 0))
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.OK;
|
||||||
|
httpResponse.ContentType = "text/xml";
|
||||||
|
data = new Dictionary<string, object>();
|
||||||
|
int i = 0;
|
||||||
|
foreach (int id in estateIDs)
|
||||||
|
data["estate" + i++] = id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
List<EstateSettings> estates = m_EstateService.LoadEstateSettingsAll();
|
||||||
|
if (estates == null || estates.Count == 0)
|
||||||
|
{
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.OK;
|
||||||
|
httpResponse.ContentType = "text/xml";
|
||||||
|
data = new Dictionary<string, object>();
|
||||||
|
int i = 0;
|
||||||
|
foreach (EstateSettings es in estates)
|
||||||
|
data["estate" + i++] = es.ToMap();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<string, object> GetEstate(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
// /estates/estate/?region=uuid&create=[t|f]
|
||||||
|
// /estates/estate/?eid=int
|
||||||
|
Dictionary<string, object> data = null;
|
||||||
|
string region = (string)httpRequest.Query["region"];
|
||||||
|
string eid = (string)httpRequest.Query["eid"];
|
||||||
|
|
||||||
|
EstateSettings estate = null;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(region))
|
||||||
|
{
|
||||||
|
UUID regionID = UUID.Zero;
|
||||||
|
if (UUID.TryParse(region, out regionID))
|
||||||
|
{
|
||||||
|
string create = (string)httpRequest.Query["create"];
|
||||||
|
bool createYN = false;
|
||||||
|
Boolean.TryParse(create, out createYN);
|
||||||
|
estate = m_EstateService.LoadEstateSettings(regionID, createYN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(eid))
|
||||||
|
{
|
||||||
|
int id = 0;
|
||||||
|
if (Int32.TryParse(eid, out id))
|
||||||
|
estate = m_EstateService.LoadEstateSettings(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (estate != null)
|
||||||
|
{
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.OK;
|
||||||
|
httpResponse.ContentType = "text/xml";
|
||||||
|
data = estate.ToMap();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<string, object> GetRegions(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
// /estates/regions/?eid=int
|
||||||
|
Dictionary<string, object> data = null;
|
||||||
|
string eid = (string)httpRequest.Query["eid"];
|
||||||
|
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
|
if (!string.IsNullOrEmpty(eid))
|
||||||
|
{
|
||||||
|
int id = 0;
|
||||||
|
if (Int32.TryParse(eid, out id))
|
||||||
|
{
|
||||||
|
List<UUID> regions = m_EstateService.GetRegions(id);
|
||||||
|
if (regions != null && regions.Count > 0)
|
||||||
|
{
|
||||||
|
data = new Dictionary<string, object>();
|
||||||
|
int i = 0;
|
||||||
|
foreach (UUID uuid in regions)
|
||||||
|
data["region" + i++] = uuid.ToString();
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.OK;
|
||||||
|
httpResponse.ContentType = "text/xml";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EstateServerPostHandler : BaseStreamHandler
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
IEstateDataService m_EstateService;
|
||||||
|
|
||||||
|
// Possibilities
|
||||||
|
// /estates/estate/ (post an estate)
|
||||||
|
// /estates/estate/?eid=int®ion=uuid (link a region to an estate)
|
||||||
|
|
||||||
|
public EstateServerPostHandler(IEstateDataService service, IServiceAuth auth) :
|
||||||
|
base("POST", "/estates", auth)
|
||||||
|
{
|
||||||
|
m_EstateService = service;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override byte[] ProcessRequest(string path, Stream request,
|
||||||
|
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
byte[] result = new byte[0];
|
||||||
|
Dictionary<string, object> data = null;
|
||||||
|
|
||||||
|
string[] p = SplitParams(path);
|
||||||
|
|
||||||
|
if (p.Length > 0)
|
||||||
|
{
|
||||||
|
string resource = p[0];
|
||||||
|
|
||||||
|
// /estates/estate/
|
||||||
|
// /estates/estate/?eid=int®ion=uuid
|
||||||
|
if ("estate".Equals(resource))
|
||||||
|
{
|
||||||
|
StreamReader sr = new StreamReader(request);
|
||||||
|
string body = sr.ReadToEnd();
|
||||||
|
sr.Close();
|
||||||
|
body = body.Trim();
|
||||||
|
|
||||||
|
Dictionary<string, object> requestData = ServerUtils.ParseQueryString(body);
|
||||||
|
|
||||||
|
data = UpdateEstate(requestData, httpRequest, httpResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data == null)
|
||||||
|
data = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
string xmlString = ServerUtils.BuildXmlResponse(data);
|
||||||
|
return Util.UTF8NoBomEncoding.GetBytes(xmlString);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<string, object> UpdateEstate(Dictionary<string, object> requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
// /estates/estate/
|
||||||
|
// /estates/estate/?eid=int®ion=uuid
|
||||||
|
Dictionary<string, object> result = new Dictionary<string, object>();
|
||||||
|
string eid = (string)httpRequest.Query["eid"];
|
||||||
|
string region = (string)httpRequest.Query["region"];
|
||||||
|
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(eid) && string.IsNullOrEmpty(region) &&
|
||||||
|
requestData.ContainsKey("OP") && requestData["OP"] != null && "STORE".Equals(requestData["OP"]))
|
||||||
|
{
|
||||||
|
// /estates/estate/
|
||||||
|
EstateSettings es = new EstateSettings(requestData);
|
||||||
|
m_EstateService.StoreEstateSettings(es);
|
||||||
|
//m_log.DebugFormat("[EstateServerPostHandler]: Store estate {0}", es.ToString());
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.OK;
|
||||||
|
result["Result"] = true;
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(region) && !string.IsNullOrEmpty(eid) &&
|
||||||
|
requestData.ContainsKey("OP") && requestData["OP"] != null && "LINK".Equals(requestData["OP"]))
|
||||||
|
{
|
||||||
|
int id = 0;
|
||||||
|
UUID regionID = UUID.Zero;
|
||||||
|
if (UUID.TryParse(region, out regionID) && Int32.TryParse(eid, out id))
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[EstateServerPostHandler]: Link region {0} to estate {1}", regionID, id);
|
||||||
|
httpResponse.StatusCode = (int)HttpStatusCode.OK;
|
||||||
|
result["Result"] = m_EstateService.LinkRegion(regionID, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_log.WarnFormat("[EstateServerPostHandler]: something wrong with POST request {0}", httpRequest.RawUrl);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,340 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
using log4net;
|
||||||
|
|
||||||
|
using OpenMetaverse;
|
||||||
|
using Nini.Config;
|
||||||
|
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.ServiceAuth;
|
||||||
|
using OpenSim.Services.Connectors;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using OpenSim.Server.Base;
|
||||||
|
|
||||||
|
namespace OpenSim.Service.Connectors
|
||||||
|
{
|
||||||
|
public class EstateDataRemoteConnector : BaseServiceConnector, IEstateDataService
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log =
|
||||||
|
LogManager.GetLogger(
|
||||||
|
MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
private string m_ServerURI = String.Empty;
|
||||||
|
private ExpiringCache<string, List<EstateSettings>> m_EstateCache = new ExpiringCache<string, List<EstateSettings>>();
|
||||||
|
private const int EXPIRATION = 5 * 60; // 5 minutes in secs
|
||||||
|
|
||||||
|
public EstateDataRemoteConnector(IConfigSource source)
|
||||||
|
{
|
||||||
|
Initialise(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Initialise(IConfigSource source)
|
||||||
|
{
|
||||||
|
IConfig gridConfig = source.Configs["EstateService"];
|
||||||
|
if (gridConfig == null)
|
||||||
|
{
|
||||||
|
m_log.Error("[ESTATE CONNECTOR]: EstateService missing from OpenSim.ini");
|
||||||
|
throw new Exception("Estate connector init error");
|
||||||
|
}
|
||||||
|
|
||||||
|
string serviceURI = gridConfig.GetString("EstateServerURI",
|
||||||
|
String.Empty);
|
||||||
|
|
||||||
|
if (serviceURI == String.Empty)
|
||||||
|
{
|
||||||
|
m_log.Error("[ESTATE CONNECTOR]: No Server URI named in section EstateService");
|
||||||
|
throw new Exception("Estate connector init error");
|
||||||
|
}
|
||||||
|
m_ServerURI = serviceURI;
|
||||||
|
|
||||||
|
base.Initialise(source, "EstateService");
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IEstateDataService
|
||||||
|
|
||||||
|
public List<EstateSettings> LoadEstateSettingsAll()
|
||||||
|
{
|
||||||
|
string reply = string.Empty;
|
||||||
|
string uri = m_ServerURI + "/estates";
|
||||||
|
|
||||||
|
reply = MakeRequest("GET", uri, string.Empty);
|
||||||
|
if (String.IsNullOrEmpty(reply))
|
||||||
|
return new List<EstateSettings>();
|
||||||
|
|
||||||
|
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
|
||||||
|
|
||||||
|
List<EstateSettings> estates = new List<EstateSettings>();
|
||||||
|
if (replyData != null && replyData.Count > 0)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll returned {0} elements", replyData.Count);
|
||||||
|
Dictionary<string, object>.ValueCollection estateData = replyData.Values;
|
||||||
|
foreach (object r in estateData)
|
||||||
|
{
|
||||||
|
if (r is Dictionary<string, object>)
|
||||||
|
{
|
||||||
|
EstateSettings es = new EstateSettings((Dictionary<string, object>)r);
|
||||||
|
estates.Add(es);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_EstateCache.AddOrUpdate("estates", estates, EXPIRATION);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettingsAll from {0} received null or zero response", uri);
|
||||||
|
|
||||||
|
return estates;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<int> GetEstatesAll()
|
||||||
|
{
|
||||||
|
List<int> eids = new List<int>();
|
||||||
|
// If we don't have them, load them from the server
|
||||||
|
List<EstateSettings> estates = null;
|
||||||
|
if (!m_EstateCache.TryGetValue("estates", out estates))
|
||||||
|
LoadEstateSettingsAll();
|
||||||
|
|
||||||
|
foreach (EstateSettings es in estates)
|
||||||
|
eids.Add((int)es.EstateID);
|
||||||
|
|
||||||
|
return eids;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<int> GetEstates(string search)
|
||||||
|
{
|
||||||
|
// If we don't have them, load them from the server
|
||||||
|
List<EstateSettings> estates = null;
|
||||||
|
if (!m_EstateCache.TryGetValue("estates", out estates))
|
||||||
|
LoadEstateSettingsAll();
|
||||||
|
|
||||||
|
List<int> eids = new List<int>();
|
||||||
|
foreach (EstateSettings es in estates)
|
||||||
|
if (es.EstateName == search)
|
||||||
|
eids.Add((int)es.EstateID);
|
||||||
|
|
||||||
|
return eids;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<int> GetEstatesByOwner(UUID ownerID)
|
||||||
|
{
|
||||||
|
// If we don't have them, load them from the server
|
||||||
|
List<EstateSettings> estates = null;
|
||||||
|
if (!m_EstateCache.TryGetValue("estates", out estates))
|
||||||
|
LoadEstateSettingsAll();
|
||||||
|
|
||||||
|
List<int> eids = new List<int>();
|
||||||
|
foreach (EstateSettings es in estates)
|
||||||
|
if (es.EstateOwner == ownerID)
|
||||||
|
eids.Add((int)es.EstateID);
|
||||||
|
|
||||||
|
return eids;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<UUID> GetRegions(int estateID)
|
||||||
|
{
|
||||||
|
string reply = string.Empty;
|
||||||
|
// /estates/regions/?eid=int
|
||||||
|
string uri = m_ServerURI + "/estates/regions/?eid=" + estateID.ToString();
|
||||||
|
|
||||||
|
reply = MakeRequest("GET", uri, string.Empty);
|
||||||
|
if (String.IsNullOrEmpty(reply))
|
||||||
|
return new List<UUID>();
|
||||||
|
|
||||||
|
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
|
||||||
|
|
||||||
|
List<UUID> regions = new List<UUID>();
|
||||||
|
if (replyData != null && replyData.Count > 0)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions for estate {0} returned {1} elements", estateID, replyData.Count);
|
||||||
|
Dictionary<string, object>.ValueCollection data = replyData.Values;
|
||||||
|
foreach (object r in data)
|
||||||
|
{
|
||||||
|
UUID uuid = UUID.Zero;
|
||||||
|
if (UUID.TryParse(r.ToString(), out uuid))
|
||||||
|
regions.Add(uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: GetRegions from {0} received null or zero response", uri);
|
||||||
|
|
||||||
|
return regions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EstateSettings LoadEstateSettings(UUID regionID, bool create)
|
||||||
|
{
|
||||||
|
string reply = string.Empty;
|
||||||
|
// /estates/estate/?region=uuid&create=[t|f]
|
||||||
|
string uri = m_ServerURI + string.Format("/estates/estate/?region={0}&create={1}", regionID, create);
|
||||||
|
|
||||||
|
reply = MakeRequest("GET", uri, string.Empty);
|
||||||
|
if (String.IsNullOrEmpty(reply))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
|
||||||
|
|
||||||
|
if (replyData != null && replyData.Count > 0)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings({0}) returned {1} elements", regionID, replyData.Count);
|
||||||
|
EstateSettings es = new EstateSettings(replyData);
|
||||||
|
return es;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings(regionID) from {0} received null or zero response", uri);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EstateSettings LoadEstateSettings(int estateID)
|
||||||
|
{
|
||||||
|
string reply = string.Empty;
|
||||||
|
// /estates/estate/?eid=int
|
||||||
|
string uri = m_ServerURI + string.Format("/estates/estate/?eid={0}", estateID);
|
||||||
|
|
||||||
|
reply = MakeRequest("GET", uri, string.Empty);
|
||||||
|
if (String.IsNullOrEmpty(reply))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
|
||||||
|
|
||||||
|
if (replyData != null && replyData.Count > 0)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings({0}) returned {1} elements", estateID, replyData.Count);
|
||||||
|
EstateSettings es = new EstateSettings(replyData);
|
||||||
|
return es;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: LoadEstateSettings(estateID) from {0} received null or zero response", uri);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Forbidden operation
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public EstateSettings CreateNewEstate()
|
||||||
|
{
|
||||||
|
// No can do
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StoreEstateSettings(EstateSettings es)
|
||||||
|
{
|
||||||
|
string reply = string.Empty;
|
||||||
|
// /estates/estate/
|
||||||
|
string uri = m_ServerURI + ("/estates/estate");
|
||||||
|
|
||||||
|
Dictionary<string, object> formdata = es.ToMap();
|
||||||
|
formdata["OP"] = "STORE";
|
||||||
|
|
||||||
|
PostRequest(uri, formdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool LinkRegion(UUID regionID, int estateID)
|
||||||
|
{
|
||||||
|
string reply = string.Empty;
|
||||||
|
// /estates/estate/?eid=int®ion=uuid
|
||||||
|
string uri = m_ServerURI + String.Format("/estates/estate/?eid={0}®ion={1}", estateID, regionID);
|
||||||
|
|
||||||
|
Dictionary<string, object> formdata = new Dictionary<string, object>();
|
||||||
|
formdata["OP"] = "LINK";
|
||||||
|
return PostRequest(uri, formdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool PostRequest(string uri, Dictionary<string, object> sendData)
|
||||||
|
{
|
||||||
|
string reqString = ServerUtils.BuildQueryString(sendData);
|
||||||
|
|
||||||
|
string reply = MakeRequest("POST", uri, reqString);
|
||||||
|
if (String.IsNullOrEmpty(reply))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
|
||||||
|
|
||||||
|
bool result = false;
|
||||||
|
if (replyData != null && replyData.Count > 0)
|
||||||
|
{
|
||||||
|
if (replyData.ContainsKey("Result"))
|
||||||
|
{
|
||||||
|
if (Boolean.TryParse(replyData["Result"].ToString(), out result))
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} returned {1}", uri, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: PostRequest {0} received null or zero response", uri);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Forbidden operation
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool DeleteEstate(int estateID)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private string MakeRequest(string verb, string uri, string formdata)
|
||||||
|
{
|
||||||
|
string reply = string.Empty;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
reply = SynchronousRestFormsRequester.MakeRequest(verb, uri, formdata, m_Auth);
|
||||||
|
}
|
||||||
|
catch (WebException e)
|
||||||
|
{
|
||||||
|
using (HttpWebResponse hwr = (HttpWebResponse)e.Response)
|
||||||
|
{
|
||||||
|
if (hwr != null)
|
||||||
|
{
|
||||||
|
if (hwr.StatusCode == HttpStatusCode.NotFound)
|
||||||
|
m_log.Error(string.Format("[ESTATE CONNECTOR]: Resource {0} not found ", uri));
|
||||||
|
if (hwr.StatusCode == HttpStatusCode.Unauthorized)
|
||||||
|
m_log.Error(string.Format("[ESTATE CONNECTOR]: Web request {0} requires authentication ", uri));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_log.Error(string.Format(
|
||||||
|
"[ESTATE CONNECTOR]: WebException for {0} {1} {2} ",
|
||||||
|
verb, uri, formdata, e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[ESTATE CONNECTOR]: Exception when contacting estate server at {0}: {1}", uri, e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,17 +29,14 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Mono.Addins;
|
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using OpenSim.Services.Base;
|
using OpenSim.Services.Base;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenSim.Data;
|
using OpenSim.Data;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
//using OpenSim.Region.Framework.Interfaces;
|
|
||||||
//using OpenSim.Region.Framework.Scenes;
|
|
||||||
|
|
||||||
namespace OpenSim.Services.Connectors
|
namespace OpenSim.Services.EstateService
|
||||||
{
|
{
|
||||||
public class EstateDataService : ServiceBase, IEstateDataService
|
public class EstateDataService : ServiceBase, IEstateDataService
|
||||||
{
|
{
|
|
@ -29,7 +29,6 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Mono.Addins;
|
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using OpenSim.Services.Base;
|
using OpenSim.Services.Base;
|
||||||
|
@ -39,7 +38,7 @@ using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
namespace OpenSim.Services.Connectors
|
namespace OpenSim.Services.SimulationService
|
||||||
{
|
{
|
||||||
public class SimulationDataService : ServiceBase, ISimulationDataService
|
public class SimulationDataService : ServiceBase, ISimulationDataService
|
||||||
{
|
{
|
|
@ -110,6 +110,8 @@
|
||||||
;; Uncomment for UserProfiles see [UserProfilesService] to configure...
|
;; Uncomment for UserProfiles see [UserProfilesService] to configure...
|
||||||
; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
|
; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
|
||||||
|
|
||||||
|
;; Uncomment if you want to have centralized estate data
|
||||||
|
; EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
|
||||||
|
|
||||||
; * This is common for all services, it's the network setup for the entire
|
; * This is common for all services, it's the network setup for the entire
|
||||||
; * server instance, if none is specified above
|
; * server instance, if none is specified above
|
||||||
|
@ -379,6 +381,8 @@
|
||||||
; for the server connector
|
; for the server connector
|
||||||
LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
|
LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
|
||||||
|
|
||||||
|
[EstateService]
|
||||||
|
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
|
||||||
|
|
||||||
[LibraryService]
|
[LibraryService]
|
||||||
LibraryName = "OpenSim Library"
|
LibraryName = "OpenSim Library"
|
||||||
|
|
|
@ -89,6 +89,9 @@
|
||||||
;; Uncomment for UserProfiles see [UserProfilesService] to configure...
|
;; Uncomment for UserProfiles see [UserProfilesService] to configure...
|
||||||
; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
|
; UserProfilesServiceConnector = "${Const|PublicPort}/OpenSim.Server.Handlers.dll:UserProfilesConnector"
|
||||||
|
|
||||||
|
;; Uncomment if you want to have centralized estate data
|
||||||
|
; EstateDataService = "${Const|PrivatePort}/OpenSim.Server.Handlers.dll:EstateDataRobustConnector"
|
||||||
|
|
||||||
; * This is common for all services, it's the network setup for the entire
|
; * This is common for all services, it's the network setup for the entire
|
||||||
; * server instance, if none is specified above
|
; * server instance, if none is specified above
|
||||||
; *
|
; *
|
||||||
|
@ -339,6 +342,8 @@
|
||||||
; for the server connector
|
; for the server connector
|
||||||
LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
|
LocalServiceModule = "OpenSim.Services.FriendsService.dll:FriendsService"
|
||||||
|
|
||||||
|
[EstateService]
|
||||||
|
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
|
||||||
|
|
||||||
[LibraryService]
|
[LibraryService]
|
||||||
LibraryName = "OpenSim Library"
|
LibraryName = "OpenSim Library"
|
||||||
|
|
|
@ -46,10 +46,10 @@
|
||||||
ConnectorProtocolVersion = "SIMULATION/0.3"
|
ConnectorProtocolVersion = "SIMULATION/0.3"
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
|
||||||
|
|
||||||
[EstateDataStore]
|
[EstateDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
|
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
|
||||||
|
|
||||||
[GridService]
|
[GridService]
|
||||||
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
|
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
|
||||||
|
|
|
@ -108,6 +108,16 @@
|
||||||
;; Robust server in port ${Const|PublicPort}, but not always)
|
;; Robust server in port ${Const|PublicPort}, but not always)
|
||||||
Gatekeeper="${Const|BaseURL}:${Const|PublicPort}"
|
Gatekeeper="${Const|BaseURL}:${Const|PublicPort}"
|
||||||
|
|
||||||
|
[EstateDataStore]
|
||||||
|
;
|
||||||
|
; Uncomment if you want centralized estate data at robust server,
|
||||||
|
; in which case the URL in [EstateService] will be used
|
||||||
|
;
|
||||||
|
;LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataConnector"
|
||||||
|
|
||||||
|
[EstateService]
|
||||||
|
EstateServerURI = "${Const|BaseURL}:${Const|PrivatePort}"
|
||||||
|
|
||||||
[Messaging]
|
[Messaging]
|
||||||
; === HG ONLY ===
|
; === HG ONLY ===
|
||||||
;; Change this to the address of your Gatekeeper service
|
;; Change this to the address of your Gatekeeper service
|
||||||
|
|
|
@ -54,10 +54,10 @@
|
||||||
Module = "BasicProfileModule"
|
Module = "BasicProfileModule"
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
|
||||||
|
|
||||||
[EstateDataStore]
|
[EstateDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
|
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
|
||||||
|
|
||||||
[AssetService]
|
[AssetService]
|
||||||
LocalGridAssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"
|
LocalGridAssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector"
|
||||||
|
|
|
@ -42,10 +42,10 @@
|
||||||
AssetCaching = "FlotsamAssetCache"
|
AssetCaching = "FlotsamAssetCache"
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
|
||||||
|
|
||||||
[EstateDataStore]
|
[EstateDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
|
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
|
||||||
|
|
||||||
[Friends]
|
[Friends]
|
||||||
Connector = "OpenSim.Services.Connectors.dll:SimianFriendsServiceConnector"
|
Connector = "OpenSim.Services.Connectors.dll:SimianFriendsServiceConnector"
|
||||||
|
|
|
@ -43,10 +43,10 @@
|
||||||
ConnectorProtocolVersion = "SIMULATION/0.3"
|
ConnectorProtocolVersion = "SIMULATION/0.3"
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
|
||||||
|
|
||||||
[EstateDataStore]
|
[EstateDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
|
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
|
||||||
|
|
||||||
[AssetService]
|
[AssetService]
|
||||||
LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
|
LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
|
||||||
|
|
|
@ -58,10 +58,10 @@
|
||||||
LureModule = HGLureModule
|
LureModule = HGLureModule
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.SimulationService.dll:SimulationDataService"
|
||||||
|
|
||||||
[EstateDataStore]
|
[EstateDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:EstateDataService"
|
LocalServiceModule = "OpenSim.Services.EstateService.dll:EstateDataService"
|
||||||
|
|
||||||
[AssetService]
|
[AssetService]
|
||||||
LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
|
LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
|
||||||
|
|
63
prebuild.xml
63
prebuild.xml
|
@ -839,6 +839,40 @@
|
||||||
</Files>
|
</Files>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
|
<Project frameworkVersion="v4_0" name="OpenSim.Services.SimulationService" path="OpenSim/Services/SimulationService" type="Library">
|
||||||
|
<Configuration name="Debug">
|
||||||
|
<Options>
|
||||||
|
<OutputPath>../../../bin/</OutputPath>
|
||||||
|
</Options>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration name="Release">
|
||||||
|
<Options>
|
||||||
|
<OutputPath>../../../bin/</OutputPath>
|
||||||
|
</Options>
|
||||||
|
</Configuration>
|
||||||
|
|
||||||
|
<ReferencePath>../../../bin/</ReferencePath>
|
||||||
|
<Reference name="System"/>
|
||||||
|
<Reference name="System.Core"/>
|
||||||
|
<Reference name="System.Web"/>
|
||||||
|
<Reference name="System.Xml"/>
|
||||||
|
<Reference name="System.Drawing"/>
|
||||||
|
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
|
||||||
|
<Reference name="OpenMetaverse" path="../../../bin/"/>
|
||||||
|
<Reference name="OpenSim.Data"/>
|
||||||
|
<Reference name="OpenSim.Framework"/>
|
||||||
|
<Reference name="OpenSim.Region.Framework"/>
|
||||||
|
<Reference name="OpenSim.Services.Base"/>
|
||||||
|
<Reference name="OpenSim.Services.Interfaces"/>
|
||||||
|
<Reference name="Nini" path="../../../bin/"/>
|
||||||
|
<Reference name="log4net" path="../../../bin/"/>
|
||||||
|
<Reference name="XMLRPC" path="../../../bin/"/>
|
||||||
|
|
||||||
|
<Files>
|
||||||
|
<Match pattern="*.cs" recurse="true"/>
|
||||||
|
</Files>
|
||||||
|
</Project>
|
||||||
|
|
||||||
<Project frameworkVersion="v4_0" name="OpenSim.Services.AssetService" path="OpenSim/Services/AssetService" type="Library">
|
<Project frameworkVersion="v4_0" name="OpenSim.Services.AssetService" path="OpenSim/Services/AssetService" type="Library">
|
||||||
<Configuration name="Debug">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
|
@ -1000,6 +1034,35 @@
|
||||||
</Files>
|
</Files>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
|
<Project frameworkVersion="v4_0" name="OpenSim.Services.EstateService" path="OpenSim/Services/EstateService" type="Library">
|
||||||
|
<Configuration name="Debug">
|
||||||
|
<Options>
|
||||||
|
<OutputPath>../../../bin/</OutputPath>
|
||||||
|
</Options>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration name="Release">
|
||||||
|
<Options>
|
||||||
|
<OutputPath>../../../bin/</OutputPath>
|
||||||
|
</Options>
|
||||||
|
</Configuration>
|
||||||
|
|
||||||
|
<ReferencePath>../../../bin/</ReferencePath>
|
||||||
|
<Reference name="System"/>
|
||||||
|
<Reference name="System.Core"/>
|
||||||
|
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
|
||||||
|
<Reference name="OpenMetaverse" path="../../../bin/"/>
|
||||||
|
<Reference name="OpenSim.Framework"/>
|
||||||
|
<Reference name="OpenSim.Services.Interfaces"/>
|
||||||
|
<Reference name="OpenSim.Services.Base"/>
|
||||||
|
<Reference name="OpenSim.Data"/>
|
||||||
|
<Reference name="Nini" path="../../../bin/"/>
|
||||||
|
<Reference name="log4net" path="../../../bin/"/>
|
||||||
|
|
||||||
|
<Files>
|
||||||
|
<Match pattern="*.cs" recurse="true"/>
|
||||||
|
</Files>
|
||||||
|
</Project>
|
||||||
|
|
||||||
<Project frameworkVersion="v4_0" name="OpenSim.Services.PresenceService" path="OpenSim/Services/PresenceService" type="Library">
|
<Project frameworkVersion="v4_0" name="OpenSim.Services.PresenceService" path="OpenSim/Services/PresenceService" type="Library">
|
||||||
<Configuration name="Debug">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
|
|
Loading…
Reference in New Issue