Merge branch 'testmerge' into queuetest
Conflicts: OpenSim/Region/ClientStack/LindenUDP/LLClientView.csbulletsim
commit
590d20903c
OpenSim
Region
ClientStack/LindenUDP
CoreModules
Avatar
Friends
InstantMessage
Framework/InventoryAccess
ServiceConnectorsIn
Authentication
Hypergrid
Inventory
Neighbour
Simulation
World
Physics
BulletDotNETPlugin
OdePlugin
Services/Connectors
Authentication
Authorization
Freeswitch
GridUser
Inventory
Neighbour
Presence
UserAccounts
Tests/Common/Setup
|
@ -1,192 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.IO;
|
|
||||||
using System.Net;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
|
||||||
using System.Xml;
|
|
||||||
using System.Xml.Serialization;
|
|
||||||
using log4net;
|
|
||||||
|
|
||||||
namespace OpenSim.Framework.Servers.HttpServer
|
|
||||||
{
|
|
||||||
public class AsynchronousRestObjectRequester
|
|
||||||
{
|
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Perform an asynchronous REST request.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="verb">GET or POST</param>
|
|
||||||
/// <param name="requestUrl"></param>
|
|
||||||
/// <param name="obj"></param>
|
|
||||||
/// <param name="action"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
///
|
|
||||||
/// <exception cref="System.Net.WebException">Thrown if we encounter a
|
|
||||||
/// network issue while posting the request. You'll want to make
|
|
||||||
/// sure you deal with this as they're not uncommon</exception>
|
|
||||||
//
|
|
||||||
public static void MakeRequest<TRequest, TResponse>(string verb,
|
|
||||||
string requestUrl, TRequest obj, Action<TResponse> action)
|
|
||||||
{
|
|
||||||
// m_log.DebugFormat("[ASYNC REQUEST]: Starting {0} {1}", verb, requestUrl);
|
|
||||||
|
|
||||||
Type type = typeof (TRequest);
|
|
||||||
|
|
||||||
WebRequest request = WebRequest.Create(requestUrl);
|
|
||||||
WebResponse response = null;
|
|
||||||
TResponse deserial = default(TResponse);
|
|
||||||
XmlSerializer deserializer = new XmlSerializer(typeof (TResponse));
|
|
||||||
|
|
||||||
request.Method = verb;
|
|
||||||
|
|
||||||
if (verb == "POST")
|
|
||||||
{
|
|
||||||
request.ContentType = "text/xml";
|
|
||||||
|
|
||||||
MemoryStream buffer = new MemoryStream();
|
|
||||||
|
|
||||||
XmlWriterSettings settings = new XmlWriterSettings();
|
|
||||||
settings.Encoding = Encoding.UTF8;
|
|
||||||
|
|
||||||
using (XmlWriter writer = XmlWriter.Create(buffer, settings))
|
|
||||||
{
|
|
||||||
XmlSerializer serializer = new XmlSerializer(type);
|
|
||||||
serializer.Serialize(writer, obj);
|
|
||||||
writer.Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
int length = (int) buffer.Length;
|
|
||||||
request.ContentLength = length;
|
|
||||||
|
|
||||||
request.BeginGetRequestStream(delegate(IAsyncResult res)
|
|
||||||
{
|
|
||||||
Stream requestStream = request.EndGetRequestStream(res);
|
|
||||||
|
|
||||||
requestStream.Write(buffer.ToArray(), 0, length);
|
|
||||||
requestStream.Close();
|
|
||||||
|
|
||||||
request.BeginGetResponse(delegate(IAsyncResult ar)
|
|
||||||
{
|
|
||||||
response = request.EndGetResponse(ar);
|
|
||||||
Stream respStream = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
respStream = response.GetResponseStream();
|
|
||||||
deserial = (TResponse)deserializer.Deserialize(
|
|
||||||
respStream);
|
|
||||||
}
|
|
||||||
catch (System.InvalidOperationException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// Let's not close this
|
|
||||||
//buffer.Close();
|
|
||||||
respStream.Close();
|
|
||||||
response.Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
action(deserial);
|
|
||||||
|
|
||||||
}, null);
|
|
||||||
}, null);
|
|
||||||
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
request.BeginGetResponse(delegate(IAsyncResult res2)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't
|
|
||||||
// documented in MSDN
|
|
||||||
response = request.EndGetResponse(res2);
|
|
||||||
|
|
||||||
Stream respStream = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
respStream = response.GetResponseStream();
|
|
||||||
deserial = (TResponse)deserializer.Deserialize(respStream);
|
|
||||||
}
|
|
||||||
catch (System.InvalidOperationException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
respStream.Close();
|
|
||||||
response.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (WebException e)
|
|
||||||
{
|
|
||||||
if (e.Status == WebExceptionStatus.ProtocolError)
|
|
||||||
{
|
|
||||||
if (e.Response is HttpWebResponse)
|
|
||||||
{
|
|
||||||
HttpWebResponse httpResponse = (HttpWebResponse)e.Response;
|
|
||||||
|
|
||||||
if (httpResponse.StatusCode != HttpStatusCode.NotFound)
|
|
||||||
{
|
|
||||||
// We don't appear to be handling any other status codes, so log these feailures to that
|
|
||||||
// people don't spend unnecessary hours hunting phantom bugs.
|
|
||||||
m_log.DebugFormat(
|
|
||||||
"[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}",
|
|
||||||
verb, requestUrl, httpResponse.StatusCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", verb, requestUrl, e.Status, e.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with exception {2}", verb, requestUrl, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString());
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
action(deserial);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.ErrorFormat(
|
|
||||||
"[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}", verb, requestUrl, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
}, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.IO;
|
|
||||||
using System.Net;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
|
||||||
using System.Xml;
|
|
||||||
using System.Xml.Serialization;
|
|
||||||
|
|
||||||
using log4net;
|
|
||||||
|
|
||||||
namespace OpenSim.Framework.Servers.HttpServer
|
|
||||||
{
|
|
||||||
public class SynchronousRestFormsRequester
|
|
||||||
{
|
|
||||||
private static readonly ILog m_log =
|
|
||||||
LogManager.GetLogger(
|
|
||||||
MethodBase.GetCurrentMethod().DeclaringType);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Perform a synchronous REST request.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="verb"></param>
|
|
||||||
/// <param name="requestUrl"></param>
|
|
||||||
/// <param name="obj"> </param>
|
|
||||||
/// <returns></returns>
|
|
||||||
///
|
|
||||||
/// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting
|
|
||||||
/// the request. You'll want to make sure you deal with this as they're not uncommon</exception>
|
|
||||||
public static string MakeRequest(string verb, string requestUrl, string obj)
|
|
||||||
{
|
|
||||||
WebRequest request = WebRequest.Create(requestUrl);
|
|
||||||
request.Method = verb;
|
|
||||||
string respstring = String.Empty;
|
|
||||||
|
|
||||||
using (MemoryStream buffer = new MemoryStream())
|
|
||||||
{
|
|
||||||
if ((verb == "POST") || (verb == "PUT"))
|
|
||||||
{
|
|
||||||
request.ContentType = "text/www-form-urlencoded";
|
|
||||||
|
|
||||||
int length = 0;
|
|
||||||
using (StreamWriter writer = new StreamWriter(buffer))
|
|
||||||
{
|
|
||||||
writer.Write(obj);
|
|
||||||
writer.Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
length = (int)obj.Length;
|
|
||||||
request.ContentLength = length;
|
|
||||||
|
|
||||||
Stream requestStream = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
requestStream = request.GetRequestStream();
|
|
||||||
requestStream.Write(buffer.ToArray(), 0, length);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.DebugFormat("[FORMS]: exception occured on sending request to {0}: " + e.ToString(), requestUrl);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (requestStream != null)
|
|
||||||
requestStream.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (WebResponse resp = request.GetResponse())
|
|
||||||
{
|
|
||||||
if (resp.ContentLength != 0)
|
|
||||||
{
|
|
||||||
Stream respStream = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
respStream = resp.GetResponseStream();
|
|
||||||
using (StreamReader reader = new StreamReader(respStream))
|
|
||||||
{
|
|
||||||
respstring = reader.ReadToEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.DebugFormat("[FORMS]: exception occured on receiving reply " + e.ToString());
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (respStream != null)
|
|
||||||
respStream.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (System.InvalidOperationException)
|
|
||||||
{
|
|
||||||
// This is what happens when there is invalid XML
|
|
||||||
m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving request");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return respstring;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,122 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.IO;
|
|
||||||
using System.Net;
|
|
||||||
using System.Text;
|
|
||||||
using System.Xml;
|
|
||||||
using System.Xml.Serialization;
|
|
||||||
|
|
||||||
namespace OpenSim.Framework.Servers.HttpServer
|
|
||||||
{
|
|
||||||
public class SynchronousRestObjectPoster
|
|
||||||
{
|
|
||||||
[Obsolete]
|
|
||||||
public static TResponse BeginPostObject<TRequest, TResponse>(string verb, string requestUrl, TRequest obj)
|
|
||||||
{
|
|
||||||
return SynchronousRestObjectRequester.MakeRequest<TRequest, TResponse>(verb, requestUrl, obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SynchronousRestObjectRequester
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Perform a synchronous REST request.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="verb"></param>
|
|
||||||
/// <param name="requestUrl"></param>
|
|
||||||
/// <param name="obj"> </param>
|
|
||||||
/// <returns></returns>
|
|
||||||
///
|
|
||||||
/// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting
|
|
||||||
/// the request. You'll want to make sure you deal with this as they're not uncommon</exception>
|
|
||||||
public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj)
|
|
||||||
{
|
|
||||||
Type type = typeof (TRequest);
|
|
||||||
TResponse deserial = default(TResponse);
|
|
||||||
|
|
||||||
WebRequest request = WebRequest.Create(requestUrl);
|
|
||||||
request.Method = verb;
|
|
||||||
|
|
||||||
if ((verb == "POST") || (verb == "PUT"))
|
|
||||||
{
|
|
||||||
request.ContentType = "text/xml";
|
|
||||||
|
|
||||||
MemoryStream buffer = new MemoryStream();
|
|
||||||
|
|
||||||
XmlWriterSettings settings = new XmlWriterSettings();
|
|
||||||
settings.Encoding = Encoding.UTF8;
|
|
||||||
|
|
||||||
using (XmlWriter writer = XmlWriter.Create(buffer, settings))
|
|
||||||
{
|
|
||||||
XmlSerializer serializer = new XmlSerializer(type);
|
|
||||||
serializer.Serialize(writer, obj);
|
|
||||||
writer.Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
int length = (int) buffer.Length;
|
|
||||||
request.ContentLength = length;
|
|
||||||
|
|
||||||
Stream requestStream = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
requestStream = request.GetRequestStream();
|
|
||||||
requestStream.Write(buffer.ToArray(), 0, length);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
return deserial;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (requestStream != null)
|
|
||||||
requestStream.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (WebResponse resp = request.GetResponse())
|
|
||||||
{
|
|
||||||
if (resp.ContentLength > 0)
|
|
||||||
{
|
|
||||||
Stream respStream = resp.GetResponseStream();
|
|
||||||
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
|
|
||||||
deserial = (TResponse)deserializer.Deserialize(respStream);
|
|
||||||
respStream.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (System.InvalidOperationException)
|
|
||||||
{
|
|
||||||
// This is what happens when there is invalid XML
|
|
||||||
}
|
|
||||||
return deserial;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -36,6 +36,9 @@ using System.Net.Security;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
using log4net;
|
using log4net;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
using OpenSim.Framework.Servers.HttpServer;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
|
@ -625,4 +628,336 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class AsynchronousRestObjectRequester
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Perform an asynchronous REST request.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="verb">GET or POST</param>
|
||||||
|
/// <param name="requestUrl"></param>
|
||||||
|
/// <param name="obj"></param>
|
||||||
|
/// <param name="action"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
///
|
||||||
|
/// <exception cref="System.Net.WebException">Thrown if we encounter a
|
||||||
|
/// network issue while posting the request. You'll want to make
|
||||||
|
/// sure you deal with this as they're not uncommon</exception>
|
||||||
|
//
|
||||||
|
public static void MakeRequest<TRequest, TResponse>(string verb,
|
||||||
|
string requestUrl, TRequest obj, Action<TResponse> action)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASYNC REQUEST]: Starting {0} {1}", verb, requestUrl);
|
||||||
|
|
||||||
|
Type type = typeof(TRequest);
|
||||||
|
|
||||||
|
WebRequest request = WebRequest.Create(requestUrl);
|
||||||
|
WebResponse response = null;
|
||||||
|
TResponse deserial = default(TResponse);
|
||||||
|
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
|
||||||
|
|
||||||
|
request.Method = verb;
|
||||||
|
|
||||||
|
if (verb == "POST")
|
||||||
|
{
|
||||||
|
request.ContentType = "text/xml";
|
||||||
|
|
||||||
|
MemoryStream buffer = new MemoryStream();
|
||||||
|
|
||||||
|
XmlWriterSettings settings = new XmlWriterSettings();
|
||||||
|
settings.Encoding = Encoding.UTF8;
|
||||||
|
|
||||||
|
using (XmlWriter writer = XmlWriter.Create(buffer, settings))
|
||||||
|
{
|
||||||
|
XmlSerializer serializer = new XmlSerializer(type);
|
||||||
|
serializer.Serialize(writer, obj);
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
int length = (int)buffer.Length;
|
||||||
|
request.ContentLength = length;
|
||||||
|
|
||||||
|
request.BeginGetRequestStream(delegate(IAsyncResult res)
|
||||||
|
{
|
||||||
|
Stream requestStream = request.EndGetRequestStream(res);
|
||||||
|
|
||||||
|
requestStream.Write(buffer.ToArray(), 0, length);
|
||||||
|
requestStream.Close();
|
||||||
|
|
||||||
|
request.BeginGetResponse(delegate(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
response = request.EndGetResponse(ar);
|
||||||
|
Stream respStream = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
respStream = response.GetResponseStream();
|
||||||
|
deserial = (TResponse)deserializer.Deserialize(
|
||||||
|
respStream);
|
||||||
|
}
|
||||||
|
catch (System.InvalidOperationException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// Let's not close this
|
||||||
|
//buffer.Close();
|
||||||
|
respStream.Close();
|
||||||
|
response.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
action(deserial);
|
||||||
|
|
||||||
|
}, null);
|
||||||
|
}, null);
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
request.BeginGetResponse(delegate(IAsyncResult res2)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't
|
||||||
|
// documented in MSDN
|
||||||
|
response = request.EndGetResponse(res2);
|
||||||
|
|
||||||
|
Stream respStream = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
respStream = response.GetResponseStream();
|
||||||
|
deserial = (TResponse)deserializer.Deserialize(respStream);
|
||||||
|
}
|
||||||
|
catch (System.InvalidOperationException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
respStream.Close();
|
||||||
|
response.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (WebException e)
|
||||||
|
{
|
||||||
|
if (e.Status == WebExceptionStatus.ProtocolError)
|
||||||
|
{
|
||||||
|
if (e.Response is HttpWebResponse)
|
||||||
|
{
|
||||||
|
HttpWebResponse httpResponse = (HttpWebResponse)e.Response;
|
||||||
|
|
||||||
|
if (httpResponse.StatusCode != HttpStatusCode.NotFound)
|
||||||
|
{
|
||||||
|
// We don't appear to be handling any other status codes, so log these feailures to that
|
||||||
|
// people don't spend unnecessary hours hunting phantom bugs.
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}",
|
||||||
|
verb, requestUrl, httpResponse.StatusCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", verb, requestUrl, e.Status, e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[ASYNC REQUEST]: Request {0} {1} failed with exception {2}", verb, requestUrl, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString());
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
action(deserial);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}", verb, requestUrl, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class SynchronousRestFormsRequester
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log =
|
||||||
|
LogManager.GetLogger(
|
||||||
|
MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Perform a synchronous REST request.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="verb"></param>
|
||||||
|
/// <param name="requestUrl"></param>
|
||||||
|
/// <param name="obj"> </param>
|
||||||
|
/// <returns></returns>
|
||||||
|
///
|
||||||
|
/// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting
|
||||||
|
/// the request. You'll want to make sure you deal with this as they're not uncommon</exception>
|
||||||
|
public static string MakeRequest(string verb, string requestUrl, string obj)
|
||||||
|
{
|
||||||
|
WebRequest request = WebRequest.Create(requestUrl);
|
||||||
|
request.Method = verb;
|
||||||
|
string respstring = String.Empty;
|
||||||
|
|
||||||
|
using (MemoryStream buffer = new MemoryStream())
|
||||||
|
{
|
||||||
|
if ((verb == "POST") || (verb == "PUT"))
|
||||||
|
{
|
||||||
|
request.ContentType = "text/www-form-urlencoded";
|
||||||
|
|
||||||
|
int length = 0;
|
||||||
|
using (StreamWriter writer = new StreamWriter(buffer))
|
||||||
|
{
|
||||||
|
writer.Write(obj);
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
length = (int)obj.Length;
|
||||||
|
request.ContentLength = length;
|
||||||
|
|
||||||
|
Stream requestStream = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
requestStream = request.GetRequestStream();
|
||||||
|
requestStream.Write(buffer.ToArray(), 0, length);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[FORMS]: exception occured on sending request to {0}: " + e.ToString(), requestUrl);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (requestStream != null)
|
||||||
|
requestStream.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (WebResponse resp = request.GetResponse())
|
||||||
|
{
|
||||||
|
if (resp.ContentLength != 0)
|
||||||
|
{
|
||||||
|
Stream respStream = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
respStream = resp.GetResponseStream();
|
||||||
|
using (StreamReader reader = new StreamReader(respStream))
|
||||||
|
{
|
||||||
|
respstring = reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[FORMS]: exception occured on receiving reply " + e.ToString());
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (respStream != null)
|
||||||
|
respStream.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (System.InvalidOperationException)
|
||||||
|
{
|
||||||
|
// This is what happens when there is invalid XML
|
||||||
|
m_log.DebugFormat("[FORMS]: InvalidOperationException on receiving request");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return respstring;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SynchronousRestObjectPoster
|
||||||
|
{
|
||||||
|
[Obsolete]
|
||||||
|
public static TResponse BeginPostObject<TRequest, TResponse>(string verb, string requestUrl, TRequest obj)
|
||||||
|
{
|
||||||
|
return SynchronousRestObjectRequester.MakeRequest<TRequest, TResponse>(verb, requestUrl, obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SynchronousRestObjectRequester
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Perform a synchronous REST request.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="verb"></param>
|
||||||
|
/// <param name="requestUrl"></param>
|
||||||
|
/// <param name="obj"> </param>
|
||||||
|
/// <returns></returns>
|
||||||
|
///
|
||||||
|
/// <exception cref="System.Net.WebException">Thrown if we encounter a network issue while posting
|
||||||
|
/// the request. You'll want to make sure you deal with this as they're not uncommon</exception>
|
||||||
|
public static TResponse MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj)
|
||||||
|
{
|
||||||
|
Type type = typeof(TRequest);
|
||||||
|
TResponse deserial = default(TResponse);
|
||||||
|
|
||||||
|
WebRequest request = WebRequest.Create(requestUrl);
|
||||||
|
request.Method = verb;
|
||||||
|
|
||||||
|
if ((verb == "POST") || (verb == "PUT"))
|
||||||
|
{
|
||||||
|
request.ContentType = "text/xml";
|
||||||
|
|
||||||
|
MemoryStream buffer = new MemoryStream();
|
||||||
|
|
||||||
|
XmlWriterSettings settings = new XmlWriterSettings();
|
||||||
|
settings.Encoding = Encoding.UTF8;
|
||||||
|
|
||||||
|
using (XmlWriter writer = XmlWriter.Create(buffer, settings))
|
||||||
|
{
|
||||||
|
XmlSerializer serializer = new XmlSerializer(type);
|
||||||
|
serializer.Serialize(writer, obj);
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
int length = (int)buffer.Length;
|
||||||
|
request.ContentLength = length;
|
||||||
|
|
||||||
|
Stream requestStream = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
requestStream = request.GetRequestStream();
|
||||||
|
requestStream.Write(buffer.ToArray(), 0, length);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
return deserial;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (requestStream != null)
|
||||||
|
requestStream.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (WebResponse resp = request.GetResponse())
|
||||||
|
{
|
||||||
|
if (resp.ContentLength > 0)
|
||||||
|
{
|
||||||
|
Stream respStream = resp.GetResponseStream();
|
||||||
|
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
|
||||||
|
deserial = (TResponse)deserializer.Deserialize(respStream);
|
||||||
|
respStream.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (System.InvalidOperationException)
|
||||||
|
{
|
||||||
|
// This is what happens when there is invalid XML
|
||||||
|
}
|
||||||
|
return deserial;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4049,7 +4049,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
ppcnt++;
|
ppcnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Int32 fpcnt = 0;
|
Int32 fpcnt = 0;
|
||||||
Int32 fbcnt = 0;
|
Int32 fbcnt = 0;
|
||||||
|
|
||||||
|
@ -4298,6 +4297,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
public void SendEstateCovenantInformation(UUID covenant)
|
public void SendEstateCovenantInformation(UUID covenant)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[LLCLIENTVIEW]: Sending estate covenant asset id of {0} to {1}", covenant, Name);
|
||||||
|
|
||||||
EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
|
EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
|
||||||
EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock();
|
EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock();
|
||||||
edata.CovenantID = covenant;
|
edata.CovenantID = covenant;
|
||||||
|
@ -4308,8 +4309,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
OutPacket(einfopack, ThrottleOutPacketType.Task);
|
OutPacket(einfopack, ThrottleOutPacketType.Task);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner)
|
public void SendDetailedEstateData(
|
||||||
|
UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition,
|
||||||
|
UUID covenant, string abuseEmail, UUID estateOwner)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[LLCLIENTVIEW]: Sending detailed estate data to {0} with covenant asset id {1}", Name, covenant);
|
||||||
|
|
||||||
EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
|
EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
|
||||||
packet.MethodData.Invoice = invoice;
|
packet.MethodData.Invoice = invoice;
|
||||||
packet.AgentData.TransactionID = UUID.Random();
|
packet.AgentData.TransactionID = UUID.Random();
|
||||||
|
|
|
@ -34,13 +34,13 @@ using Nini.Config;
|
||||||
using Nwc.XmlRpc;
|
using Nwc.XmlRpc;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Servers.HttpServer;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenSim.Services.Connectors.Friends;
|
using OpenSim.Services.Connectors.Friends;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
|
using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
|
||||||
using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo;
|
using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo;
|
||||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers;
|
using OpenSim.Framework.Servers;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Framework.Client;
|
using OpenSim.Framework.Client;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
|
@ -222,7 +222,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
deletes[g.OwnerID].Add(g);
|
deletes[g.OwnerID].Add(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is pethod scoped and will be returned. It will be the
|
// This is method scoped and will be returned. It will be the
|
||||||
// last created asset id
|
// last created asset id
|
||||||
UUID assetID = UUID.Zero;
|
UUID assetID = UUID.Zero;
|
||||||
|
|
||||||
|
@ -230,8 +230,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
// with distinct destinations as well.
|
// with distinct destinations as well.
|
||||||
foreach (List<SceneObjectGroup> objlist in deletes.Values)
|
foreach (List<SceneObjectGroup> objlist in deletes.Values)
|
||||||
{
|
{
|
||||||
Dictionary<UUID, string> xmlStrings =
|
CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
|
||||||
new Dictionary<UUID, string>();
|
Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
|
||||||
|
|
||||||
foreach (SceneObjectGroup objectGroup in objlist)
|
foreach (SceneObjectGroup objectGroup in objlist)
|
||||||
{
|
{
|
||||||
|
@ -245,7 +245,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
: objectGroup.AbsolutePosition.X,
|
: objectGroup.AbsolutePosition.X,
|
||||||
objectGroup.AbsolutePosition.Z);
|
objectGroup.AbsolutePosition.Z);
|
||||||
|
|
||||||
Vector3 originalPosition = objectGroup.AbsolutePosition;
|
originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition;
|
||||||
|
|
||||||
objectGroup.AbsolutePosition = inventoryStoredPosition;
|
objectGroup.AbsolutePosition = inventoryStoredPosition;
|
||||||
|
|
||||||
|
@ -260,58 +260,19 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
objectGroup.RootPart.NextOwnerMask |=
|
objectGroup.RootPart.NextOwnerMask |=
|
||||||
(uint)PermissionMask.Move;
|
(uint)PermissionMask.Move;
|
||||||
|
|
||||||
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup);
|
coa.Add(objectGroup);
|
||||||
|
|
||||||
objectGroup.AbsolutePosition = originalPosition;
|
|
||||||
|
|
||||||
xmlStrings[objectGroup.UUID] = sceneObjectXml;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string itemXml;
|
string itemXml;
|
||||||
|
|
||||||
if (objlist.Count > 1)
|
if (objlist.Count > 1)
|
||||||
{
|
itemXml = CoalescedSceneObjectsSerializer.ToXml(coa);
|
||||||
float minX, minY, minZ;
|
|
||||||
float maxX, maxY, maxZ;
|
|
||||||
|
|
||||||
Vector3[] offsets = m_Scene.GetCombinedBoundingBox(objlist,
|
|
||||||
out minX, out maxX, out minY, out maxY,
|
|
||||||
out minZ, out maxZ);
|
|
||||||
|
|
||||||
// CreateWrapper
|
|
||||||
XmlDocument itemDoc = new XmlDocument();
|
|
||||||
XmlElement root = itemDoc.CreateElement("", "CoalescedObject", "");
|
|
||||||
itemDoc.AppendChild(root);
|
|
||||||
|
|
||||||
// Embed the offsets into the group XML
|
|
||||||
for ( int i = 0 ; i < objlist.Count ; i++ )
|
|
||||||
{
|
|
||||||
XmlDocument doc = new XmlDocument();
|
|
||||||
SceneObjectGroup g = objlist[i];
|
|
||||||
doc.LoadXml(xmlStrings[g.UUID]);
|
|
||||||
XmlElement e = (XmlElement)doc.SelectSingleNode("/SceneObjectGroup");
|
|
||||||
e.SetAttribute("offsetx", offsets[i].X.ToString());
|
|
||||||
e.SetAttribute("offsety", offsets[i].Y.ToString());
|
|
||||||
e.SetAttribute("offsetz", offsets[i].Z.ToString());
|
|
||||||
|
|
||||||
XmlNode objectNode = itemDoc.ImportNode(e, true);
|
|
||||||
root.AppendChild(objectNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
float sizeX = maxX - minX;
|
|
||||||
float sizeY = maxY - minY;
|
|
||||||
float sizeZ = maxZ - minZ;
|
|
||||||
|
|
||||||
root.SetAttribute("x", sizeX.ToString());
|
|
||||||
root.SetAttribute("y", sizeY.ToString());
|
|
||||||
root.SetAttribute("z", sizeZ.ToString());
|
|
||||||
|
|
||||||
itemXml = itemDoc.InnerXml;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]);
|
||||||
itemXml = xmlStrings[objlist[0].UUID];
|
|
||||||
}
|
// Restore the position of each group now that it has been stored to inventory.
|
||||||
|
foreach (SceneObjectGroup objectGroup in objlist)
|
||||||
|
objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
|
||||||
|
|
||||||
// Get the user info of the item destination
|
// Get the user info of the item destination
|
||||||
//
|
//
|
||||||
|
@ -332,7 +293,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
{
|
{
|
||||||
// All returns / deletes go to the object owner
|
// All returns / deletes go to the object owner
|
||||||
//
|
//
|
||||||
|
|
||||||
userID = objlist[0].RootPart.OwnerID;
|
userID = objlist[0].RootPart.OwnerID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -548,7 +508,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
return assetID;
|
return assetID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Rez an object into the scene from the user's inventory
|
/// Rez an object into the scene from the user's inventory
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -659,9 +618,18 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
itemId, n.OuterXml);
|
itemId, n.OuterXml);
|
||||||
objlist.Add(g);
|
objlist.Add(g);
|
||||||
XmlElement el = (XmlElement)n;
|
XmlElement el = (XmlElement)n;
|
||||||
float x = Convert.ToSingle(el.GetAttribute("offsetx"));
|
|
||||||
float y = Convert.ToSingle(el.GetAttribute("offsety"));
|
string rawX = el.GetAttribute("offsetx");
|
||||||
float z = Convert.ToSingle(el.GetAttribute("offsetz"));
|
string rawY = el.GetAttribute("offsety");
|
||||||
|
string rawZ = el.GetAttribute("offsetz");
|
||||||
|
//
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[INVENTORY ACCESS MODULE]: Converting coalesced object {0} offset <{1}, {2}, {3}>",
|
||||||
|
// g.Name, rawX, rawY, rawZ);
|
||||||
|
|
||||||
|
float x = Convert.ToSingle(rawX);
|
||||||
|
float y = Convert.ToSingle(rawY);
|
||||||
|
float z = Convert.ToSingle(rawZ);
|
||||||
veclist.Add(new Vector3(x, y, z));
|
veclist.Add(new Vector3(x, y, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -753,10 +721,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
// affect the name stored in the serialization, transfer
|
// affect the name stored in the serialization, transfer
|
||||||
// the correct name from the inventory to the
|
// the correct name from the inventory to the
|
||||||
// object itself before we rez.
|
// object itself before we rez.
|
||||||
|
//
|
||||||
|
// Only do these for the first object if we are rezzing a coalescence.
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
rootPart.Name = item.Name;
|
rootPart.Name = item.Name;
|
||||||
rootPart.Description = item.Description;
|
rootPart.Description = item.Description;
|
||||||
rootPart.ObjectSaleType = item.SaleType;
|
rootPart.ObjectSaleType = item.SaleType;
|
||||||
rootPart.SalePrice = item.SalePrice;
|
rootPart.SalePrice = item.SalePrice;
|
||||||
|
}
|
||||||
|
|
||||||
group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
|
group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
|
||||||
if ((rootPart.OwnerID != item.Owner) ||
|
if ((rootPart.OwnerID != item.Owner) ||
|
||||||
|
|
|
@ -0,0 +1,220 @@
|
||||||
|
/*
|
||||||
|
* 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.Threading;
|
||||||
|
using Nini.Config;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Data;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Serialization;
|
||||||
|
using OpenSim.Framework.Serialization.External;
|
||||||
|
using OpenSim.Framework.Communications;
|
||||||
|
using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver;
|
||||||
|
using OpenSim.Region.CoreModules.Framework.InventoryAccess;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
using OpenSim.Tests.Common.Setup;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.Framework.InventoryAccess.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class InventoryAccessModuleTests
|
||||||
|
{
|
||||||
|
protected TestScene m_scene;
|
||||||
|
protected BasicInventoryAccessModule m_iam;
|
||||||
|
protected UUID m_userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
|
||||||
|
protected TestClient m_tc;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
m_iam = new BasicInventoryAccessModule();
|
||||||
|
|
||||||
|
IConfigSource config = new IniConfigSource();
|
||||||
|
config.AddConfig("Modules");
|
||||||
|
config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule");
|
||||||
|
|
||||||
|
m_scene = SceneSetupHelpers.SetupScene("Inventory");
|
||||||
|
SceneSetupHelpers.SetupSceneModules(m_scene, config, m_iam);
|
||||||
|
|
||||||
|
// Create user
|
||||||
|
string userFirstName = "Jock";
|
||||||
|
string userLastName = "Stirrup";
|
||||||
|
string userPassword = "troll";
|
||||||
|
UserProfileTestUtils.CreateUserWithInventory(m_scene, userFirstName, userLastName, m_userId, userPassword);
|
||||||
|
|
||||||
|
AgentCircuitData acd = new AgentCircuitData();
|
||||||
|
acd.AgentID = m_userId;
|
||||||
|
m_tc = new TestClient(acd, m_scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestRezCoalescedObject()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
// Create asset
|
||||||
|
SceneObjectGroup object1;
|
||||||
|
{
|
||||||
|
string partName = "Object1";
|
||||||
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
||||||
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
||||||
|
Vector3 groupPosition = new Vector3(10, 20, 30);
|
||||||
|
Quaternion rotationOffset = Quaternion.Identity;
|
||||||
|
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
||||||
|
|
||||||
|
SceneObjectPart part1
|
||||||
|
= new SceneObjectPart(
|
||||||
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
||||||
|
part1.Scale = new Vector3(1, 1, 1);
|
||||||
|
part1.Name = partName;
|
||||||
|
|
||||||
|
object1 = new SceneObjectGroup(part1);
|
||||||
|
}
|
||||||
|
|
||||||
|
SceneObjectGroup object2;
|
||||||
|
{
|
||||||
|
string partName = "Object2";
|
||||||
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
||||||
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
||||||
|
Vector3 groupPosition = new Vector3(20, 40, 60);
|
||||||
|
Quaternion rotationOffset = Quaternion.Identity;
|
||||||
|
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
||||||
|
|
||||||
|
SceneObjectPart part1
|
||||||
|
= new SceneObjectPart(
|
||||||
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
||||||
|
part1.Scale = new Vector3(1, 1, 1);
|
||||||
|
part1.Name = partName;
|
||||||
|
|
||||||
|
object2 = new SceneObjectGroup(part1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CoalescedSceneObjects coa = new CoalescedSceneObjects(m_userId, object1, object2);
|
||||||
|
|
||||||
|
UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
||||||
|
AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, coa);
|
||||||
|
m_scene.AssetService.Store(asset1);
|
||||||
|
|
||||||
|
// Create item
|
||||||
|
UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
|
||||||
|
string item1Name = "My Little Dog";
|
||||||
|
InventoryItemBase item1 = new InventoryItemBase();
|
||||||
|
item1.Name = item1Name;
|
||||||
|
item1.AssetID = asset1.FullID;
|
||||||
|
item1.ID = item1Id;
|
||||||
|
InventoryFolderBase objsFolder
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(m_scene.InventoryService, m_userId, "Objects")[0];
|
||||||
|
item1.Folder = objsFolder.ID;
|
||||||
|
m_scene.AddInventoryItem(item1);
|
||||||
|
|
||||||
|
SceneObjectGroup so
|
||||||
|
= m_iam.RezObject(
|
||||||
|
m_tc, item1Id, new Vector3(100, 100, 100), Vector3.Zero, UUID.Zero, 1, false, false, false, UUID.Zero, false);
|
||||||
|
|
||||||
|
Assert.That(so, Is.Not.Null);
|
||||||
|
|
||||||
|
Assert.That(m_scene.SceneGraph.GetTotalObjectsCount(), Is.EqualTo(2));
|
||||||
|
|
||||||
|
SceneObjectPart retrievedObj1Part = m_scene.GetSceneObjectPart(object1.Name);
|
||||||
|
Assert.That(retrievedObj1Part, Is.Null);
|
||||||
|
|
||||||
|
retrievedObj1Part = m_scene.GetSceneObjectPart(item1.Name);
|
||||||
|
Assert.That(retrievedObj1Part, Is.Not.Null);
|
||||||
|
Assert.That(retrievedObj1Part.Name, Is.EqualTo(item1.Name));
|
||||||
|
|
||||||
|
// Bottom of coalescence is placed on ground, hence we end up with 100.5 rather than 85 since the bottom
|
||||||
|
// object is unit square.
|
||||||
|
Assert.That(retrievedObj1Part.AbsolutePosition, Is.EqualTo(new Vector3(95, 90, 100.5f)));
|
||||||
|
|
||||||
|
SceneObjectPart retrievedObj2Part = m_scene.GetSceneObjectPart(object2.Name);
|
||||||
|
Assert.That(retrievedObj2Part, Is.Not.Null);
|
||||||
|
Assert.That(retrievedObj2Part.Name, Is.EqualTo(object2.Name));
|
||||||
|
Assert.That(retrievedObj2Part.AbsolutePosition, Is.EqualTo(new Vector3(105, 110, 130.5f)));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestRezObject()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
// Create asset
|
||||||
|
SceneObjectGroup object1;
|
||||||
|
SceneObjectPart part1;
|
||||||
|
{
|
||||||
|
string partName = "My Little Dog Object";
|
||||||
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
||||||
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
||||||
|
Vector3 groupPosition = new Vector3(10, 20, 30);
|
||||||
|
Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
|
||||||
|
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
||||||
|
|
||||||
|
part1
|
||||||
|
= new SceneObjectPart(
|
||||||
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
||||||
|
part1.Name = partName;
|
||||||
|
|
||||||
|
object1 = new SceneObjectGroup(part1);
|
||||||
|
}
|
||||||
|
|
||||||
|
UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
||||||
|
AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
|
||||||
|
m_scene.AssetService.Store(asset1);
|
||||||
|
|
||||||
|
// Create item
|
||||||
|
UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
|
||||||
|
string item1Name = "My Little Dog";
|
||||||
|
InventoryItemBase item1 = new InventoryItemBase();
|
||||||
|
item1.Name = item1Name;
|
||||||
|
item1.AssetID = asset1.FullID;
|
||||||
|
item1.ID = item1Id;
|
||||||
|
InventoryFolderBase objsFolder
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(m_scene.InventoryService, m_userId, "Objects")[0];
|
||||||
|
item1.Folder = objsFolder.ID;
|
||||||
|
m_scene.AddInventoryItem(item1);
|
||||||
|
|
||||||
|
SceneObjectGroup so
|
||||||
|
= m_iam.RezObject(
|
||||||
|
m_tc, item1Id, Vector3.Zero, Vector3.Zero, UUID.Zero, 1, false, false, false, UUID.Zero, false);
|
||||||
|
|
||||||
|
Assert.That(so, Is.Not.Null);
|
||||||
|
|
||||||
|
SceneObjectPart retrievedPart = m_scene.GetSceneObjectPart(so.UUID);
|
||||||
|
Assert.That(retrievedPart, Is.Not.Null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -31,9 +31,8 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenSim.Server.Handlers.Base;
|
using OpenSim.Server.Handlers.Base;
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Collections.Generic;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -259,6 +259,10 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||||
|
|
||||||
private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID)
|
private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[ESTATE MANAGEMENT MODULE]: Handling request from {0} to change estate covenant to {1}",
|
||||||
|
// remoteClient.Name, estateCovenantID);
|
||||||
|
|
||||||
Scene.RegionInfo.RegionSettings.Covenant = estateCovenantID;
|
Scene.RegionInfo.RegionSettings.Covenant = estateCovenantID;
|
||||||
Scene.RegionInfo.RegionSettings.Save();
|
Scene.RegionInfo.RegionSettings.Save();
|
||||||
TriggerRegionInfoChange();
|
TriggerRegionInfoChange();
|
||||||
|
|
|
@ -124,6 +124,52 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
colours.Save(stream, ImageFormat.Png);
|
colours.Save(stream, ImageFormat.Png);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
|
||||||
|
{
|
||||||
|
// We need to do this because:
|
||||||
|
// "Saving the image to the same file it was constructed from is not allowed and throws an exception."
|
||||||
|
string tempName = offsetX + "_ " + offsetY + "_" + filename;
|
||||||
|
|
||||||
|
Bitmap entireBitmap = null;
|
||||||
|
Bitmap thisBitmap = null;
|
||||||
|
if (File.Exists(filename))
|
||||||
|
{
|
||||||
|
File.Copy(filename, tempName);
|
||||||
|
entireBitmap = new Bitmap(tempName);
|
||||||
|
if (entireBitmap.Width != fileWidth * regionSizeX || entireBitmap.Height != fileHeight * regionSizeY)
|
||||||
|
{
|
||||||
|
// old file, let's overwrite it
|
||||||
|
entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
|
||||||
|
}
|
||||||
|
|
||||||
|
thisBitmap = CreateGrayscaleBitmapFromMap(m_channel);
|
||||||
|
Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY);
|
||||||
|
for (int x = 0; x < regionSizeX; x++)
|
||||||
|
for (int y = 0; y < regionSizeY; y++)
|
||||||
|
entireBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y));
|
||||||
|
|
||||||
|
Save(entireBitmap, filename);
|
||||||
|
thisBitmap.Dispose();
|
||||||
|
entireBitmap.Dispose();
|
||||||
|
|
||||||
|
if (File.Exists(tempName))
|
||||||
|
File.Delete(tempName);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Save(Bitmap bmp, string filename)
|
||||||
|
{
|
||||||
|
bmp.Save(filename, ImageFormat.Png);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -76,6 +76,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
colours.Save(stream, ImageFormat.Jpeg);
|
colours.Save(stream, ImageFormat.Jpeg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -240,6 +240,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
get { return ".raw"; }
|
get { return ".raw"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -160,6 +160,13 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bs.Close();
|
bs.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -308,6 +308,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
get { return ".ter"; }
|
get { return ".ter"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -38,5 +38,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
ITerrainChannel LoadStream(Stream stream);
|
ITerrainChannel LoadStream(Stream stream);
|
||||||
void SaveFile(string filename, ITerrainChannel map);
|
void SaveFile(string filename, ITerrainChannel map);
|
||||||
void SaveStream(Stream stream, ITerrainChannel map);
|
void SaveStream(Stream stream, ITerrainChannel map);
|
||||||
|
void SaveFile(ITerrainChannel map, string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int regionSizeX, int regionSizeY);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -540,6 +540,39 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Saves the terrain to a larger terrain file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename">The terrain file to save</param>
|
||||||
|
/// <param name="fileWidth">The width of the file in units</param>
|
||||||
|
/// <param name="fileHeight">The height of the file in units</param>
|
||||||
|
/// <param name="fileStartX">Where to begin our slice</param>
|
||||||
|
/// <param name="fileStartY">Where to begin our slice</param>
|
||||||
|
public void SaveToFile(string filename, int fileWidth, int fileHeight, int fileStartX, int fileStartY)
|
||||||
|
{
|
||||||
|
int offsetX = (int)m_scene.RegionInfo.RegionLocX - fileStartX;
|
||||||
|
int offsetY = (int)m_scene.RegionInfo.RegionLocY - fileStartY;
|
||||||
|
|
||||||
|
if (offsetX >= 0 && offsetX < fileWidth && offsetY >= 0 && offsetY < fileHeight)
|
||||||
|
{
|
||||||
|
// this region is included in the tile request
|
||||||
|
foreach (KeyValuePair<string, ITerrainLoader> loader in m_loaders)
|
||||||
|
{
|
||||||
|
if (filename.EndsWith(loader.Key))
|
||||||
|
{
|
||||||
|
lock (m_scene)
|
||||||
|
{
|
||||||
|
loader.Value.SaveFile(m_channel, filename, offsetX, offsetY,
|
||||||
|
fileWidth, fileHeight,
|
||||||
|
(int)Constants.RegionSize,
|
||||||
|
(int)Constants.RegionSize);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs updates to the region periodically, synchronising physics and other heightmap aware sections
|
/// Performs updates to the region periodically, synchronising physics and other heightmap aware sections
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -860,6 +893,15 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
SaveToFile((string) args[0]);
|
SaveToFile((string) args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void InterfaceSaveTileFile(Object[] args)
|
||||||
|
{
|
||||||
|
SaveToFile((string)args[0],
|
||||||
|
(int)args[1],
|
||||||
|
(int)args[2],
|
||||||
|
(int)args[3],
|
||||||
|
(int)args[4]);
|
||||||
|
}
|
||||||
|
|
||||||
private void InterfaceBakeTerrain(Object[] args)
|
private void InterfaceBakeTerrain(Object[] args)
|
||||||
{
|
{
|
||||||
UpdateRevertMap();
|
UpdateRevertMap();
|
||||||
|
@ -1115,6 +1157,17 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
loadFromTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file",
|
loadFromTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file",
|
||||||
"Integer");
|
"Integer");
|
||||||
|
|
||||||
|
Command saveToTileCommand =
|
||||||
|
new Command("save-tile", CommandIntentions.COMMAND_HAZARDOUS, InterfaceSaveTileFile, "Saves the current heightmap to the larger file.");
|
||||||
|
saveToTileCommand.AddArgument("filename",
|
||||||
|
"The file you wish to save to, the file extension determines the loader to be used. Supported extensions include: " +
|
||||||
|
supportedFileExtensions, "String");
|
||||||
|
saveToTileCommand.AddArgument("file width", "The width of the file in tiles", "Integer");
|
||||||
|
saveToTileCommand.AddArgument("file height", "The height of the file in tiles", "Integer");
|
||||||
|
saveToTileCommand.AddArgument("minimum X tile", "The X region coordinate of the first section on the file",
|
||||||
|
"Integer");
|
||||||
|
saveToTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file",
|
||||||
|
"Integer");
|
||||||
// Terrain adjustments
|
// Terrain adjustments
|
||||||
Command fillRegionCommand =
|
Command fillRegionCommand =
|
||||||
new Command("fill", CommandIntentions.COMMAND_HAZARDOUS, InterfaceFillTerrain, "Fills the current heightmap with a specified value.");
|
new Command("fill", CommandIntentions.COMMAND_HAZARDOUS, InterfaceFillTerrain, "Fills the current heightmap with a specified value.");
|
||||||
|
@ -1166,6 +1219,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
m_commander.RegisterCommand("load", loadFromFileCommand);
|
m_commander.RegisterCommand("load", loadFromFileCommand);
|
||||||
m_commander.RegisterCommand("load-tile", loadFromTileCommand);
|
m_commander.RegisterCommand("load-tile", loadFromTileCommand);
|
||||||
m_commander.RegisterCommand("save", saveToFileCommand);
|
m_commander.RegisterCommand("save", saveToFileCommand);
|
||||||
|
m_commander.RegisterCommand("save-tile", saveToTileCommand);
|
||||||
m_commander.RegisterCommand("fill", fillRegionCommand);
|
m_commander.RegisterCommand("fill", fillRegionCommand);
|
||||||
m_commander.RegisterCommand("elevate", elevateCommand);
|
m_commander.RegisterCommand("elevate", elevateCommand);
|
||||||
m_commander.RegisterCommand("lower", lowerCommand);
|
m_commander.RegisterCommand("lower", lowerCommand);
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
* 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.Linq;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Framework.Scenes
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a coalescene of scene objects. A coalescence occurs when objects that are not in the same linkset
|
||||||
|
/// are grouped together.
|
||||||
|
/// </summary>
|
||||||
|
public class CoalescedSceneObjects
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The creator of this coalesence, though not necessarily the objects within it.
|
||||||
|
/// </summary>
|
||||||
|
public UUID CreatorId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The number of objects in this coalesence
|
||||||
|
/// </summary>
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (m_memberObjects)
|
||||||
|
return m_memberObjects.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Does this coalesence have any member objects?
|
||||||
|
/// </summary>
|
||||||
|
public bool HasObjects { get { return Count > 0; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the objects currently in this coalescence
|
||||||
|
/// </summary>
|
||||||
|
public List<SceneObjectGroup> Objects
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (m_memberObjects)
|
||||||
|
return new List<SceneObjectGroup>(m_memberObjects);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the scene that contains the objects in this coalescence. If there are no objects then null is returned.
|
||||||
|
/// </summary>
|
||||||
|
public Scene Scene
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!HasObjects)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return Objects[0].Scene;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// At this point, we need to preserve the order of objects added to the coalescence, since the first
|
||||||
|
/// one will end up matching the item name when rerezzed.
|
||||||
|
/// </summary>
|
||||||
|
protected List<SceneObjectGroup> m_memberObjects = new List<SceneObjectGroup>();
|
||||||
|
|
||||||
|
public CoalescedSceneObjects(UUID creatorId)
|
||||||
|
{
|
||||||
|
CreatorId = creatorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoalescedSceneObjects(UUID creatorId, params SceneObjectGroup[] objs) : this(creatorId)
|
||||||
|
{
|
||||||
|
foreach (SceneObjectGroup obj in objs)
|
||||||
|
Add(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add an object to the coalescence.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj"></param>
|
||||||
|
/// <param name="offset">The offset of the object within the group</param>
|
||||||
|
public void Add(SceneObjectGroup obj)
|
||||||
|
{
|
||||||
|
lock (m_memberObjects)
|
||||||
|
m_memberObjects.Add(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes a scene object from the coalescene
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sceneObjectId"></param>
|
||||||
|
/// <returns>true if the object was there to be removed, false if not.</returns>
|
||||||
|
public bool Remove(SceneObjectGroup obj)
|
||||||
|
{
|
||||||
|
lock (m_memberObjects)
|
||||||
|
return m_memberObjects.Remove(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the total size of the coalescence (the size required to cover all the objects within it) and the
|
||||||
|
/// offsets of each of those objects.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="size"></param>
|
||||||
|
/// <returns>
|
||||||
|
/// An array of offsets. The order of objects is the same as returned from the Objects property
|
||||||
|
/// </returns>
|
||||||
|
public Vector3[] GetSizeAndOffsets(out Vector3 size)
|
||||||
|
{
|
||||||
|
float minX, minY, minZ;
|
||||||
|
float maxX, maxY, maxZ;
|
||||||
|
|
||||||
|
Vector3[] offsets
|
||||||
|
= Scene.GetCombinedBoundingBox(
|
||||||
|
Objects, out minX, out maxX, out minY, out maxY, out minZ, out maxZ);
|
||||||
|
|
||||||
|
float sizeX = maxX - minX;
|
||||||
|
float sizeY = maxY - minY;
|
||||||
|
float sizeZ = maxZ - minZ;
|
||||||
|
|
||||||
|
size = new Vector3(sizeX, sizeY, sizeZ);
|
||||||
|
|
||||||
|
return offsets;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4839,7 +4839,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector3[] GetCombinedBoundingBox(List<SceneObjectGroup> objects, out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ)
|
/// <summary>
|
||||||
|
/// Get the volume of space that will encompass all the given objects.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="objects"></param>
|
||||||
|
/// <param name="minX"></param>
|
||||||
|
/// <param name="maxX"></param>
|
||||||
|
/// <param name="minY"></param>
|
||||||
|
/// <param name="maxY"></param>
|
||||||
|
/// <param name="minZ"></param>
|
||||||
|
/// <param name="maxZ"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static Vector3[] GetCombinedBoundingBox(
|
||||||
|
List<SceneObjectGroup> objects,
|
||||||
|
out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ)
|
||||||
{
|
{
|
||||||
minX = 256;
|
minX = 256;
|
||||||
maxX = -256;
|
maxX = -256;
|
||||||
|
@ -4858,6 +4871,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
g.GetAxisAlignedBoundingBoxRaw(out ominX, out omaxX, out ominY, out omaxY, out ominZ, out omaxZ);
|
g.GetAxisAlignedBoundingBoxRaw(out ominX, out omaxX, out ominY, out omaxY, out ominZ, out omaxZ);
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[SCENE]: For {0} found AxisAlignedBoundingBoxRaw {1}, {2}",
|
||||||
|
// g.Name, new Vector3(ominX, ominY, ominZ), new Vector3(omaxX, omaxY, omaxZ));
|
||||||
|
|
||||||
ominX += vec.X;
|
ominX += vec.X;
|
||||||
omaxX += vec.X;
|
omaxX += vec.X;
|
||||||
ominY += vec.Y;
|
ominY += vec.Y;
|
||||||
|
|
|
@ -997,6 +997,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
foreach (SceneObjectPart p in ((SceneObjectGroup)entity).Parts)
|
foreach (SceneObjectPart p in ((SceneObjectGroup)entity).Parts)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[SCENE GRAPH]: Part {0} has name {1}", p.UUID, p.Name);
|
||||||
|
|
||||||
if (p.Name == name)
|
if (p.Name == name)
|
||||||
{
|
{
|
||||||
sop = p;
|
sop = p;
|
||||||
|
|
|
@ -2080,7 +2080,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
axPos *= parentRot;
|
axPos *= parentRot;
|
||||||
Vector3 translationOffsetPosition = axPos;
|
Vector3 translationOffsetPosition = axPos;
|
||||||
return GroupPosition + translationOffsetPosition;
|
|
||||||
|
// m_log.DebugFormat("[SCENE OBJECT PART]: Found group pos {0} for part {1}", GroupPosition, Name);
|
||||||
|
|
||||||
|
Vector3 worldPos = GroupPosition + translationOffsetPosition;
|
||||||
|
|
||||||
|
// m_log.DebugFormat("[SCENE OBJECT PART]: Found world pos {0} for part {1}", worldPos, Name);
|
||||||
|
|
||||||
|
return worldPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* 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.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Xml;
|
||||||
|
using log4net;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Serialize and deserialize coalesced scene objects.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Deserialization not yet here.
|
||||||
|
/// </remarks>
|
||||||
|
public class CoalescedSceneObjectsSerializer
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Serialize coalesced objects to Xml
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="coa"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string ToXml(CoalescedSceneObjects coa)
|
||||||
|
{
|
||||||
|
// TODO: Should probably return an empty xml serialization rather than a blank string
|
||||||
|
if (!coa.HasObjects)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
using (StringWriter sw = new StringWriter())
|
||||||
|
{
|
||||||
|
using (XmlTextWriter writer = new XmlTextWriter(sw))
|
||||||
|
{
|
||||||
|
Vector3 size;
|
||||||
|
|
||||||
|
List<SceneObjectGroup> coaObjects = coa.Objects;
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[COALESCED SCENE OBJECTS SERIALIZER]: Writing {0} objects for coalesced object",
|
||||||
|
// coaObjects.Count);
|
||||||
|
|
||||||
|
// This is weak - we're relying on the set of coalesced objects still being identical
|
||||||
|
Vector3[] offsets = coa.GetSizeAndOffsets(out size);
|
||||||
|
|
||||||
|
writer.WriteStartElement("CoalescedObject");
|
||||||
|
|
||||||
|
writer.WriteAttributeString("x", size.X.ToString());
|
||||||
|
writer.WriteAttributeString("y", size.Y.ToString());
|
||||||
|
writer.WriteAttributeString("z", size.Z.ToString());
|
||||||
|
|
||||||
|
// Embed the offsets into the group XML
|
||||||
|
for (int i = 0; i < coaObjects.Count; i++)
|
||||||
|
{
|
||||||
|
SceneObjectGroup obj = coaObjects[i];
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[COALESCED SCENE OBJECTS SERIALIZER]: Writing offset for object {0}, {1}",
|
||||||
|
// i, obj.Name);
|
||||||
|
|
||||||
|
writer.WriteStartElement("SceneObjectGroup");
|
||||||
|
writer.WriteAttributeString("offsetx", offsets[i].X.ToString());
|
||||||
|
writer.WriteAttributeString("offsety", offsets[i].Y.ToString());
|
||||||
|
writer.WriteAttributeString("offsetz", offsets[i].Z.ToString());
|
||||||
|
|
||||||
|
SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, true);
|
||||||
|
|
||||||
|
writer.WriteEndElement(); // SceneObjectGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WriteEndElement(); // CoalescedObject
|
||||||
|
}
|
||||||
|
|
||||||
|
string output = sw.ToString();
|
||||||
|
|
||||||
|
// m_log.Debug(output);
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -140,17 +140,32 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Serialize a scene object to the original xml format
|
/// Serialize a scene object to the original xml format
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sceneObject"></param>
|
/// <param name="sceneObject"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static void ToOriginalXmlFormat(SceneObjectGroup sceneObject, XmlTextWriter writer)
|
public static void ToOriginalXmlFormat(SceneObjectGroup sceneObject, XmlTextWriter writer)
|
||||||
|
{
|
||||||
|
ToOriginalXmlFormat(sceneObject, writer, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Serialize a scene object to the original xml format
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sceneObject"></param>
|
||||||
|
/// <param name="writer"></param>
|
||||||
|
/// <param name="noRootElement">If false, don't write the enclosing SceneObjectGroup element</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static void ToOriginalXmlFormat(SceneObjectGroup sceneObject, XmlTextWriter writer, bool noRootElement)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[SERIALIZER]: Starting serialization of {0}", Name);
|
//m_log.DebugFormat("[SERIALIZER]: Starting serialization of {0}", Name);
|
||||||
//int time = System.Environment.TickCount;
|
//int time = System.Environment.TickCount;
|
||||||
|
|
||||||
|
if (!noRootElement)
|
||||||
writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty);
|
writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty);
|
||||||
|
|
||||||
writer.WriteStartElement(String.Empty, "RootPart", String.Empty);
|
writer.WriteStartElement(String.Empty, "RootPart", String.Empty);
|
||||||
ToXmlFormat(sceneObject.RootPart, writer);
|
ToXmlFormat(sceneObject.RootPart, writer);
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
|
@ -170,6 +185,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
|
|
||||||
writer.WriteEndElement(); // OtherParts
|
writer.WriteEndElement(); // OtherParts
|
||||||
sceneObject.SaveScriptedState(writer);
|
sceneObject.SaveScriptedState(writer);
|
||||||
|
|
||||||
|
if (!noRootElement)
|
||||||
writer.WriteEndElement(); // SceneObjectGroup
|
writer.WriteEndElement(); // SceneObjectGroup
|
||||||
|
|
||||||
//m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time);
|
//m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time);
|
||||||
|
@ -1318,7 +1335,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
writer.WriteStartElement("SculptData");
|
writer.WriteStartElement("SculptData");
|
||||||
byte[] sd;
|
byte[] sd;
|
||||||
if (shp.SculptData != null)
|
if (shp.SculptData != null)
|
||||||
sd = shp.ExtraParams;
|
sd = shp.SculptData;
|
||||||
else
|
else
|
||||||
sd = Utils.EmptyBytes;
|
sd = Utils.EmptyBytes;
|
||||||
writer.WriteBase64(sd, 0, sd.Length);
|
writer.WriteBase64(sd, 0, sd.Length);
|
||||||
|
|
|
@ -648,6 +648,9 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
|
||||||
if (pbs.ProfileHollow != 0)
|
if (pbs.ProfileHollow != 0)
|
||||||
iPropertiesNotSupportedDefault++;
|
iPropertiesNotSupportedDefault++;
|
||||||
|
|
||||||
|
if ((pbs.PathBegin != 0) || pbs.PathEnd != 0)
|
||||||
|
iPropertiesNotSupportedDefault++;
|
||||||
|
|
||||||
if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0))
|
if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0))
|
||||||
iPropertiesNotSupportedDefault++;
|
iPropertiesNotSupportedDefault++;
|
||||||
|
|
||||||
|
|
|
@ -2528,6 +2528,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (pbs.ProfileHollow != 0)
|
if (pbs.ProfileHollow != 0)
|
||||||
iPropertiesNotSupportedDefault++;
|
iPropertiesNotSupportedDefault++;
|
||||||
|
|
||||||
|
if ((pbs.PathBegin != 0) || pbs.PathEnd != 0)
|
||||||
|
iPropertiesNotSupportedDefault++;
|
||||||
|
|
||||||
if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0))
|
if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0))
|
||||||
iPropertiesNotSupportedDefault++;
|
iPropertiesNotSupportedDefault++;
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Console;
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||||
using IAvatarService = OpenSim.Services.Interfaces.IAvatarService;
|
using IAvatarService = OpenSim.Services.Interfaces.IAvatarService;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
|
using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -32,7 +32,7 @@ using System.Reflection;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
using OpenSim.Framework;
|
||||||
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -34,7 +34,6 @@ using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Console;
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
|
@ -34,7 +34,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using Nwc.XmlRpc;
|
using Nwc.XmlRpc;
|
||||||
|
|
|
@ -36,7 +36,6 @@ using System.Text;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
|
|
|
@ -33,7 +33,6 @@ using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
|
@ -72,6 +72,21 @@ namespace OpenSim.Tests.Common
|
||||||
sog.OwnerID);
|
sog.OwnerID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an asset from the given scene object.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assetUuid"></param>
|
||||||
|
/// <param name="coa"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static AssetBase CreateAsset(UUID assetUuid, CoalescedSceneObjects coa)
|
||||||
|
{
|
||||||
|
return CreateAsset(
|
||||||
|
assetUuid,
|
||||||
|
AssetType.Object,
|
||||||
|
Encoding.ASCII.GetBytes(CoalescedSceneObjectsSerializer.ToXml(coa)),
|
||||||
|
coa.CreatorId);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create an asset from the given data.
|
/// Create an asset from the given data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -931,7 +931,6 @@
|
||||||
<Reference name="OpenSim.Framework"/>
|
<Reference name="OpenSim.Framework"/>
|
||||||
<Reference name="OpenSim.Framework.Communications"/>
|
<Reference name="OpenSim.Framework.Communications"/>
|
||||||
<Reference name="OpenSim.Framework.Console"/>
|
<Reference name="OpenSim.Framework.Console"/>
|
||||||
<Reference name="OpenSim.Framework.Servers.HttpServer"/>
|
|
||||||
<Reference name="OpenSim.Region.Framework"/>
|
<Reference name="OpenSim.Region.Framework"/>
|
||||||
<Reference name="OpenSim.Server.Base"/>
|
<Reference name="OpenSim.Server.Base"/>
|
||||||
<Reference name="OpenSim.Services.Base"/>
|
<Reference name="OpenSim.Services.Base"/>
|
||||||
|
@ -2889,6 +2888,7 @@
|
||||||
<!-- SADLY the way this works means you need to keep adding these paths -->
|
<!-- SADLY the way this works means you need to keep adding these paths -->
|
||||||
<Match path="Agent/TextureSender/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Agent/TextureSender/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
<Match path="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match buildAction="EmbeddedResource" path="World/Archiver/Tests/Resources" pattern="*"/>
|
<Match buildAction="EmbeddedResource" path="World/Archiver/Tests/Resources" pattern="*"/>
|
||||||
<Match path="World/Land/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="World/Land/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
|
Loading…
Reference in New Issue