Compare commits
78 Commits
Author | SHA1 | Date |
---|---|---|
Justin Clark-Casey (justincc) | 9439a92202 | |
Justin Clark-Casey (justincc) | ac7537d240 | |
Justin Clark-Casey (justincc) | b8c056cb39 | |
Justin Clark-Casey (justincc) | f71a5431c9 | |
Justin Clark-Casey (justincc) | a81b3e4b41 | |
Justin Clark-Casey (justincc) | 3d76f133ea | |
Justin Clark-Casey (justincc) | 43ce18c1fc | |
Justin Clark-Casey (justincc) | ec9eccf900 | |
Makopoppo | 760d888eeb | |
Chris Hart | 46040e761a | |
Justin Clark-Casey (justincc) | 7d4b340ed0 | |
Diva Canto | c616735a6d | |
Diva Canto | d97e69ab9f | |
Diva Canto | 5dfc62644b | |
Diva Canto | e5eb4c47e0 | |
Justin Clark-Casey (justincc) | 33831f74b9 | |
Justin Clark-Casey (justincc) | c475ee1267 | |
Justin Clark-Casey (justincc) | 6419544948 | |
Justin Clark-Casey (justincc) | 951ede7626 | |
Justin Clark-Casey (justincc) | b25cb04b34 | |
Justin Clark-Casey (justincc) | 85bad46365 | |
Justin Clark-Casey (justincc) | b60ce71b2c | |
Justin Clark-Casey (justincc) | 3738aff608 | |
Justin Clark-Casey (justincc) | 8e24968362 | |
Justin Clark-Casey (justincc) | 472f7844f5 | |
Justin Clark-Casey (justincc) | d2aea3ef59 | |
Justin Clark-Casey (justincc) | 3957a09a55 | |
Justin Clark-Casey (justincc) | 3bea263a99 | |
Justin Clark-Casey (justincc) | c71253bdf1 | |
Oren Hurvitz | 9780d1775b | |
SignpostMarv Martin | 38e6571a1b | |
Diva Canto | e89b77423f | |
Diva Canto | d0673d7620 | |
Diva Canto | 009b2275c5 | |
Diva Canto | 8f2c391233 | |
Diva Canto | 5317bfb242 | |
Diva Canto | f8f99f30cf | |
Diva Canto | d9607f904a | |
Diva Canto | 785e4852cc | |
Diva Canto | c45786cb1e | |
Justin Clark-Casey (justincc) | 5d6aefd8ce | |
Diva Canto | 6077c114b6 | |
Diva Canto | af396fafea | |
Justin Clark-Casey (justincc) | accb4499fe | |
Justin Clark-Casey (justincc) | a25d83feea | |
Diva Canto | 8e8fee20ed | |
Dan Lake | a4aa2e274b | |
Diva Canto | 5ee07e01c5 | |
Diva Canto | 6de0da6914 | |
Diva Canto | 729c42f5fa | |
Diva Canto | 60e4c4e3e2 | |
Diva Canto | cd24fe6331 | |
Diva Canto | a7bc187eda | |
Diva Canto | 975cebea0b | |
Justin Clark-Casey (justincc) | 69fb1faa03 | |
Justin Clark-Casey (justincc) | 8f3d2f5f5e | |
Justin Clark-Casey (justincc) | e09f19674e | |
Justin Clark-Casey (justincc) | 3698e431dc | |
Justin Clark-Casey (justincc) | b0bcf0cc99 | |
Justin Clark-Casey (justincc) | 27506175f1 | |
Diva Canto | 87eb46b965 | |
Diva Canto | 7772e1e571 | |
dahlia | 6a3a39b876 | |
Diva Canto | 6498701968 | |
Justin Clark-Casey (justincc) | 191da19bd1 | |
Diva Canto | f7d47bbb1f | |
Diva Canto | 9afb2e3dba | |
Diva Canto | c9f354bf15 | |
Diva Canto | ee3d2cb119 | |
Diva Canto | bc2c55ff5f | |
Justin Clark-Casey (justincc) | 92841ea40b | |
BlueWall | 70e8e8a785 | |
Justin Clark-Casey (justincc) | 09113bb813 | |
Justin Clark-Casey (justincc) | 149d4e48d8 | |
Justin Clark-Casey (justincc) | 7c88821020 | |
Justin Clark-Casey (justincc) | 557769f6e1 | |
Justin Clark-Casey (justincc) | 7b989e8432 | |
Justin Clark-Casey (justincc) | 489e1b11b7 |
|
@ -1,34 +1,36 @@
|
||||||
The following people have contributed to OpenSim (Thank you
|
The following people have contributed to OpenSim (Thank you
|
||||||
for your effort!)
|
for your effort!)
|
||||||
|
|
||||||
Add your name in here if you have committed to OpenSim
|
|
||||||
|
|
||||||
= Current OpenSim Developers (in very rough order of appearance) =
|
= Current OpenSim Developers (in very rough order of appearance) =
|
||||||
These folks represent the current core team for OpenSim, and are the
|
These folks represent the current core team for OpenSim, and are the
|
||||||
people that make the day to day of OpenSim happen.
|
people that make the day to day of OpenSim happen.
|
||||||
|
|
||||||
|
* justincc
|
||||||
|
* chi11ken (Genkii)
|
||||||
|
* dahlia
|
||||||
|
* Melanie Thielker
|
||||||
|
* Diva (Crista Lopes, University of California, Irvine)
|
||||||
|
* Dan Lake (Intel)
|
||||||
|
* Marck
|
||||||
|
* Mic Bowman (Intel)
|
||||||
|
* BlueWall (James Hughes)
|
||||||
|
|
||||||
|
= Core Developers Following the White Rabbit =
|
||||||
|
Core developers who have temporarily (we hope) gone chasing the white rabbit.
|
||||||
|
They are in all similar to the active core developers, except that they haven't
|
||||||
|
been that active lately, so their voting rights are awaiting their come back.
|
||||||
|
|
||||||
* MW (Tribal Media AB)
|
* MW (Tribal Media AB)
|
||||||
* Adam Frisby (DeepThink Pty Ltd)
|
* Adam Frisby (DeepThink Pty Ltd)
|
||||||
* MingChen (DeepThink Pty Ltd)
|
|
||||||
* lbsa71 (Tribal Media AB)
|
* lbsa71 (Tribal Media AB)
|
||||||
* Sean Dague / sdague (IBM)
|
|
||||||
* Tedd
|
|
||||||
* justincc
|
|
||||||
* Teravus (w3z)
|
* Teravus (w3z)
|
||||||
* Johan Berntsson (3Di)
|
|
||||||
* Ckrinke (Charles Krinke)
|
* Ckrinke (Charles Krinke)
|
||||||
* chi11ken (Genkii)
|
|
||||||
* adjohn (Genkii)
|
|
||||||
* Dr Scofield aka Dirk Husemann (IBM Research - Zurich)
|
* Dr Scofield aka Dirk Husemann (IBM Research - Zurich)
|
||||||
* dahlia
|
|
||||||
* mikem (3Di)
|
* mikem (3Di)
|
||||||
* Melanie Thielker
|
|
||||||
* Homer_Horwitz
|
* Homer_Horwitz
|
||||||
* idb (Ian Brown)
|
|
||||||
* Diva (Crista Lopes, University of California, Irvine)
|
|
||||||
* nlin (3Di)
|
* nlin (3Di)
|
||||||
* Arthur Rodrigo S Valadares (IBM)
|
* Arthur Rodrigo S Valadares (IBM)
|
||||||
* BlueWall (James Hughes)
|
* John Hurliman
|
||||||
|
|
||||||
= Past Open Sim Developers =
|
= Past Open Sim Developers =
|
||||||
These folks are alumns of the OpenSim core group, but are now
|
These folks are alumns of the OpenSim core group, but are now
|
||||||
|
@ -44,6 +46,12 @@ where we are today.
|
||||||
* Dalien
|
* Dalien
|
||||||
* Darok
|
* Darok
|
||||||
* Alondria
|
* Alondria
|
||||||
|
* Sean Dague / sdague (IBM)
|
||||||
|
* Tedd
|
||||||
|
* MingChen (DeepThink Pty Ltd)
|
||||||
|
* adjohn (Genkii)
|
||||||
|
* idb (Ian Brown)
|
||||||
|
* Johan Berntsson (3Di)
|
||||||
|
|
||||||
|
|
||||||
= Additional OpenSim Contributors =
|
= Additional OpenSim Contributors =
|
||||||
|
@ -102,6 +110,7 @@ what it is today.
|
||||||
* Misterblue (Intel)
|
* Misterblue (Intel)
|
||||||
* Mircea Kitsune
|
* Mircea Kitsune
|
||||||
* mpallari
|
* mpallari
|
||||||
|
* MrMonkE
|
||||||
* nornalbion
|
* nornalbion
|
||||||
* Omar Vera Ustariz (IBM)
|
* Omar Vera Ustariz (IBM)
|
||||||
* openlifegrid.com
|
* openlifegrid.com
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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.Collections.Generic;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
|
||||||
using System.Timers;
|
|
||||||
using log4net;
|
|
||||||
using MXP;
|
|
||||||
using Nini.Config;
|
|
||||||
using OpenMetaverse;
|
|
||||||
using OpenSim.Client.MXP.PacketHandler;
|
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
|
||||||
|
|
||||||
namespace OpenSim.Client.MXP
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MXP Client Module which adds MXP support to client / region communication.
|
|
||||||
*/
|
|
||||||
public class MXPModule : IRegionModule
|
|
||||||
{
|
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
|
||||||
|
|
||||||
private MXPPacketServer m_server;
|
|
||||||
|
|
||||||
private IConfigSource m_config;
|
|
||||||
private int m_port = 1253;
|
|
||||||
private Timer m_ticker;
|
|
||||||
|
|
||||||
private readonly Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>();
|
|
||||||
private bool m_shutdown;
|
|
||||||
|
|
||||||
public void Initialise(Scene scene, IConfigSource source)
|
|
||||||
{
|
|
||||||
if (!m_scenes.ContainsKey(scene.RegionInfo.RegionID))
|
|
||||||
m_scenes.Add(scene.RegionInfo.RegionID, scene);
|
|
||||||
|
|
||||||
m_config = source;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PostInitialise()
|
|
||||||
{
|
|
||||||
if (m_config.Configs["MXP"] != null)
|
|
||||||
{
|
|
||||||
IConfig con = m_config.Configs["MXP"];
|
|
||||||
|
|
||||||
if (!con.GetBoolean("Enabled", false))
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_port = con.GetInt("Port", m_port);
|
|
||||||
|
|
||||||
m_server = new MXPPacketServer(m_port, m_scenes,m_config.Configs["StandAlone"].GetBoolean("accounts_authenticate",true));
|
|
||||||
|
|
||||||
m_ticker = new Timer(100);
|
|
||||||
m_ticker.AutoReset = false;
|
|
||||||
m_ticker.Elapsed += ticker_Elapsed;
|
|
||||||
|
|
||||||
lock (m_ticker)
|
|
||||||
m_ticker.Start();
|
|
||||||
|
|
||||||
m_log.Info("[MXP ClientStack] MXP Enabled and Listening");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ticker_Elapsed(object sender, ElapsedEventArgs e)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
m_server.Process();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
m_log.Error("[MXP ClientStack]: Unhandled exception in process loop: " + ex.ToString() + " :" + ex.StackTrace.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_shutdown)
|
|
||||||
{
|
|
||||||
lock (m_ticker)
|
|
||||||
m_ticker.Start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Close()
|
|
||||||
{
|
|
||||||
m_shutdown = true;
|
|
||||||
if (m_ticker != null)
|
|
||||||
{
|
|
||||||
lock (m_ticker)
|
|
||||||
m_ticker.Stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name
|
|
||||||
{
|
|
||||||
get { return "MXP ClientStack Module"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsSharedModule
|
|
||||||
{
|
|
||||||
get { return true; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +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.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
using OpenMetaverse;
|
|
||||||
|
|
||||||
namespace OpenSim.Client.MXP
|
|
||||||
{
|
|
||||||
public static class MXPUtil
|
|
||||||
{
|
|
||||||
public static string GenerateMXPURL(string server, int port, UUID bubbleID, Vector3 location)
|
|
||||||
{
|
|
||||||
return string.Format("mxp://{0}:{1}/{2}/{3}", server, port, bubbleID.Guid, location);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,561 +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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* This file borrows heavily from MXPServer.cs - the reference MXPServer
|
|
||||||
* See http://www.bubblecloud.org for a copy of the original file and
|
|
||||||
* implementation details. */
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Threading;
|
|
||||||
using log4net;
|
|
||||||
using MXP;
|
|
||||||
using MXP.Messages;
|
|
||||||
using OpenMetaverse;
|
|
||||||
using OpenSim.Client.MXP.ClientStack;
|
|
||||||
using OpenSim.Framework;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
|
||||||
using OpenSim.Framework.Communications;
|
|
||||||
using OpenSim.Services.Interfaces;
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
|
|
||||||
namespace OpenSim.Client.MXP.PacketHandler
|
|
||||||
{
|
|
||||||
public class MXPPacketServer
|
|
||||||
{
|
|
||||||
internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
|
||||||
|
|
||||||
#region Fields
|
|
||||||
|
|
||||||
private readonly List<MXPClientView> m_clients = new List<MXPClientView>();
|
|
||||||
private readonly Dictionary<UUID, Scene> m_scenes;
|
|
||||||
private readonly Transmitter m_transmitter;
|
|
||||||
|
|
||||||
// private readonly Thread m_clientThread;
|
|
||||||
|
|
||||||
private readonly IList<Session> m_sessions = new List<Session>();
|
|
||||||
private readonly IList<Session> m_sessionsToClient = new List<Session>();
|
|
||||||
private readonly IList<MXPClientView> m_sessionsToRemove = new List<MXPClientView>();
|
|
||||||
|
|
||||||
private readonly int m_port;
|
|
||||||
// private readonly bool m_accountsAuthenticate;
|
|
||||||
|
|
||||||
private readonly String m_programName;
|
|
||||||
private readonly byte m_programMajorVersion;
|
|
||||||
private readonly byte m_programMinorVersion;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Constructors
|
|
||||||
|
|
||||||
public MXPPacketServer(int port, Dictionary<UUID, Scene> scenes, bool accountsAuthenticate)
|
|
||||||
{
|
|
||||||
m_port = port;
|
|
||||||
// m_accountsAuthenticate = accountsAuthenticate;
|
|
||||||
|
|
||||||
m_scenes = scenes;
|
|
||||||
|
|
||||||
m_programMinorVersion = 63;
|
|
||||||
m_programMajorVersion = 0;
|
|
||||||
m_programName = "OpenSimulator";
|
|
||||||
|
|
||||||
m_transmitter = new Transmitter(port);
|
|
||||||
|
|
||||||
StartListener();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void StartListener()
|
|
||||||
{
|
|
||||||
m_log.Info("[MXP ClientStack] Transmitter starting on UDP server port: " + m_port);
|
|
||||||
m_transmitter.Startup();
|
|
||||||
m_log.Info("[MXP ClientStack] Transmitter started. MXP version: "+MxpConstants.ProtocolMajorVersion+"."+MxpConstants.ProtocolMinorVersion+" Source Revision: "+MxpConstants.ProtocolSourceRevision);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Properties
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Number of sessions pending. (Process() accepts pending sessions).
|
|
||||||
/// </summary>
|
|
||||||
public int PendingSessionCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter.PendingSessionCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Number of connected sessions.
|
|
||||||
/// </summary>
|
|
||||||
public int SessionCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_sessions.Count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Property reflecting whether client transmitter threads are alive.
|
|
||||||
/// </summary>
|
|
||||||
public bool IsTransmitterAlive
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter != null && m_transmitter.IsAlive;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Number of packets sent.
|
|
||||||
/// </summary>
|
|
||||||
public ulong PacketsSent
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter != null ? m_transmitter.PacketsSent : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Number of packets received.
|
|
||||||
/// </summary>
|
|
||||||
public ulong PacketsReceived
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter != null ? m_transmitter.PacketsReceived : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Bytes client has received so far.
|
|
||||||
/// </summary>
|
|
||||||
public ulong BytesReceived
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter != null ? m_transmitter.BytesReceived : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Bytes client has sent so far.
|
|
||||||
/// </summary>
|
|
||||||
public ulong BytesSent
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter != null ? m_transmitter.BytesSent : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Number of bytes received (bytes per second) during past second.
|
|
||||||
/// </summary>
|
|
||||||
public double ReceiveRate
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter != null ? m_transmitter.ReceiveRate : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Number of bytes sent (bytes per second) during past second.
|
|
||||||
/// </summary>
|
|
||||||
public double SendRate
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_transmitter != null ? m_transmitter.SendRate : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Session Management
|
|
||||||
|
|
||||||
public void Disconnect(Session session)
|
|
||||||
{
|
|
||||||
if (session.IsConnected)
|
|
||||||
{
|
|
||||||
Message message = MessageFactory.Current.ReserveMessage(typeof(LeaveRequestMessage));
|
|
||||||
session.Send(message);
|
|
||||||
MessageFactory.Current.ReleaseMessage(message);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception("Not connected.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Processing
|
|
||||||
|
|
||||||
public void Process()
|
|
||||||
{
|
|
||||||
ProcessMessages();
|
|
||||||
Clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Clean()
|
|
||||||
{
|
|
||||||
foreach (MXPClientView clientView in m_clients)
|
|
||||||
{
|
|
||||||
if (clientView.Session.SessionState == SessionState.Disconnected)
|
|
||||||
{
|
|
||||||
m_sessionsToRemove.Add(clientView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (MXPClientView clientView in m_sessionsToRemove)
|
|
||||||
{
|
|
||||||
clientView.Scene.RemoveClient(clientView.AgentId);
|
|
||||||
clientView.OnClean();
|
|
||||||
m_clients.Remove(clientView);
|
|
||||||
m_sessions.Remove(clientView.Session);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_sessionsToRemove.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ProcessMessages()
|
|
||||||
{
|
|
||||||
if (m_transmitter.PendingSessionCount > 0)
|
|
||||||
{
|
|
||||||
Session tmp = m_transmitter.AcceptPendingSession();
|
|
||||||
m_sessions.Add(tmp);
|
|
||||||
m_sessionsToClient.Add(tmp);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Session> tmpRemove = new List<Session>();
|
|
||||||
|
|
||||||
foreach (Session session in m_sessionsToClient)
|
|
||||||
{
|
|
||||||
while (session.AvailableMessages > 0)
|
|
||||||
{
|
|
||||||
Message message = session.Receive();
|
|
||||||
|
|
||||||
if (message.GetType() == typeof (JoinRequestMessage))
|
|
||||||
{
|
|
||||||
|
|
||||||
JoinRequestMessage joinRequestMessage = (JoinRequestMessage) message;
|
|
||||||
|
|
||||||
m_log.Info("[MXP ClientStack]: Session join request: " + session.SessionId + " (" +
|
|
||||||
(session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
|
|
||||||
session.RemoteEndPoint.Port + ")");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
|
|
||||||
if (joinRequestMessage.BubbleId == Guid.Empty)
|
|
||||||
{
|
|
||||||
foreach (Scene scene in m_scenes.Values)
|
|
||||||
{
|
|
||||||
if (scene.RegionInfo.RegionName == joinRequestMessage.BubbleName)
|
|
||||||
{
|
|
||||||
m_log.Info("[MXP ClientStack]: Resolved region by name: " + joinRequestMessage.BubbleName + " (" + scene.RegionInfo.RegionID + ")");
|
|
||||||
joinRequestMessage.BubbleId = scene.RegionInfo.RegionID.Guid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (joinRequestMessage.BubbleId == Guid.Empty)
|
|
||||||
{
|
|
||||||
m_log.Warn("[MXP ClientStack]: Failed to resolve region by name: " + joinRequestMessage.BubbleName);
|
|
||||||
}
|
|
||||||
|
|
||||||
UUID sceneId = new UUID(joinRequestMessage.BubbleId);
|
|
||||||
|
|
||||||
bool regionExists = true;
|
|
||||||
if (!m_scenes.ContainsKey(sceneId))
|
|
||||||
{
|
|
||||||
m_log.Info("[MXP ClientStack]: No such region: " + sceneId);
|
|
||||||
regionExists = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
UUID userId = UUID.Zero;
|
|
||||||
UserAccount account = null;
|
|
||||||
bool authorized = regionExists ? AuthoriseUser(joinRequestMessage.ParticipantName,
|
|
||||||
joinRequestMessage.ParticipantPassphrase,
|
|
||||||
new UUID(joinRequestMessage.BubbleId), out account)
|
|
||||||
: false;
|
|
||||||
|
|
||||||
if (authorized)
|
|
||||||
{
|
|
||||||
Scene scene = m_scenes[sceneId];
|
|
||||||
UUID mxpSessionID = UUID.Random();
|
|
||||||
|
|
||||||
string reason;
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Session join request success: " + session.SessionId + " (" +
|
|
||||||
(session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
|
|
||||||
session.RemoteEndPoint.Port + ")");
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Attaching UserAgent to UserProfile...");
|
|
||||||
UUID secureSession = UUID.Zero;
|
|
||||||
AttachUserAgentToUserProfile(account, session, mxpSessionID, sceneId, out secureSession);
|
|
||||||
m_log.Debug("[MXP ClientStack]: Attached UserAgent to UserProfile.");
|
|
||||||
m_log.Debug("[MXP ClientStack]: Preparing Scene to Connection...");
|
|
||||||
if (!PrepareSceneForConnection(mxpSessionID, secureSession, sceneId, account, out reason))
|
|
||||||
{
|
|
||||||
m_log.DebugFormat("[MXP ClientStack]: Scene refused connection: {0}", reason);
|
|
||||||
DeclineConnection(session, joinRequestMessage);
|
|
||||||
tmpRemove.Add(session);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
m_log.Debug("[MXP ClientStack]: Prepared Scene to Connection.");
|
|
||||||
m_log.Debug("[MXP ClientStack]: Accepting connection...");
|
|
||||||
AcceptConnection(session, joinRequestMessage, mxpSessionID, userId);
|
|
||||||
m_log.Info("[MXP ClientStack]: Accepted connection.");
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Creating ClientView....");
|
|
||||||
MXPClientView client = new MXPClientView(session, mxpSessionID, userId, scene, account.FirstName, account.LastName);
|
|
||||||
m_clients.Add(client);
|
|
||||||
m_log.Debug("[MXP ClientStack]: Created ClientView.");
|
|
||||||
|
|
||||||
client.MXPSendSynchronizationBegin(m_scenes[new UUID(joinRequestMessage.BubbleId)].SceneContents.GetTotalObjectsCount());
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Starting ClientView...");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
client.Start();
|
|
||||||
m_log.Debug("[MXP ClientStack]: Started ClientView.");
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.Error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Connected");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_log.Info("[MXP ClientStack]: Session join request failure: " + session.SessionId + " (" +
|
|
||||||
(session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
|
|
||||||
session.RemoteEndPoint.Port + ")");
|
|
||||||
|
|
||||||
DeclineConnection(session, joinRequestMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.Error("[MXP ClientStack]: Session join request failure: " + session.SessionId + " (" +
|
|
||||||
(session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" +
|
|
||||||
session.RemoteEndPoint.Port + "): "+e.ToString()+" :"+e.StackTrace.ToString());
|
|
||||||
}
|
|
||||||
tmpRemove.Add(session);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (Session session in tmpRemove)
|
|
||||||
{
|
|
||||||
m_sessionsToClient.Remove(session);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (MXPClientView clientView in m_clients)
|
|
||||||
{
|
|
||||||
int messagesProcessedCount = 0;
|
|
||||||
Session session = clientView.Session;
|
|
||||||
|
|
||||||
while (session.AvailableMessages > 0)
|
|
||||||
{
|
|
||||||
Message message = session.Receive();
|
|
||||||
|
|
||||||
if (message.GetType() == typeof(LeaveRequestMessage))
|
|
||||||
{
|
|
||||||
LeaveResponseMessage leaveResponseMessage = (LeaveResponseMessage)MessageFactory.Current.ReserveMessage(
|
|
||||||
typeof(LeaveResponseMessage));
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Session leave request: " + session.SessionId + " (" + (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + session.RemoteEndPoint.Port + ")");
|
|
||||||
|
|
||||||
leaveResponseMessage.RequestMessageId = message.MessageId;
|
|
||||||
leaveResponseMessage.FailureCode = 0;
|
|
||||||
session.Send(leaveResponseMessage);
|
|
||||||
|
|
||||||
if (session.SessionState != SessionState.Disconnected)
|
|
||||||
{
|
|
||||||
session.SetStateDisconnected();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Removing Client from Scene");
|
|
||||||
//clientView.Scene.RemoveClient(clientView.AgentId);
|
|
||||||
}
|
|
||||||
if (message.GetType() == typeof(LeaveResponseMessage))
|
|
||||||
{
|
|
||||||
LeaveResponseMessage leaveResponseMessage = (LeaveResponseMessage)message;
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Session leave response: " + session.SessionId + " (" + (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + session.RemoteEndPoint.Port + ")");
|
|
||||||
|
|
||||||
if (leaveResponseMessage.FailureCode == 0)
|
|
||||||
{
|
|
||||||
session.SetStateDisconnected();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_log.Debug("[MXP ClientStack]: Removing Client from Scene");
|
|
||||||
//clientView.Scene.RemoveClient(clientView.AgentId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
clientView.MXPPRocessMessage(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageFactory.Current.ReleaseMessage(message);
|
|
||||||
messagesProcessedCount++;
|
|
||||||
if (messagesProcessedCount > 1000)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AcceptConnection(Session session, JoinRequestMessage joinRequestMessage, UUID mxpSessionID, UUID userId)
|
|
||||||
{
|
|
||||||
JoinResponseMessage joinResponseMessage = (JoinResponseMessage)MessageFactory.Current.ReserveMessage(
|
|
||||||
typeof(JoinResponseMessage));
|
|
||||||
|
|
||||||
joinResponseMessage.RequestMessageId = joinRequestMessage.MessageId;
|
|
||||||
joinResponseMessage.FailureCode = MxpResponseCodes.SUCCESS;
|
|
||||||
|
|
||||||
joinResponseMessage.BubbleId = joinRequestMessage.BubbleId;
|
|
||||||
joinResponseMessage.ParticipantId = userId.Guid;
|
|
||||||
joinResponseMessage.AvatarId = userId.Guid;
|
|
||||||
joinResponseMessage.BubbleAssetCacheUrl = "http://" +
|
|
||||||
NetworkUtil.GetHostFor(session.RemoteEndPoint.Address,
|
|
||||||
m_scenes[
|
|
||||||
new UUID(joinRequestMessage.BubbleId)].
|
|
||||||
RegionInfo.
|
|
||||||
ExternalHostName) + ":" +
|
|
||||||
m_scenes[new UUID(joinRequestMessage.BubbleId)].RegionInfo.
|
|
||||||
HttpPort + "/assets/";
|
|
||||||
|
|
||||||
joinResponseMessage.BubbleName = m_scenes[new UUID(joinRequestMessage.BubbleId)].RegionInfo.RegionName;
|
|
||||||
|
|
||||||
joinResponseMessage.BubbleRange = 128;
|
|
||||||
joinResponseMessage.BubblePerceptionRange = 128 + 256;
|
|
||||||
joinResponseMessage.BubbleRealTime = 0;
|
|
||||||
joinResponseMessage.ProgramName = m_programName;
|
|
||||||
joinResponseMessage.ProgramMajorVersion = m_programMajorVersion;
|
|
||||||
joinResponseMessage.ProgramMinorVersion = m_programMinorVersion;
|
|
||||||
joinResponseMessage.ProtocolMajorVersion = MxpConstants.ProtocolMajorVersion;
|
|
||||||
joinResponseMessage.ProtocolMinorVersion = MxpConstants.ProtocolMinorVersion;
|
|
||||||
joinResponseMessage.ProtocolSourceRevision = MxpConstants.ProtocolSourceRevision;
|
|
||||||
|
|
||||||
session.Send(joinResponseMessage);
|
|
||||||
|
|
||||||
session.SetStateConnected();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DeclineConnection(Session session, Message joinRequestMessage)
|
|
||||||
{
|
|
||||||
JoinResponseMessage joinResponseMessage = (JoinResponseMessage)MessageFactory.Current.ReserveMessage(typeof(JoinResponseMessage));
|
|
||||||
|
|
||||||
joinResponseMessage.RequestMessageId = joinRequestMessage.MessageId;
|
|
||||||
joinResponseMessage.FailureCode = MxpResponseCodes.UNAUTHORIZED_OPERATION;
|
|
||||||
|
|
||||||
joinResponseMessage.ProgramName = m_programName;
|
|
||||||
joinResponseMessage.ProgramMajorVersion = m_programMajorVersion;
|
|
||||||
joinResponseMessage.ProgramMinorVersion = m_programMinorVersion;
|
|
||||||
joinResponseMessage.ProtocolMajorVersion = MxpConstants.ProtocolMajorVersion;
|
|
||||||
joinResponseMessage.ProtocolMinorVersion = MxpConstants.ProtocolMinorVersion;
|
|
||||||
joinResponseMessage.ProtocolSourceRevision = MxpConstants.ProtocolSourceRevision;
|
|
||||||
|
|
||||||
session.Send(joinResponseMessage);
|
|
||||||
|
|
||||||
session.SetStateDisconnected();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool AuthoriseUser(string participantName, string password, UUID sceneId, out UserAccount account)
|
|
||||||
{
|
|
||||||
string firstName = "";
|
|
||||||
string lastName = "";
|
|
||||||
account = null;
|
|
||||||
|
|
||||||
string[] nameParts = participantName.Split(' ');
|
|
||||||
if (nameParts.Length != 2)
|
|
||||||
{
|
|
||||||
m_log.Error("[MXP ClientStack]: Login failed as user name is not formed of first and last name separated by space: " + participantName);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
firstName = nameParts[0];
|
|
||||||
lastName = nameParts[1];
|
|
||||||
|
|
||||||
account = m_scenes[sceneId].UserAccountService.GetUserAccount(m_scenes[sceneId].RegionInfo.ScopeID, firstName, lastName);
|
|
||||||
if (account != null)
|
|
||||||
return (m_scenes[sceneId].AuthenticationService.Authenticate(account.PrincipalID, password, 1) != string.Empty);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AttachUserAgentToUserProfile(UserAccount account, Session session, UUID sessionId, UUID sceneId, out UUID secureSessionId)
|
|
||||||
{
|
|
||||||
secureSessionId = UUID.Random();
|
|
||||||
Scene scene = m_scenes[sceneId];
|
|
||||||
scene.PresenceService.LoginAgent(account.PrincipalID.ToString(), sessionId, secureSessionId);
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool PrepareSceneForConnection(UUID sessionId, UUID secureSessionId, UUID sceneId, UserAccount account, out string reason)
|
|
||||||
{
|
|
||||||
Scene scene = m_scenes[sceneId];
|
|
||||||
|
|
||||||
AgentCircuitData agent = new AgentCircuitData();
|
|
||||||
agent.AgentID = account.PrincipalID;
|
|
||||||
agent.firstname = account.FirstName;
|
|
||||||
agent.lastname = account.LastName;
|
|
||||||
agent.SessionID = sessionId;
|
|
||||||
agent.SecureSessionID = secureSessionId;
|
|
||||||
agent.circuitcode = sessionId.CRC();
|
|
||||||
agent.BaseFolder = UUID.Zero;
|
|
||||||
agent.InventoryFolder = UUID.Zero;
|
|
||||||
agent.startpos = new Vector3(0, 0, 0); // TODO Fill in region start position
|
|
||||||
agent.CapsPath = "http://localhost/";
|
|
||||||
agent.Appearance = scene.AvatarService.GetAppearance(account.PrincipalID);
|
|
||||||
|
|
||||||
if (agent.Appearance == null)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat("[INTER]: Appearance not found for {0} {1}. Creating default.", agent.firstname, agent.lastname);
|
|
||||||
agent.Appearance = new AvatarAppearance();
|
|
||||||
}
|
|
||||||
|
|
||||||
return scene.NewUserConnection(agent, 0, out reason);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PrintDebugInformation()
|
|
||||||
{
|
|
||||||
m_log.Info("[MXP ClientStack]: Statistics report");
|
|
||||||
m_log.Info("Pending Sessions: " + PendingSessionCount);
|
|
||||||
m_log.Info("Sessions: " + SessionCount + " (Clients: " + m_clients.Count + " )");
|
|
||||||
m_log.Info("Transmitter Alive?: " + IsTransmitterAlive);
|
|
||||||
m_log.Info("Packets Sent/Received: " + PacketsSent + " / " + PacketsReceived);
|
|
||||||
m_log.Info("Bytes Sent/Received: " + BytesSent + " / " + BytesReceived);
|
|
||||||
m_log.Info("Send/Receive Rate (bps): " + SendRate + " / " + ReceiveRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,133 +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.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
using Nini.Config;
|
|
||||||
using OpenMetaverse;
|
|
||||||
using OpenSim.Client.VWoHTTP.ClientStack;
|
|
||||||
using OpenSim.Framework;
|
|
||||||
using OpenSim.Framework.Servers;
|
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
|
||||||
using OpenSim.Region.Framework.Scenes;
|
|
||||||
|
|
||||||
namespace OpenSim.Client.VWoHTTP
|
|
||||||
{
|
|
||||||
class VWoHTTPModule : IRegionModule, IHttpAgentHandler
|
|
||||||
{
|
|
||||||
private bool m_disabled = true;
|
|
||||||
|
|
||||||
private IHttpServer m_httpd;
|
|
||||||
|
|
||||||
private readonly List<Scene> m_scenes = new List<Scene>();
|
|
||||||
|
|
||||||
private Dictionary<UUID, VWHClientView> m_clients = new Dictionary<UUID, VWHClientView>();
|
|
||||||
|
|
||||||
#region Implementation of IRegionModule
|
|
||||||
|
|
||||||
public void Initialise(Scene scene, IConfigSource source)
|
|
||||||
{
|
|
||||||
if (m_disabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_scenes.Add(scene);
|
|
||||||
|
|
||||||
m_httpd = MainServer.Instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PostInitialise()
|
|
||||||
{
|
|
||||||
if (m_disabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_httpd.AddAgentHandler("vwohttp", this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Close()
|
|
||||||
{
|
|
||||||
if (m_disabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_httpd.RemoveAgentHandler("vwohttp", this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name
|
|
||||||
{
|
|
||||||
get { return "VWoHTTP ClientStack"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsSharedModule
|
|
||||||
{
|
|
||||||
get { return true; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Implementation of IHttpAgentHandler
|
|
||||||
|
|
||||||
public bool Handle(OSHttpRequest req, OSHttpResponse resp)
|
|
||||||
{
|
|
||||||
string[] urlparts = req.Url.AbsolutePath.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
|
|
||||||
if (urlparts.Length < 2)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (urlparts[1] == "connect")
|
|
||||||
{
|
|
||||||
UUID sessID = UUID.Random();
|
|
||||||
|
|
||||||
VWHClientView client = new VWHClientView(sessID, UUID.Random(), "VWoHTTPClient", m_scenes[0]);
|
|
||||||
|
|
||||||
m_clients.Add(sessID, client);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (urlparts.Length < 3)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
UUID sessionID;
|
|
||||||
if (!UUID.TryParse(urlparts[1], out sessionID))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!m_clients.ContainsKey(sessionID))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return m_clients[sessionID].ProcessInMsg(req, resp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Match(OSHttpRequest req, OSHttpResponse resp)
|
|
||||||
{
|
|
||||||
return req.Url.ToString().Contains("vwohttp");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -74,9 +74,38 @@ namespace OpenSim.Data
|
||||||
bool StoreFolder(XInventoryFolder folder);
|
bool StoreFolder(XInventoryFolder folder);
|
||||||
bool StoreItem(XInventoryItem item);
|
bool StoreItem(XInventoryItem item);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete folders where field == val
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="field"></param>
|
||||||
|
/// <param name="val"></param>
|
||||||
|
/// <returns>true if the delete was successful, false if it was not</returns>
|
||||||
bool DeleteFolders(string field, string val);
|
bool DeleteFolders(string field, string val);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete folders where field1 == val1, field2 == val2...
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fields"></param>
|
||||||
|
/// <param name="vals"></param>
|
||||||
|
/// <returns>true if the delete was successful, false if it was not</returns>
|
||||||
|
bool DeleteFolders(string[] fields, string[] vals);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete items where field == val
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="field"></param>
|
||||||
|
/// <param name="val"></param>
|
||||||
|
/// <returns>true if the delete was successful, false if it was not</returns>
|
||||||
bool DeleteItems(string field, string val);
|
bool DeleteItems(string field, string val);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete items where field1 == val1, field2 == val2...
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fields"></param>
|
||||||
|
/// <param name="vals"></param>
|
||||||
|
/// <returns>true if the delete was successful, false if it was not</returns>
|
||||||
|
bool DeleteItems(string[] fields, string[] vals);
|
||||||
|
|
||||||
bool MoveItem(string id, string newParent);
|
bool MoveItem(string id, string newParent);
|
||||||
XInventoryItem[] GetActiveGestures(UUID principalID);
|
XInventoryItem[] GetActiveGestures(UUID principalID);
|
||||||
int GetAssetPermissions(UUID principalID, UUID assetID);
|
int GetAssetPermissions(UUID principalID, UUID assetID);
|
||||||
|
|
|
@ -41,7 +41,7 @@ namespace OpenSim.Data.MSSQL
|
||||||
{
|
{
|
||||||
private const string _migrationStore = "EstateStore";
|
private const string _migrationStore = "EstateStore";
|
||||||
|
|
||||||
private static readonly ILog _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private MSSQLManager _Database;
|
private MSSQLManager _Database;
|
||||||
private string m_connectionString;
|
private string m_connectionString;
|
||||||
|
@ -72,7 +72,12 @@ namespace OpenSim.Data.MSSQL
|
||||||
}
|
}
|
||||||
|
|
||||||
//Migration settings
|
//Migration settings
|
||||||
_Database.CheckMigration(_migrationStore);
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
Migration m = new Migration(conn, GetType().Assembly, "EstateStore");
|
||||||
|
m.Update();
|
||||||
|
}
|
||||||
|
|
||||||
//Interesting way to get parameters! Maybe implement that also with other types
|
//Interesting way to get parameters! Maybe implement that also with other types
|
||||||
Type t = typeof(EstateSettings);
|
Type t = typeof(EstateSettings);
|
||||||
|
@ -112,19 +117,19 @@ namespace OpenSim.Data.MSSQL
|
||||||
{
|
{
|
||||||
FieldInfo f = _FieldMap[name];
|
FieldInfo f = _FieldMap[name];
|
||||||
object v = reader[name];
|
object v = reader[name];
|
||||||
if (f.FieldType == typeof(bool) )
|
if (f.FieldType == typeof(bool))
|
||||||
{
|
{
|
||||||
f.SetValue(es, Convert.ToInt32(v) != 0);
|
f.SetValue(es, Convert.ToInt32(v) != 0);
|
||||||
}
|
}
|
||||||
else if (f.FieldType == typeof(UUID) )
|
else if (f.FieldType == typeof(UUID))
|
||||||
{
|
{
|
||||||
f.SetValue(es, new UUID((Guid)v)); // uuid);
|
f.SetValue(es, new UUID((Guid)v)); // uuid);
|
||||||
}
|
}
|
||||||
else if (f.FieldType == typeof(string))
|
else if (f.FieldType == typeof(string))
|
||||||
{
|
{
|
||||||
f.SetValue(es, v.ToString());
|
f.SetValue(es, v.ToString());
|
||||||
}
|
}
|
||||||
else if (f.FieldType == typeof(UInt32))
|
else if (f.FieldType == typeof(UInt32))
|
||||||
{
|
{
|
||||||
f.SetValue(es, Convert.ToUInt32(v));
|
f.SetValue(es, Convert.ToUInt32(v));
|
||||||
}
|
}
|
||||||
|
@ -186,7 +191,7 @@ namespace OpenSim.Data.MSSQL
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_Log.DebugFormat("[ESTATE DB]: Error inserting regionID and EstateID in estate_map: {0}", e);
|
m_log.DebugFormat("[ESTATE DB]: Error inserting regionID and EstateID in estate_map: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,12 +315,12 @@ namespace OpenSim.Data.MSSQL
|
||||||
conn.Open();
|
conn.Open();
|
||||||
using (SqlCommand cmd = conn.CreateCommand())
|
using (SqlCommand cmd = conn.CreateCommand())
|
||||||
{
|
{
|
||||||
cmd.CommandText = "delete from estateban where EstateID = @EstateID";
|
cmd.CommandText = "delete from estateban where EstateID = @EstateID";
|
||||||
cmd.Parameters.AddWithValue("@EstateID", (int)es.EstateID);
|
cmd.Parameters.AddWithValue("@EstateID", (int)es.EstateID);
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
//Insert after
|
//Insert after
|
||||||
cmd.CommandText = "insert into estateban (EstateID, bannedUUID) values ( @EstateID, @bannedUUID )";
|
cmd.CommandText = "insert into estateban (EstateID, bannedUUID,bannedIp, bannedIpHostMask, bannedNameMask) values ( @EstateID, @bannedUUID, '','','' )";
|
||||||
cmd.Parameters.AddWithValue("@bannedUUID", Guid.Empty);
|
cmd.Parameters.AddWithValue("@bannedUUID", Guid.Empty);
|
||||||
foreach (EstateBan b in es.EstateBans)
|
foreach (EstateBan b in es.EstateBans)
|
||||||
{
|
{
|
||||||
|
@ -350,43 +355,195 @@ namespace OpenSim.Data.MSSQL
|
||||||
|
|
||||||
public EstateSettings LoadEstateSettings(int estateID)
|
public EstateSettings LoadEstateSettings(int estateID)
|
||||||
{
|
{
|
||||||
// TODO: Implementation!
|
EstateSettings es = new EstateSettings();
|
||||||
return new EstateSettings();
|
string sql = "select estate_settings." + String.Join(",estate_settings.", FieldList) + " from estate_settings where EstateID = @EstateID";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@EstateID", (int)estateID);
|
||||||
|
using (SqlDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
if (reader.Read())
|
||||||
|
{
|
||||||
|
foreach (string name in FieldList)
|
||||||
|
{
|
||||||
|
FieldInfo f = _FieldMap[name];
|
||||||
|
object v = reader[name];
|
||||||
|
if (f.FieldType == typeof(bool))
|
||||||
|
{
|
||||||
|
f.SetValue(es, Convert.ToInt32(v) != 0);
|
||||||
|
}
|
||||||
|
else if (f.FieldType == typeof(UUID))
|
||||||
|
{
|
||||||
|
f.SetValue(es, new UUID((Guid)v)); // uuid);
|
||||||
|
}
|
||||||
|
else if (f.FieldType == typeof(string))
|
||||||
|
{
|
||||||
|
f.SetValue(es, v.ToString());
|
||||||
|
}
|
||||||
|
else if (f.FieldType == typeof(UInt32))
|
||||||
|
{
|
||||||
|
f.SetValue(es, Convert.ToUInt32(v));
|
||||||
|
}
|
||||||
|
else if (f.FieldType == typeof(Single))
|
||||||
|
{
|
||||||
|
f.SetValue(es, Convert.ToSingle(v));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
f.SetValue(es, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LoadBanList(es);
|
||||||
|
|
||||||
|
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
|
||||||
|
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
|
||||||
|
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
|
||||||
|
|
||||||
|
//Set event
|
||||||
|
es.OnSave += StoreEstateSettings;
|
||||||
|
return es;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<EstateSettings> LoadEstateSettingsAll()
|
public List<EstateSettings> LoadEstateSettingsAll()
|
||||||
{
|
{
|
||||||
// TODO: Implementation!
|
List<EstateSettings> allEstateSettings = new List<EstateSettings>();
|
||||||
return new List<EstateSettings>();
|
|
||||||
|
List<int> allEstateIds = GetEstatesAll();
|
||||||
|
|
||||||
|
foreach (int estateId in allEstateIds)
|
||||||
|
allEstateSettings.Add(LoadEstateSettings(estateId));
|
||||||
|
|
||||||
|
return allEstateSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<int> GetEstates(string search)
|
public List<int> GetEstates(string search)
|
||||||
{
|
{
|
||||||
// TODO: Implementation!
|
List<int> result = new List<int>();
|
||||||
return new List<int>();
|
string sql = "select estateID from estate_settings where EstateName = @EstateName";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@EstateName", search);
|
||||||
|
|
||||||
|
using (IDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||||
|
}
|
||||||
|
reader.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<int> GetEstatesAll()
|
public List<int> GetEstatesAll()
|
||||||
{
|
{
|
||||||
// TODO: Implementation!
|
List<int> result = new List<int>();
|
||||||
return new List<int>();
|
string sql = "select estateID from estate_settings";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
using (IDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||||
|
}
|
||||||
|
reader.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<int> GetEstatesByOwner(UUID ownerID)
|
public List<int> GetEstatesByOwner(UUID ownerID)
|
||||||
{
|
{
|
||||||
return new List<int>();
|
List<int> result = new List<int>();
|
||||||
|
string sql = "select estateID from estate_settings where EstateOwner = @EstateOwner";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@EstateOwner", ownerID);
|
||||||
|
|
||||||
|
using (IDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
result.Add(Convert.ToInt32(reader["EstateID"]));
|
||||||
|
}
|
||||||
|
reader.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool LinkRegion(UUID regionID, int estateID)
|
public bool LinkRegion(UUID regionID, int estateID)
|
||||||
{
|
{
|
||||||
// TODO: Implementation!
|
string sql = "insert into estate_map values (@RegionID, @EstateID)";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@RegionID", regionID);
|
||||||
|
cmd.Parameters.AddWithValue("@EstateID", estateID);
|
||||||
|
|
||||||
|
int ret = cmd.ExecuteNonQuery();
|
||||||
|
return (ret != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<UUID> GetRegions(int estateID)
|
public List<UUID> GetRegions(int estateID)
|
||||||
{
|
{
|
||||||
// TODO: Implementation!
|
List<UUID> result = new List<UUID>();
|
||||||
return new List<UUID>();
|
string sql = "select RegionID from estate_map where EstateID = @EstateID";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@EstateID", estateID);
|
||||||
|
|
||||||
|
using (IDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
result.Add(DBGuid.FromDB(reader["RegionID"]));
|
||||||
|
}
|
||||||
|
reader.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool DeleteEstate(int estateID)
|
public bool DeleteEstate(int estateID)
|
||||||
|
|
|
@ -56,15 +56,15 @@ namespace OpenSim.Data.MSSQL
|
||||||
string realm, string storeName)
|
string realm, string storeName)
|
||||||
{
|
{
|
||||||
m_Realm = realm;
|
m_Realm = realm;
|
||||||
|
|
||||||
|
m_ConnectionString = connectionString;
|
||||||
|
|
||||||
if (storeName != String.Empty)
|
if (storeName != String.Empty)
|
||||||
{
|
{
|
||||||
Assembly assem = GetType().Assembly;
|
|
||||||
m_ConnectionString = connectionString;
|
|
||||||
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
||||||
{
|
{
|
||||||
conn.Open();
|
conn.Open();
|
||||||
Migration m = new Migration(conn, assem, storeName);
|
Migration m = new Migration(conn, GetType().Assembly, storeName);
|
||||||
m.Update();
|
m.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,14 +168,13 @@ namespace OpenSim.Data.MSSQL
|
||||||
|
|
||||||
protected T[] DoQuery(SqlCommand cmd)
|
protected T[] DoQuery(SqlCommand cmd)
|
||||||
{
|
{
|
||||||
|
List<T> result = new List<T>();
|
||||||
using (SqlDataReader reader = cmd.ExecuteReader())
|
using (SqlDataReader reader = cmd.ExecuteReader())
|
||||||
{
|
{
|
||||||
if (reader == null)
|
if (reader == null)
|
||||||
return new T[0];
|
return new T[0];
|
||||||
|
|
||||||
CheckColumnNames(reader);
|
CheckColumnNames(reader);
|
||||||
|
|
||||||
List<T> result = new List<T>();
|
|
||||||
|
|
||||||
while (reader.Read())
|
while (reader.Read())
|
||||||
{
|
{
|
||||||
|
@ -262,6 +261,15 @@ namespace OpenSim.Data.MSSQL
|
||||||
{
|
{
|
||||||
names.Add(fi.Name);
|
names.Add(fi.Name);
|
||||||
values.Add("@" + fi.Name);
|
values.Add("@" + fi.Name);
|
||||||
|
// Temporarily return more information about what field is unexpectedly null for
|
||||||
|
// http://opensimulator.org/mantis/view.php?id=5403. This might be due to a bug in the
|
||||||
|
// InventoryTransferModule or we may be required to substitute a DBNull here.
|
||||||
|
if (fi.GetValue(row) == null)
|
||||||
|
throw new NullReferenceException(
|
||||||
|
string.Format(
|
||||||
|
"[MSSQL GENERIC TABLE HANDLER]: Trying to store field {0} for {1} which is unexpectedly null",
|
||||||
|
fi.Name, row));
|
||||||
|
|
||||||
if (constraintFields.Count > 0 && constraintFields.Contains(fi.Name))
|
if (constraintFields.Count > 0 && constraintFields.Contains(fi.Name))
|
||||||
{
|
{
|
||||||
constraints.Add(new KeyValuePair<string, string>(fi.Name, fi.GetValue(row).ToString()));
|
constraints.Add(new KeyValuePair<string, string>(fi.Name, fi.GetValue(row).ToString()));
|
||||||
|
@ -335,16 +343,33 @@ namespace OpenSim.Data.MSSQL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool Delete(string field, string val)
|
public virtual bool Delete(string field, string key)
|
||||||
{
|
{
|
||||||
|
return Delete(new string[] { field }, new string[] { key });
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool Delete(string[] fields, string[] keys)
|
||||||
|
{
|
||||||
|
if (fields.Length != keys.Length)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
List<string> terms = new List<string>();
|
||||||
|
|
||||||
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
||||||
using (SqlCommand cmd = new SqlCommand())
|
using (SqlCommand cmd = new SqlCommand())
|
||||||
{
|
{
|
||||||
string deleteCommand = String.Format("DELETE FROM {0} WHERE [{1}] = @{1}", m_Realm, field);
|
for (int i = 0; i < fields.Length; i++)
|
||||||
cmd.CommandText = deleteCommand;
|
{
|
||||||
|
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
|
||||||
cmd.Parameters.Add(m_database.CreateParameter(field, val));
|
terms.Add("[" + fields[i] + "] = @" + fields[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
string where = String.Join(" AND ", terms.ToArray());
|
||||||
|
|
||||||
|
string query = String.Format("DELETE FROM {0} WHERE {1}", m_Realm, where);
|
||||||
|
|
||||||
cmd.Connection = conn;
|
cmd.Connection = conn;
|
||||||
|
cmd.CommandText = query;
|
||||||
conn.Open();
|
conn.Open();
|
||||||
|
|
||||||
if (cmd.ExecuteNonQuery() > 0)
|
if (cmd.ExecuteNonQuery() > 0)
|
||||||
|
|
|
@ -29,16 +29,19 @@ using System;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Data.SqlClient;
|
||||||
|
|
||||||
namespace OpenSim.Data.MSSQL
|
namespace OpenSim.Data.MSSQL
|
||||||
{
|
{
|
||||||
public class MSSQLMigration : Migration
|
public class MSSQLMigration : Migration
|
||||||
{
|
{
|
||||||
public MSSQLMigration(DbConnection conn, Assembly assem, string type) : base(conn, assem, type)
|
public MSSQLMigration(DbConnection conn, Assembly assem, string type)
|
||||||
|
: base(conn, assem, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public MSSQLMigration(DbConnection conn, Assembly assem, string subtype, string type) : base(conn, assem, subtype, type)
|
public MSSQLMigration(DbConnection conn, Assembly assem, string subtype, string type)
|
||||||
|
: base(conn, assem, subtype, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,10 +64,36 @@ namespace OpenSim.Data.MSSQL
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Something went wrong, so we're version 0
|
// Return -1 to indicate table does not exist
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void ExecuteScript(DbConnection conn, string[] script)
|
||||||
|
{
|
||||||
|
if (!(conn is SqlConnection))
|
||||||
|
{
|
||||||
|
base.ExecuteScript(conn, script);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (string sql in script)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, (SqlConnection)conn))
|
||||||
|
{
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception(sql);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,7 @@ namespace OpenSim.Data.MSSQL
|
||||||
string sql = "select * from ["+m_Realm+"] where regionName like @regionName";
|
string sql = "select * from ["+m_Realm+"] where regionName like @regionName";
|
||||||
if (scopeID != UUID.Zero)
|
if (scopeID != UUID.Zero)
|
||||||
sql += " and ScopeID = @scopeID";
|
sql += " and ScopeID = @scopeID";
|
||||||
|
sql += " order by regionName";
|
||||||
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
||||||
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
{
|
{
|
||||||
|
|
|
@ -55,6 +55,10 @@ namespace OpenSim.Data.MSSQL
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private MSSQLManager _Database;
|
private MSSQLManager _Database;
|
||||||
private string m_connectionString;
|
private string m_connectionString;
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
public MSSQLSimulationData()
|
public MSSQLSimulationData()
|
||||||
{
|
{
|
||||||
|
@ -74,9 +78,28 @@ namespace OpenSim.Data.MSSQL
|
||||||
m_connectionString = connectionString;
|
m_connectionString = connectionString;
|
||||||
_Database = new MSSQLManager(connectionString);
|
_Database = new MSSQLManager(connectionString);
|
||||||
|
|
||||||
|
using (SqlConnection conn = new SqlConnection(connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
//New Migration settings
|
||||||
|
Migration m = new Migration(conn, Assembly, "RegionStore");
|
||||||
|
m.Update();
|
||||||
|
|
||||||
//Migration settings
|
// Clean dropped attachments
|
||||||
_Database.CheckMigration(_migrationStore);
|
//
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (SqlCommand cmd = conn.CreateCommand())
|
||||||
|
{
|
||||||
|
cmd.CommandText = "delete from prims where prims.UUID in (select UUID from primshapes where PCode = 9 and State <> 0); delete from primshapes where PCode = 9 and State <> 0";
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_Log.Error("[REGION DB]: Error cleaning up dropped attachments: " + ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -214,7 +237,7 @@ namespace OpenSim.Data.MSSQL
|
||||||
{
|
{
|
||||||
command.Parameters.Clear();
|
command.Parameters.Clear();
|
||||||
command.Parameters.Add(_Database.CreateParameter("@PrimID", objectPart.UUID));
|
command.Parameters.Add(_Database.CreateParameter("@PrimID", objectPart.UUID));
|
||||||
|
|
||||||
List<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
|
List<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
|
||||||
|
|
||||||
using (SqlDataReader reader = command.ExecuteReader())
|
using (SqlDataReader reader = command.ExecuteReader())
|
||||||
|
@ -241,6 +264,14 @@ namespace OpenSim.Data.MSSQL
|
||||||
/// <param name="regionUUID"></param>
|
/// <param name="regionUUID"></param>
|
||||||
public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
|
public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
|
||||||
{
|
{
|
||||||
|
uint flags = obj.RootPart.GetEffectiveObjectFlags();
|
||||||
|
// Eligibility check
|
||||||
|
//
|
||||||
|
if ((flags & (uint)PrimFlags.Temporary) != 0)
|
||||||
|
return;
|
||||||
|
if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
_Log.DebugFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Parts.Length);
|
_Log.DebugFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Parts.Length);
|
||||||
|
|
||||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
@ -492,12 +523,11 @@ ELSE
|
||||||
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
{
|
{
|
||||||
|
conn.Open();
|
||||||
foreach (TaskInventoryItem taskItem in items)
|
foreach (TaskInventoryItem taskItem in items)
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem));
|
cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem));
|
||||||
conn.Open();
|
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
cmd.Parameters.Clear();
|
cmd.Parameters.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -701,16 +731,470 @@ VALUES
|
||||||
}
|
}
|
||||||
public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
|
public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
|
||||||
{
|
{
|
||||||
//This connector doesn't support the windlight module yet
|
RegionLightShareData nWP = new RegionLightShareData();
|
||||||
//Return default LL windlight settings
|
nWP.OnSave += StoreRegionWindlightSettings;
|
||||||
return new RegionLightShareData();
|
string sql = "select * from [regionwindlight] where region_id = @regionID";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@regionID", regionUUID));
|
||||||
|
conn.Open();
|
||||||
|
using (SqlDataReader result = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
if (!result.Read())
|
||||||
|
{
|
||||||
|
//No result, so store our default windlight profile and return it
|
||||||
|
nWP.regionID = regionUUID;
|
||||||
|
StoreRegionWindlightSettings(nWP);
|
||||||
|
return nWP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nWP.regionID = DBGuid.FromDB(result["region_id"]);
|
||||||
|
nWP.waterColor.X = Convert.ToSingle(result["water_color_r"]);
|
||||||
|
nWP.waterColor.Y = Convert.ToSingle(result["water_color_g"]);
|
||||||
|
nWP.waterColor.Z = Convert.ToSingle(result["water_color_b"]);
|
||||||
|
nWP.waterFogDensityExponent = Convert.ToSingle(result["water_fog_density_exponent"]);
|
||||||
|
nWP.underwaterFogModifier = Convert.ToSingle(result["underwater_fog_modifier"]);
|
||||||
|
nWP.reflectionWaveletScale.X = Convert.ToSingle(result["reflection_wavelet_scale_1"]);
|
||||||
|
nWP.reflectionWaveletScale.Y = Convert.ToSingle(result["reflection_wavelet_scale_2"]);
|
||||||
|
nWP.reflectionWaveletScale.Z = Convert.ToSingle(result["reflection_wavelet_scale_3"]);
|
||||||
|
nWP.fresnelScale = Convert.ToSingle(result["fresnel_scale"]);
|
||||||
|
nWP.fresnelOffset = Convert.ToSingle(result["fresnel_offset"]);
|
||||||
|
nWP.refractScaleAbove = Convert.ToSingle(result["refract_scale_above"]);
|
||||||
|
nWP.refractScaleBelow = Convert.ToSingle(result["refract_scale_below"]);
|
||||||
|
nWP.blurMultiplier = Convert.ToSingle(result["blur_multiplier"]);
|
||||||
|
nWP.bigWaveDirection.X = Convert.ToSingle(result["big_wave_direction_x"]);
|
||||||
|
nWP.bigWaveDirection.Y = Convert.ToSingle(result["big_wave_direction_y"]);
|
||||||
|
nWP.littleWaveDirection.X = Convert.ToSingle(result["little_wave_direction_x"]);
|
||||||
|
nWP.littleWaveDirection.Y = Convert.ToSingle(result["little_wave_direction_y"]);
|
||||||
|
UUID.TryParse(result["normal_map_texture"].ToString(), out nWP.normalMapTexture);
|
||||||
|
nWP.horizon.X = Convert.ToSingle(result["horizon_r"]);
|
||||||
|
nWP.horizon.Y = Convert.ToSingle(result["horizon_g"]);
|
||||||
|
nWP.horizon.Z = Convert.ToSingle(result["horizon_b"]);
|
||||||
|
nWP.horizon.W = Convert.ToSingle(result["horizon_i"]);
|
||||||
|
nWP.hazeHorizon = Convert.ToSingle(result["haze_horizon"]);
|
||||||
|
nWP.blueDensity.X = Convert.ToSingle(result["blue_density_r"]);
|
||||||
|
nWP.blueDensity.Y = Convert.ToSingle(result["blue_density_g"]);
|
||||||
|
nWP.blueDensity.Z = Convert.ToSingle(result["blue_density_b"]);
|
||||||
|
nWP.blueDensity.W = Convert.ToSingle(result["blue_density_i"]);
|
||||||
|
nWP.hazeDensity = Convert.ToSingle(result["haze_density"]);
|
||||||
|
nWP.densityMultiplier = Convert.ToSingle(result["density_multiplier"]);
|
||||||
|
nWP.distanceMultiplier = Convert.ToSingle(result["distance_multiplier"]);
|
||||||
|
nWP.maxAltitude = Convert.ToUInt16(result["max_altitude"]);
|
||||||
|
nWP.sunMoonColor.X = Convert.ToSingle(result["sun_moon_color_r"]);
|
||||||
|
nWP.sunMoonColor.Y = Convert.ToSingle(result["sun_moon_color_g"]);
|
||||||
|
nWP.sunMoonColor.Z = Convert.ToSingle(result["sun_moon_color_b"]);
|
||||||
|
nWP.sunMoonColor.W = Convert.ToSingle(result["sun_moon_color_i"]);
|
||||||
|
nWP.sunMoonPosition = Convert.ToSingle(result["sun_moon_position"]);
|
||||||
|
nWP.ambient.X = Convert.ToSingle(result["ambient_r"]);
|
||||||
|
nWP.ambient.Y = Convert.ToSingle(result["ambient_g"]);
|
||||||
|
nWP.ambient.Z = Convert.ToSingle(result["ambient_b"]);
|
||||||
|
nWP.ambient.W = Convert.ToSingle(result["ambient_i"]);
|
||||||
|
nWP.eastAngle = Convert.ToSingle(result["east_angle"]);
|
||||||
|
nWP.sunGlowFocus = Convert.ToSingle(result["sun_glow_focus"]);
|
||||||
|
nWP.sunGlowSize = Convert.ToSingle(result["sun_glow_size"]);
|
||||||
|
nWP.sceneGamma = Convert.ToSingle(result["scene_gamma"]);
|
||||||
|
nWP.starBrightness = Convert.ToSingle(result["star_brightness"]);
|
||||||
|
nWP.cloudColor.X = Convert.ToSingle(result["cloud_color_r"]);
|
||||||
|
nWP.cloudColor.Y = Convert.ToSingle(result["cloud_color_g"]);
|
||||||
|
nWP.cloudColor.Z = Convert.ToSingle(result["cloud_color_b"]);
|
||||||
|
nWP.cloudColor.W = Convert.ToSingle(result["cloud_color_i"]);
|
||||||
|
nWP.cloudXYDensity.X = Convert.ToSingle(result["cloud_x"]);
|
||||||
|
nWP.cloudXYDensity.Y = Convert.ToSingle(result["cloud_y"]);
|
||||||
|
nWP.cloudXYDensity.Z = Convert.ToSingle(result["cloud_density"]);
|
||||||
|
nWP.cloudCoverage = Convert.ToSingle(result["cloud_coverage"]);
|
||||||
|
nWP.cloudScale = Convert.ToSingle(result["cloud_scale"]);
|
||||||
|
nWP.cloudDetailXYDensity.X = Convert.ToSingle(result["cloud_detail_x"]);
|
||||||
|
nWP.cloudDetailXYDensity.Y = Convert.ToSingle(result["cloud_detail_y"]);
|
||||||
|
nWP.cloudDetailXYDensity.Z = Convert.ToSingle(result["cloud_detail_density"]);
|
||||||
|
nWP.cloudScrollX = Convert.ToSingle(result["cloud_scroll_x"]);
|
||||||
|
nWP.cloudScrollXLock = Convert.ToBoolean(result["cloud_scroll_x_lock"]);
|
||||||
|
nWP.cloudScrollY = Convert.ToSingle(result["cloud_scroll_y"]);
|
||||||
|
nWP.cloudScrollYLock = Convert.ToBoolean(result["cloud_scroll_y_lock"]);
|
||||||
|
nWP.drawClassicClouds = Convert.ToBoolean(result["draw_classic_clouds"]);
|
||||||
|
nWP.valid = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nWP;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegionWindlightSettings(UUID regionID)
|
public void RemoveRegionWindlightSettings(UUID regionID)
|
||||||
{
|
{
|
||||||
|
string sql = "delete from [regionwindlight] where region_id = @region_id";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionID));
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StoreRegionWindlightSettings(RegionLightShareData wl)
|
public void StoreRegionWindlightSettings(RegionLightShareData wl)
|
||||||
{
|
{
|
||||||
//This connector doesn't support the windlight module yet
|
string sql = "select count (region_id) from regionwindlight where region_id = @region_id";
|
||||||
|
bool exists = false;
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("@region_id", wl.regionID));
|
||||||
|
exists = (int)cmd.ExecuteScalar() > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (exists)
|
||||||
|
{
|
||||||
|
RemoveRegionWindlightSettings(wl.regionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sql insert
|
||||||
|
sql = @"INSERT INTO [regionwindlight]
|
||||||
|
([region_id]
|
||||||
|
,[water_color_r]
|
||||||
|
,[water_color_g]
|
||||||
|
,[water_color_b]
|
||||||
|
,[water_fog_density_exponent]
|
||||||
|
,[underwater_fog_modifier]
|
||||||
|
,[reflection_wavelet_scale_1]
|
||||||
|
,[reflection_wavelet_scale_2]
|
||||||
|
,[reflection_wavelet_scale_3]
|
||||||
|
,[fresnel_scale]
|
||||||
|
,[fresnel_offset]
|
||||||
|
,[refract_scale_above]
|
||||||
|
,[refract_scale_below]
|
||||||
|
,[blur_multiplier]
|
||||||
|
,[big_wave_direction_x]
|
||||||
|
,[big_wave_direction_y]
|
||||||
|
,[little_wave_direction_x]
|
||||||
|
,[little_wave_direction_y]
|
||||||
|
,[normal_map_texture]
|
||||||
|
,[horizon_r]
|
||||||
|
,[horizon_g]
|
||||||
|
,[horizon_b]
|
||||||
|
,[horizon_i]
|
||||||
|
,[haze_horizon]
|
||||||
|
,[blue_density_r]
|
||||||
|
,[blue_density_g]
|
||||||
|
,[blue_density_b]
|
||||||
|
,[blue_density_i]
|
||||||
|
,[haze_density]
|
||||||
|
,[density_multiplier]
|
||||||
|
,[distance_multiplier]
|
||||||
|
,[max_altitude]
|
||||||
|
,[sun_moon_color_r]
|
||||||
|
,[sun_moon_color_g]
|
||||||
|
,[sun_moon_color_b]
|
||||||
|
,[sun_moon_color_i]
|
||||||
|
,[sun_moon_position]
|
||||||
|
,[ambient_r]
|
||||||
|
,[ambient_g]
|
||||||
|
,[ambient_b]
|
||||||
|
,[ambient_i]
|
||||||
|
,[east_angle]
|
||||||
|
,[sun_glow_focus]
|
||||||
|
,[sun_glow_size]
|
||||||
|
,[scene_gamma]
|
||||||
|
,[star_brightness]
|
||||||
|
,[cloud_color_r]
|
||||||
|
,[cloud_color_g]
|
||||||
|
,[cloud_color_b]
|
||||||
|
,[cloud_color_i]
|
||||||
|
,[cloud_x]
|
||||||
|
,[cloud_y]
|
||||||
|
,[cloud_density]
|
||||||
|
,[cloud_coverage]
|
||||||
|
,[cloud_scale]
|
||||||
|
,[cloud_detail_x]
|
||||||
|
,[cloud_detail_y]
|
||||||
|
,[cloud_detail_density]
|
||||||
|
,[cloud_scroll_x]
|
||||||
|
,[cloud_scroll_x_lock]
|
||||||
|
,[cloud_scroll_y]
|
||||||
|
,[cloud_scroll_y_lock]
|
||||||
|
,[draw_classic_clouds])
|
||||||
|
VALUES
|
||||||
|
(@region_id
|
||||||
|
,@water_color_r
|
||||||
|
,@water_color_g
|
||||||
|
,@water_color_b
|
||||||
|
,@water_fog_density_exponent
|
||||||
|
,@underwater_fog_modifier
|
||||||
|
,@reflection_wavelet_scale_1
|
||||||
|
,@reflection_wavelet_scale_2
|
||||||
|
,@reflection_wavelet_scale_3
|
||||||
|
,@fresnel_scale
|
||||||
|
,@fresnel_offset
|
||||||
|
,@refract_scale_above
|
||||||
|
,@refract_scale_below
|
||||||
|
,@blur_multiplier
|
||||||
|
,@big_wave_direction_x
|
||||||
|
,@big_wave_direction_y
|
||||||
|
,@little_wave_direction_x
|
||||||
|
,@little_wave_direction_y
|
||||||
|
,@normal_map_texture
|
||||||
|
,@horizon_r
|
||||||
|
,@horizon_g
|
||||||
|
,@horizon_b
|
||||||
|
,@horizon_i
|
||||||
|
,@haze_horizon
|
||||||
|
,@blue_density_r
|
||||||
|
,@blue_density_g
|
||||||
|
,@blue_density_b
|
||||||
|
,@blue_density_i
|
||||||
|
,@haze_density
|
||||||
|
,@density_multiplier
|
||||||
|
,@distance_multiplier
|
||||||
|
,@max_altitude
|
||||||
|
,@sun_moon_color_r
|
||||||
|
,@sun_moon_color_g
|
||||||
|
,@sun_moon_color_b
|
||||||
|
,@sun_moon_color_i
|
||||||
|
,@sun_moon_position
|
||||||
|
,@ambient_r
|
||||||
|
,@ambient_g
|
||||||
|
,@ambient_b
|
||||||
|
,@ambient_i
|
||||||
|
,@east_angle
|
||||||
|
,@sun_glow_focus
|
||||||
|
,@sun_glow_size
|
||||||
|
,@scene_gamma
|
||||||
|
,@star_brightness
|
||||||
|
,@cloud_color_r
|
||||||
|
,@cloud_color_g
|
||||||
|
,@cloud_color_b
|
||||||
|
,@cloud_color_i
|
||||||
|
,@cloud_x
|
||||||
|
,@cloud_y
|
||||||
|
,@cloud_density
|
||||||
|
,@cloud_coverage
|
||||||
|
,@cloud_scale
|
||||||
|
,@cloud_detail_x
|
||||||
|
,@cloud_detail_y
|
||||||
|
,@cloud_detail_density
|
||||||
|
,@cloud_scroll_x
|
||||||
|
,@cloud_scroll_x_lock
|
||||||
|
,@cloud_scroll_y
|
||||||
|
,@cloud_scroll_y_lock
|
||||||
|
,@draw_classic_clouds)";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("region_id", wl.regionID));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("water_color_r", wl.waterColor.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("water_color_g", wl.waterColor.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("water_color_b", wl.waterColor.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("water_fog_density_exponent", wl.waterFogDensityExponent));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("underwater_fog_modifier", wl.underwaterFogModifier));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("fresnel_scale", wl.fresnelScale));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("fresnel_offset", wl.fresnelOffset));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("refract_scale_above", wl.refractScaleAbove));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("refract_scale_below", wl.refractScaleBelow));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("blur_multiplier", wl.blurMultiplier));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_x", wl.bigWaveDirection.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_y", wl.bigWaveDirection.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_x", wl.littleWaveDirection.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_y", wl.littleWaveDirection.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("normal_map_texture", wl.normalMapTexture));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("horizon_r", wl.horizon.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("horizon_g", wl.horizon.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("horizon_b", wl.horizon.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("horizon_i", wl.horizon.W));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("haze_horizon", wl.hazeHorizon));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("blue_density_r", wl.blueDensity.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("blue_density_g", wl.blueDensity.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("blue_density_b", wl.blueDensity.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("blue_density_i", wl.blueDensity.W));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("haze_density", wl.hazeDensity));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("density_multiplier", wl.densityMultiplier));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("distance_multiplier", wl.distanceMultiplier));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("max_altitude", wl.maxAltitude));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_r", wl.sunMoonColor.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_g", wl.sunMoonColor.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_b", wl.sunMoonColor.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_i", wl.sunMoonColor.W));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("sun_moon_position", wl.sunMoonPosition));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("ambient_r", wl.ambient.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("ambient_g", wl.ambient.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("ambient_b", wl.ambient.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("ambient_i", wl.ambient.W));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("east_angle", wl.eastAngle));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("sun_glow_focus", wl.sunGlowFocus));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("sun_glow_size", wl.sunGlowSize));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("scene_gamma", wl.sceneGamma));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("star_brightness", wl.starBrightness));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_r", wl.cloudColor.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_g", wl.cloudColor.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_b", wl.cloudColor.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_color_i", wl.cloudColor.W));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_x", wl.cloudXYDensity.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_y", wl.cloudXYDensity.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_density", wl.cloudXYDensity.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_coverage", wl.cloudCoverage));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_scale", wl.cloudScale));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_x", wl.cloudDetailXYDensity.X));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_y", wl.cloudDetailXYDensity.Y));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_density", wl.cloudDetailXYDensity.Z));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_x", wl.cloudScrollX));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_x_lock", wl.cloudScrollXLock));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_y", wl.cloudScrollY));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_y_lock", wl.cloudScrollYLock));
|
||||||
|
cmd.Parameters.Add(_Database.CreateParameter("draw_classic_clouds", wl.drawClassicClouds));
|
||||||
|
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#region update
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// // sql update
|
||||||
|
// sql = @"UPDATE [OpenSim].[dbo].[regionwindlight]
|
||||||
|
// SET [region_id] = @region_id
|
||||||
|
// ,[water_color_r] = @water_color_r
|
||||||
|
// ,[water_color_g] = @water_color_g
|
||||||
|
// ,[water_color_b] = @water_color_b
|
||||||
|
// ,[water_fog_density_exponent] = @water_fog_density_exponent
|
||||||
|
// ,[underwater_fog_modifier] = @underwater_fog_modifier
|
||||||
|
// ,[reflection_wavelet_scale_1] = @reflection_wavelet_scale_1
|
||||||
|
// ,[reflection_wavelet_scale_2] = @reflection_wavelet_scale_2
|
||||||
|
// ,[reflection_wavelet_scale_3] = @reflection_wavelet_scale_3
|
||||||
|
// ,[fresnel_scale] = @fresnel_scale
|
||||||
|
// ,[fresnel_offset] = @fresnel_offset
|
||||||
|
// ,[refract_scale_above] = @refract_scale_above
|
||||||
|
// ,[refract_scale_below] = @refract_scale_below
|
||||||
|
// ,[blur_multiplier] = @blur_multiplier
|
||||||
|
// ,[big_wave_direction_x] = @big_wave_direction_x
|
||||||
|
// ,[big_wave_direction_y] = @big_wave_direction_y
|
||||||
|
// ,[little_wave_direction_x] = @little_wave_direction_x
|
||||||
|
// ,[little_wave_direction_y] = @little_wave_direction_y
|
||||||
|
// ,[normal_map_texture] = @normal_map_texture
|
||||||
|
// ,[horizon_r] = @horizon_r
|
||||||
|
// ,[horizon_g] = @horizon_g
|
||||||
|
// ,[horizon_b] = @horizon_b
|
||||||
|
// ,[horizon_i] = @horizon_i
|
||||||
|
// ,[haze_horizon] = @haze_horizon
|
||||||
|
// ,[blue_density_r] = @blue_density_r
|
||||||
|
// ,[blue_density_g] = @blue_density_g
|
||||||
|
// ,[blue_density_b] = @blue_density_b
|
||||||
|
// ,[blue_density_i] = @blue_density_i
|
||||||
|
// ,[haze_density] = @haze_density
|
||||||
|
// ,[density_multiplier] = @density_multiplier
|
||||||
|
// ,[distance_multiplier] = @distance_multiplier
|
||||||
|
// ,[max_altitude] = @max_altitude
|
||||||
|
// ,[sun_moon_color_r] = @sun_moon_color_r
|
||||||
|
// ,[sun_moon_color_g] = @sun_moon_color_g
|
||||||
|
// ,[sun_moon_color_b] = @sun_moon_color_b
|
||||||
|
// ,[sun_moon_color_i] = @sun_moon_color_i
|
||||||
|
// ,[sun_moon_position] = @sun_moon_position
|
||||||
|
// ,[ambient_r] = @ambient_r
|
||||||
|
// ,[ambient_g] = @ambient_g
|
||||||
|
// ,[ambient_b] = @ambient_b
|
||||||
|
// ,[ambient_i] = @ambient_i
|
||||||
|
// ,[east_angle] = @east_angle
|
||||||
|
// ,[sun_glow_focus] = @sun_glow_focus
|
||||||
|
// ,[sun_glow_size] = @sun_glow_size
|
||||||
|
// ,[scene_gamma] = @scene_gamma
|
||||||
|
// ,[star_brightness] = @star_brightness
|
||||||
|
// ,[cloud_color_r] = @cloud_color_r
|
||||||
|
// ,[cloud_color_g] = @cloud_color_g
|
||||||
|
// ,[cloud_color_b] = @cloud_color_b
|
||||||
|
// ,[cloud_color_i] = @cloud_color_i
|
||||||
|
// ,[cloud_x] = @cloud_x
|
||||||
|
// ,[cloud_y] = @cloud_y
|
||||||
|
// ,[cloud_density] = @cloud_density
|
||||||
|
// ,[cloud_coverage] = @cloud_coverage
|
||||||
|
// ,[cloud_scale] = @cloud_scale
|
||||||
|
// ,[cloud_detail_x] = @cloud_detail_x
|
||||||
|
// ,[cloud_detail_y] = @cloud_detail_y
|
||||||
|
// ,[cloud_detail_density] = @cloud_detail_density
|
||||||
|
// ,[cloud_scroll_x] = @cloud_scroll_x
|
||||||
|
// ,[cloud_scroll_x_lock] = @cloud_scroll_x_lock
|
||||||
|
// ,[cloud_scroll_y] = @cloud_scroll_y
|
||||||
|
// ,[cloud_scroll_y_lock] = @cloud_scroll_y_lock
|
||||||
|
// ,[draw_classic_clouds] = @draw_classic_clouds
|
||||||
|
// WHERE region_id = @region_id";
|
||||||
|
// using (SqlConnection conn = new SqlConnection(m_connectionString))
|
||||||
|
// {
|
||||||
|
// conn.Open();
|
||||||
|
// using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
// {
|
||||||
|
// cmd.Parameters.AddWithValue("region_id", wl.regionID);
|
||||||
|
// cmd.Parameters.AddWithValue("water_color_r", wl.waterColor.X);
|
||||||
|
// cmd.Parameters.AddWithValue("water_color_g", wl.waterColor.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("water_color_b", wl.waterColor.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("water_fog_density_exponent", wl.waterFogDensityExponent);
|
||||||
|
// cmd.Parameters.AddWithValue("underwater_fog_modifier", wl.underwaterFogModifier);
|
||||||
|
// cmd.Parameters.AddWithValue("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X);
|
||||||
|
// cmd.Parameters.AddWithValue("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("fresnel_scale", wl.fresnelScale);
|
||||||
|
// cmd.Parameters.AddWithValue("fresnel_offset", wl.fresnelOffset);
|
||||||
|
// cmd.Parameters.AddWithValue("refract_scale_above", wl.refractScaleAbove);
|
||||||
|
// cmd.Parameters.AddWithValue("refract_scale_below", wl.refractScaleBelow);
|
||||||
|
// cmd.Parameters.AddWithValue("blur_multiplier", wl.blurMultiplier);
|
||||||
|
// cmd.Parameters.AddWithValue("big_wave_direction_x", wl.bigWaveDirection.X);
|
||||||
|
// cmd.Parameters.AddWithValue("big_wave_direction_y", wl.bigWaveDirection.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("little_wave_direction_x", wl.littleWaveDirection.X);
|
||||||
|
// cmd.Parameters.AddWithValue("little_wave_direction_y", wl.littleWaveDirection.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("normal_map_texture", wl.normalMapTexture);
|
||||||
|
// cmd.Parameters.AddWithValue("horizon_r", wl.horizon.X);
|
||||||
|
// cmd.Parameters.AddWithValue("horizon_g", wl.horizon.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("horizon_b", wl.horizon.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("horizon_i", wl.horizon.W);
|
||||||
|
// cmd.Parameters.AddWithValue("haze_horizon", wl.hazeHorizon);
|
||||||
|
// cmd.Parameters.AddWithValue("blue_density_r", wl.blueDensity.X);
|
||||||
|
// cmd.Parameters.AddWithValue("blue_density_g", wl.blueDensity.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("blue_density_b", wl.blueDensity.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("blue_density_i", wl.blueDensity.W);
|
||||||
|
// cmd.Parameters.AddWithValue("haze_density", wl.hazeDensity);
|
||||||
|
// cmd.Parameters.AddWithValue("density_multiplier", wl.densityMultiplier);
|
||||||
|
// cmd.Parameters.AddWithValue("distance_multiplier", wl.distanceMultiplier);
|
||||||
|
// cmd.Parameters.AddWithValue("max_altitude", wl.maxAltitude);
|
||||||
|
// cmd.Parameters.AddWithValue("sun_moon_color_r", wl.sunMoonColor.X);
|
||||||
|
// cmd.Parameters.AddWithValue("sun_moon_color_g", wl.sunMoonColor.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("sun_moon_color_b", wl.sunMoonColor.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("sun_moon_color_i", wl.sunMoonColor.W);
|
||||||
|
// cmd.Parameters.AddWithValue("sun_moon_position", wl.sunMoonPosition);
|
||||||
|
// cmd.Parameters.AddWithValue("ambient_r", wl.ambient.X);
|
||||||
|
// cmd.Parameters.AddWithValue("ambient_g", wl.ambient.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("ambient_b", wl.ambient.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("ambient_i", wl.ambient.W);
|
||||||
|
// cmd.Parameters.AddWithValue("east_angle", wl.eastAngle);
|
||||||
|
// cmd.Parameters.AddWithValue("sun_glow_focus", wl.sunGlowFocus);
|
||||||
|
// cmd.Parameters.AddWithValue("sun_glow_size", wl.sunGlowSize);
|
||||||
|
// cmd.Parameters.AddWithValue("scene_gamma", wl.sceneGamma);
|
||||||
|
// cmd.Parameters.AddWithValue("star_brightness", wl.starBrightness);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_color_r", wl.cloudColor.X);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_color_g", wl.cloudColor.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_color_b", wl.cloudColor.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_color_i", wl.cloudColor.W);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_x", wl.cloudXYDensity.X);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_y", wl.cloudXYDensity.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_density", wl.cloudXYDensity.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_coverage", wl.cloudCoverage);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_scale", wl.cloudScale);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_detail_x", wl.cloudDetailXYDensity.X);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_detail_y", wl.cloudDetailXYDensity.Y);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_detail_density", wl.cloudDetailXYDensity.Z);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_scroll_x", wl.cloudScrollX);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_scroll_x_lock", wl.cloudScrollXLock);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_scroll_y", wl.cloudScrollY);
|
||||||
|
// cmd.Parameters.AddWithValue("cloud_scroll_y_lock", wl.cloudScrollYLock);
|
||||||
|
// cmd.Parameters.AddWithValue("draw_classic_clouds", wl.drawClassicClouds);
|
||||||
|
|
||||||
|
// cmd.ExecuteNonQuery();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads the settings of a region.
|
/// Loads the settings of a region.
|
||||||
|
@ -1137,7 +1621,7 @@ VALUES
|
||||||
if (Convert.ToInt16(primRow["PassTouches"]) != 0)
|
if (Convert.ToInt16(primRow["PassTouches"]) != 0)
|
||||||
prim.PassTouches = true;
|
prim.PassTouches = true;
|
||||||
prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]);
|
prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]);
|
||||||
|
|
||||||
if (!(primRow["MediaURL"] is System.DBNull))
|
if (!(primRow["MediaURL"] is System.DBNull))
|
||||||
prim.MediaUrl = (string)primRow["MediaURL"];
|
prim.MediaUrl = (string)primRow["MediaURL"];
|
||||||
|
|
||||||
|
@ -1154,9 +1638,9 @@ VALUES
|
||||||
PrimitiveBaseShape baseShape = new PrimitiveBaseShape();
|
PrimitiveBaseShape baseShape = new PrimitiveBaseShape();
|
||||||
|
|
||||||
baseShape.Scale = new Vector3(
|
baseShape.Scale = new Vector3(
|
||||||
Convert.ToSingle(shapeRow["ScaleX"]),
|
(float)Convert.ToDouble(shapeRow["ScaleX"]),
|
||||||
Convert.ToSingle(shapeRow["ScaleY"]),
|
(float)Convert.ToDouble(shapeRow["ScaleY"]),
|
||||||
Convert.ToSingle(shapeRow["ScaleZ"]));
|
(float)Convert.ToDouble(shapeRow["ScaleZ"]));
|
||||||
|
|
||||||
// paths
|
// paths
|
||||||
baseShape.PCode = Convert.ToByte(shapeRow["PCode"]);
|
baseShape.PCode = Convert.ToByte(shapeRow["PCode"]);
|
||||||
|
@ -1194,7 +1678,10 @@ VALUES
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(shapeRow["Media"] is System.DBNull))
|
if (!(shapeRow["Media"] is System.DBNull))
|
||||||
|
{
|
||||||
baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]);
|
baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return baseShape;
|
return baseShape;
|
||||||
}
|
}
|
||||||
|
@ -1573,7 +2060,16 @@ VALUES
|
||||||
parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry));
|
parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry));
|
||||||
parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams));
|
parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams));
|
||||||
parameters.Add(_Database.CreateParameter("State", s.State));
|
parameters.Add(_Database.CreateParameter("State", s.State));
|
||||||
parameters.Add(_Database.CreateParameter("Media", null == s.Media ? null : s.Media.ToXml()));
|
|
||||||
|
if (null == s.Media)
|
||||||
|
{
|
||||||
|
parameters.Add(_Database.CreateParameter("Media", DBNull.Value));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parameters.Add(_Database.CreateParameter("Media", s.Media.ToXml()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return parameters.ToArray();
|
return parameters.ToArray();
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,11 +66,18 @@ namespace OpenSim.Data.MSSQL
|
||||||
|
|
||||||
public bool StoreFolder(XInventoryFolder folder)
|
public bool StoreFolder(XInventoryFolder folder)
|
||||||
{
|
{
|
||||||
|
if (folder.folderName.Length > 64)
|
||||||
|
folder.folderName = folder.folderName.Substring(0, 64);
|
||||||
return m_Folders.Store(folder);
|
return m_Folders.Store(folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool StoreItem(XInventoryItem item)
|
public bool StoreItem(XInventoryItem item)
|
||||||
{
|
{
|
||||||
|
if (item.inventoryName.Length > 64)
|
||||||
|
item.inventoryName = item.inventoryName.Substring(0, 64);
|
||||||
|
if (item.inventoryDescription.Length > 128)
|
||||||
|
item.inventoryDescription = item.inventoryDescription.Substring(0, 128);
|
||||||
|
|
||||||
return m_Items.Store(item);
|
return m_Items.Store(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,12 +85,19 @@ namespace OpenSim.Data.MSSQL
|
||||||
{
|
{
|
||||||
return m_Folders.Delete(field, val);
|
return m_Folders.Delete(field, val);
|
||||||
}
|
}
|
||||||
|
public bool DeleteFolders(string[] fields, string[] vals)
|
||||||
|
{
|
||||||
|
return m_Folders.Delete(fields, vals);
|
||||||
|
}
|
||||||
|
|
||||||
public bool DeleteItems(string field, string val)
|
public bool DeleteItems(string field, string val)
|
||||||
{
|
{
|
||||||
return m_Items.Delete(field, val);
|
return m_Items.Delete(field, val);
|
||||||
}
|
}
|
||||||
|
public bool DeleteItems(string[] fields, string[] vals)
|
||||||
|
{
|
||||||
|
return m_Items.Delete(fields, vals);
|
||||||
|
}
|
||||||
public bool MoveItem(string id, string newParent)
|
public bool MoveItem(string id, string newParent)
|
||||||
{
|
{
|
||||||
return m_Items.MoveItem(id, newParent);
|
return m_Items.MoveItem(id, newParent);
|
||||||
|
@ -162,5 +176,27 @@ namespace OpenSim.Data.MSSQL
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public override bool Store(XInventoryItem item)
|
||||||
|
{
|
||||||
|
if (!base.Store(item))
|
||||||
|
return false;
|
||||||
|
string sql = "update inventoryfolders set version=version+1 where folderID = @folderID";
|
||||||
|
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
|
||||||
|
using (SqlCommand cmd = new SqlCommand(sql, conn))
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
|
||||||
|
cmd.Parameters.AddWithValue("@folderID", item.parentFolderID.ToString());
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,11 @@ COMMIT
|
||||||
|
|
||||||
BEGIN TRANSACTION
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users;
|
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[users]') AND type in (N'U'))
|
||||||
|
INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users;
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
COMMIT
|
|
|
@ -13,5 +13,52 @@ PRIMARY KEY CLUSTERED
|
||||||
) ON [PRIMARY]
|
) ON [PRIMARY]
|
||||||
|
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 2
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
CREATE TABLE dbo.Tmp_Avatars
|
||||||
|
(
|
||||||
|
PrincipalID uniqueidentifier NOT NULL,
|
||||||
|
[Name] varchar(32) NOT NULL,
|
||||||
|
Value text NOT NULL DEFAULT '',
|
||||||
|
) ON [PRIMARY]
|
||||||
|
TEXTIMAGE_ON [PRIMARY]
|
||||||
|
|
||||||
|
IF EXISTS(SELECT * FROM dbo.Avatars)
|
||||||
|
EXEC('INSERT INTO dbo.Tmp_Avatars (PrincipalID, Name, Value)
|
||||||
|
SELECT PrincipalID, CONVERT(text, Name), Value FROM dbo.Avatars WITH (HOLDLOCK TABLOCKX)')
|
||||||
|
|
||||||
|
DROP TABLE dbo.Avatars
|
||||||
|
|
||||||
|
EXECUTE sp_rename N'dbo.Tmp_Avatars', N'Avatars', 'OBJECT'
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 3
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
CREATE TABLE dbo.Tmp_Avatars
|
||||||
|
(
|
||||||
|
PrincipalID uniqueidentifier NOT NULL,
|
||||||
|
[Name] varchar(32) NOT NULL,
|
||||||
|
Value text NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[PrincipalID] ASC, [Name] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY]
|
||||||
|
TEXTIMAGE_ON [PRIMARY]
|
||||||
|
|
||||||
|
IF EXISTS(SELECT * FROM dbo.Avatars)
|
||||||
|
EXEC('INSERT INTO dbo.Tmp_Avatars (PrincipalID, Name, Value)
|
||||||
|
SELECT PrincipalID, CONVERT(text, Name), Value FROM dbo.Avatars WITH (HOLDLOCK TABLOCKX)')
|
||||||
|
|
||||||
|
DROP TABLE dbo.Avatars
|
||||||
|
|
||||||
|
EXECUTE sp_rename N'dbo.Tmp_Avatars', N'Avatars', 'OBJECT'
|
||||||
|
COMMIT
|
||||||
|
|
||||||
COMMIT
|
|
|
@ -15,6 +15,8 @@ COMMIT
|
||||||
|
|
||||||
BEGIN TRANSACTION
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
INSERT INTO Friends (PrincipalID, Friend, Flags, Offered) SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends;
|
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[userfriends]') AND type in (N'U'))
|
||||||
|
INSERT INTO Friends (PrincipalID, Friend, Flags, Offered)
|
||||||
|
SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends;
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
|
@ -222,4 +222,17 @@ ALTER TABLE [regions] ADD [Token] varchar(255) NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 8
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
ALTER TABLE regions ALTER COLUMN regionName VarChar(128)
|
||||||
|
|
||||||
|
DROP INDEX IX_regions_name ON dbo.regions
|
||||||
|
ALTER TABLE regions ALTER COLUMN regionName VarChar(128) null
|
||||||
|
|
||||||
|
CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions
|
||||||
|
(
|
||||||
|
regionName
|
||||||
|
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
|
||||||
|
|
||||||
|
COMMIT
|
|
@ -0,0 +1,65 @@
|
||||||
|
:VERSION 1 # --------------------------
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
CREATE TABLE "GridUser" (
|
||||||
|
"UserID" VARCHAR(255) NOT NULL,
|
||||||
|
"HomeRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||||
|
"HomePosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
"HomeLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
"LastRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||||
|
"LastPosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
"LastLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
"Online" CHAR(5) NOT NULL DEFAULT 'false',
|
||||||
|
"Login" CHAR(16) NOT NULL DEFAULT '0',
|
||||||
|
"Logout" CHAR(16) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY ("UserID")
|
||||||
|
)
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 2 # --------------------------
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
CREATE TABLE [GridUser_tmp] (
|
||||||
|
[UserID] VARCHAR(255) NOT NULL,
|
||||||
|
[HomeRegionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||||
|
[HomePosition] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
[HomeLookAt] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
[LastRegionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||||
|
[LastPosition] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
[LastLookAt] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
||||||
|
[Online] CHAR(5) NOT NULL DEFAULT 'false',
|
||||||
|
[Login] CHAR(16) NOT NULL DEFAULT '0',
|
||||||
|
[Logout] CHAR(16) NOT NULL DEFAULT '0',
|
||||||
|
|
||||||
|
PRIMARY KEY CLUSTERED
|
||||||
|
(
|
||||||
|
[UserID] ASC
|
||||||
|
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
|
||||||
|
) ON [PRIMARY]
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
IF EXISTS(SELECT * FROM dbo.GridUser)
|
||||||
|
EXEC('INSERT INTO dbo.GridUser_tmp ([UserID]
|
||||||
|
,[HomeRegionID]
|
||||||
|
,[HomePosition]
|
||||||
|
,[HomeLookAt]
|
||||||
|
,[LastRegionID]
|
||||||
|
,[LastPosition]
|
||||||
|
,[LastLookAt]
|
||||||
|
,[Online]
|
||||||
|
,[Login]
|
||||||
|
,[Logout])
|
||||||
|
SELECT CONVERT(varchar(36), [HomeRegionID]), [HomePosition] ,[HomeLookAt] , CONVERT(varchar(36),[LastRegionID])
|
||||||
|
,[LastPosition]
|
||||||
|
,[LastLookAt]
|
||||||
|
,[Online]
|
||||||
|
,[Login]
|
||||||
|
,[Logout] FROM dbo.GridUser WITH (HOLDLOCK TABLOCKX)')
|
||||||
|
|
||||||
|
DROP TABLE dbo.GridUser
|
||||||
|
|
||||||
|
EXECUTE sp_rename N'dbo.GridUser_tmp', N'GridUser', 'OBJECT'
|
|
@ -238,7 +238,10 @@ alter table inventoryitems
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE inventoryitems
|
||||||
|
ADD CONSTRAINT DF_inventoryitems_creatorID
|
||||||
|
DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID
|
||||||
|
|
||||||
|
:GO
|
|
@ -7,14 +7,7 @@ CREATE TABLE [Presence] (
|
||||||
[RegionID] uniqueidentifier NOT NULL,
|
[RegionID] uniqueidentifier NOT NULL,
|
||||||
[SessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
[SessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||||
[SecureSessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
[SecureSessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
|
||||||
[Online] char(5) NOT NULL DEFAULT 'false',
|
|
||||||
[Login] char(16) NOT NULL DEFAULT '0',
|
|
||||||
[Logout] char(16) NOT NULL DEFAULT '0',
|
|
||||||
[Position] char(64) NOT NULL DEFAULT '<0,0,0>',
|
|
||||||
[LookAt] char(64) NOT NULL DEFAULT '<0,0,0>',
|
|
||||||
[HomeRegionID] uniqueidentifier NOT NULL,
|
|
||||||
[HomePosition] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
|
||||||
[HomeLookAt] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
|
|
||||||
)
|
)
|
||||||
ON [PRIMARY]
|
ON [PRIMARY]
|
||||||
|
|
||||||
|
@ -27,4 +20,12 @@ BEGIN TRANSACTION
|
||||||
CREATE UNIQUE INDEX SessionID ON Presence(SessionID);
|
CREATE UNIQUE INDEX SessionID ON Presence(SessionID);
|
||||||
CREATE INDEX UserID ON Presence(UserID);
|
CREATE INDEX UserID ON Presence(UserID);
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 2
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
ALTER TABLE Presence ADD LastSeen DateTime
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
:VERSION 1
|
:VERSION 1
|
||||||
|
|
||||||
CREATE TABLE [dbo].[prims](
|
CREATE TABLE [dbo].[prims](
|
||||||
|
@ -926,11 +925,121 @@ ALTER TABLE regionsettings ADD loaded_creation_datetime int NOT NULL default 0
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
:VERSION 24
|
:VERSION 24
|
||||||
-- Added post 0.7
|
|
||||||
|
|
||||||
BEGIN TRANSACTION
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
ALTER TABLE prims ADD COLUMN MediaURL varchar(255)
|
ALTER TABLE prims ADD MediaURL varchar(255)
|
||||||
ALTER TABLE primshapes ADD COLUMN Media TEXT
|
ALTER TABLE primshapes ADD Media TEXT NULL
|
||||||
|
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 25
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
CREATE TABLE "regionwindlight" (
|
||||||
|
"region_id" varchar(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000',
|
||||||
|
"water_color_r" [float] NOT NULL DEFAULT '4.000000',
|
||||||
|
"water_color_g" [float] NOT NULL DEFAULT '38.000000',
|
||||||
|
"water_color_b" [float] NOT NULL DEFAULT '64.000000',
|
||||||
|
"water_fog_density_exponent" [float] NOT NULL DEFAULT '4.0',
|
||||||
|
"underwater_fog_modifier" [float] NOT NULL DEFAULT '0.25',
|
||||||
|
"reflection_wavelet_scale_1" [float] NOT NULL DEFAULT '2.0',
|
||||||
|
"reflection_wavelet_scale_2" [float] NOT NULL DEFAULT '2.0',
|
||||||
|
"reflection_wavelet_scale_3" [float] NOT NULL DEFAULT '2.0',
|
||||||
|
"fresnel_scale" [float] NOT NULL DEFAULT '0.40',
|
||||||
|
"fresnel_offset" [float] NOT NULL DEFAULT '0.50',
|
||||||
|
"refract_scale_above" [float] NOT NULL DEFAULT '0.03',
|
||||||
|
"refract_scale_below" [float] NOT NULL DEFAULT '0.20',
|
||||||
|
"blur_multiplier" [float] NOT NULL DEFAULT '0.040',
|
||||||
|
"big_wave_direction_x" [float] NOT NULL DEFAULT '1.05',
|
||||||
|
"big_wave_direction_y" [float] NOT NULL DEFAULT '-0.42',
|
||||||
|
"little_wave_direction_x" [float] NOT NULL DEFAULT '1.11',
|
||||||
|
"little_wave_direction_y" [float] NOT NULL DEFAULT '-1.16',
|
||||||
|
"normal_map_texture" varchar(36) NOT NULL DEFAULT '822ded49-9a6c-f61c-cb89-6df54f42cdf4',
|
||||||
|
"horizon_r" [float] NOT NULL DEFAULT '0.25',
|
||||||
|
"horizon_g" [float] NOT NULL DEFAULT '0.25',
|
||||||
|
"horizon_b" [float] NOT NULL DEFAULT '0.32',
|
||||||
|
"horizon_i" [float] NOT NULL DEFAULT '0.32',
|
||||||
|
"haze_horizon" [float] NOT NULL DEFAULT '0.19',
|
||||||
|
"blue_density_r" [float] NOT NULL DEFAULT '0.12',
|
||||||
|
"blue_density_g" [float] NOT NULL DEFAULT '0.22',
|
||||||
|
"blue_density_b" [float] NOT NULL DEFAULT '0.38',
|
||||||
|
"blue_density_i" [float] NOT NULL DEFAULT '0.38',
|
||||||
|
"haze_density" [float] NOT NULL DEFAULT '0.70',
|
||||||
|
"density_multiplier" [float] NOT NULL DEFAULT '0.18',
|
||||||
|
"distance_multiplier" [float] NOT NULL DEFAULT '0.8',
|
||||||
|
"max_altitude" int NOT NULL DEFAULT '1605',
|
||||||
|
"sun_moon_color_r" [float] NOT NULL DEFAULT '0.24',
|
||||||
|
"sun_moon_color_g" [float] NOT NULL DEFAULT '0.26',
|
||||||
|
"sun_moon_color_b" [float] NOT NULL DEFAULT '0.30',
|
||||||
|
"sun_moon_color_i" [float] NOT NULL DEFAULT '0.30',
|
||||||
|
"sun_moon_position" [float] NOT NULL DEFAULT '0.317',
|
||||||
|
"ambient_r" [float] NOT NULL DEFAULT '0.35',
|
||||||
|
"ambient_g" [float] NOT NULL DEFAULT '0.35',
|
||||||
|
"ambient_b" [float] NOT NULL DEFAULT '0.35',
|
||||||
|
"ambient_i" [float] NOT NULL DEFAULT '0.35',
|
||||||
|
"east_angle" [float] NOT NULL DEFAULT '0.00',
|
||||||
|
"sun_glow_focus" [float] NOT NULL DEFAULT '0.10',
|
||||||
|
"sun_glow_size" [float] NOT NULL DEFAULT '1.75',
|
||||||
|
"scene_gamma" [float] NOT NULL DEFAULT '1.00',
|
||||||
|
"star_brightness" [float] NOT NULL DEFAULT '0.00',
|
||||||
|
"cloud_color_r" [float] NOT NULL DEFAULT '0.41',
|
||||||
|
"cloud_color_g" [float] NOT NULL DEFAULT '0.41',
|
||||||
|
"cloud_color_b" [float] NOT NULL DEFAULT '0.41',
|
||||||
|
"cloud_color_i" [float] NOT NULL DEFAULT '0.41',
|
||||||
|
"cloud_x" [float] NOT NULL DEFAULT '1.00',
|
||||||
|
"cloud_y" [float] NOT NULL DEFAULT '0.53',
|
||||||
|
"cloud_density" [float] NOT NULL DEFAULT '1.00',
|
||||||
|
"cloud_coverage" [float] NOT NULL DEFAULT '0.27',
|
||||||
|
"cloud_scale" [float] NOT NULL DEFAULT '0.42',
|
||||||
|
"cloud_detail_x" [float] NOT NULL DEFAULT '1.00',
|
||||||
|
"cloud_detail_y" [float] NOT NULL DEFAULT '0.53',
|
||||||
|
"cloud_detail_density" [float] NOT NULL DEFAULT '0.12',
|
||||||
|
"cloud_scroll_x" [float] NOT NULL DEFAULT '0.20',
|
||||||
|
"cloud_scroll_x_lock" tinyint NOT NULL DEFAULT '0',
|
||||||
|
"cloud_scroll_y" [float] NOT NULL DEFAULT '0.01',
|
||||||
|
"cloud_scroll_y_lock" tinyint NOT NULL DEFAULT '0',
|
||||||
|
"draw_classic_clouds" tinyint NOT NULL DEFAULT '1',
|
||||||
|
PRIMARY KEY ("region_id")
|
||||||
|
)
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 26
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
ALTER TABLE regionsettings ADD map_tile_ID CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 27 #---------------------
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
ALTER TABLE land ADD MediaType VARCHAR(32) NOT NULL DEFAULT 'none/none'
|
||||||
|
ALTER TABLE land ADD MediaDescription VARCHAR(255) NOT NULL DEFAULT ''
|
||||||
|
ALTER TABLE land ADD MediaSize VARCHAR(16) NOT NULL DEFAULT '0,0'
|
||||||
|
ALTER TABLE land ADD MediaLoop bit NOT NULL DEFAULT 0
|
||||||
|
ALTER TABLE land ADD ObscureMusic bit NOT NULL DEFAULT 0
|
||||||
|
ALTER TABLE land ADD ObscureMedia bit NOT NULL DEFAULT 0
|
||||||
|
COMMIT
|
||||||
|
|
||||||
|
:VERSION 28 #---------------------
|
||||||
|
|
||||||
|
BEGIN TRANSACTION
|
||||||
|
|
||||||
|
ALTER TABLE prims
|
||||||
|
ADD CONSTRAINT DF_prims_CreatorID
|
||||||
|
DEFAULT '00000000-0000-0000-0000-000000000000'
|
||||||
|
FOR CreatorID
|
||||||
|
|
||||||
|
ALTER TABLE prims ALTER COLUMN CreatorID uniqueidentifier NOT NULL
|
||||||
|
|
||||||
|
ALTER TABLE primitems
|
||||||
|
ADD CONSTRAINT DF_primitems_CreatorID
|
||||||
|
DEFAULT '00000000-0000-0000-0000-000000000000'
|
||||||
|
FOR CreatorID
|
||||||
|
|
||||||
|
ALTER TABLE primitems ALTER COLUMN CreatorID uniqueidentifier NOT NULL
|
||||||
|
|
||||||
|
COMMIT
|
||||||
|
|
|
@ -19,7 +19,7 @@ CREATE TABLE [UserAccounts] (
|
||||||
:VERSION 2
|
:VERSION 2
|
||||||
|
|
||||||
BEGIN TRANSACTION
|
BEGIN TRANSACTION
|
||||||
|
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[users]') AND type in (N'U'))
|
||||||
INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID,
|
INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID,
|
||||||
username AS FirstName,
|
username AS FirstName,
|
||||||
lastname AS LastName,
|
lastname AS LastName,
|
||||||
|
|
|
@ -251,12 +251,14 @@ namespace OpenSim.Data.MySQL
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// check if the asset UUID exist in database
|
/// Check if the asset exists in the database
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="uuid">The asset UUID</param>
|
/// <param name="uuid">The asset UUID</param>
|
||||||
/// <returns>true if exist.</returns>
|
/// <returns>true if it exists, false otherwise.</returns>
|
||||||
override public bool ExistsAsset(UUID uuid)
|
override public bool ExistsAsset(UUID uuid)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
|
||||||
|
|
||||||
bool assetExists = false;
|
bool assetExists = false;
|
||||||
|
|
||||||
lock (m_dbLock)
|
lock (m_dbLock)
|
||||||
|
@ -273,7 +275,10 @@ namespace OpenSim.Data.MySQL
|
||||||
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
|
||||||
{
|
{
|
||||||
if (dbReader.Read())
|
if (dbReader.Read())
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
|
||||||
assetExists = true;
|
assetExists = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -264,18 +264,33 @@ namespace OpenSim.Data.MySQL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool Delete(string field, string val)
|
public virtual bool Delete(string field, string key)
|
||||||
{
|
{
|
||||||
|
return Delete(new string[] { field }, new string[] { key });
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool Delete(string[] fields, string[] keys)
|
||||||
|
{
|
||||||
|
if (fields.Length != keys.Length)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
List<string> terms = new List<string>();
|
||||||
|
|
||||||
using (MySqlCommand cmd = new MySqlCommand())
|
using (MySqlCommand cmd = new MySqlCommand())
|
||||||
{
|
{
|
||||||
|
for (int i = 0 ; i < fields.Length ; i++)
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue(fields[i], keys[i]);
|
||||||
|
terms.Add("`" + fields[i] + "` = ?" + fields[i]);
|
||||||
|
}
|
||||||
|
|
||||||
cmd.CommandText = String.Format("delete from {0} where `{1}` = ?{1}", m_Realm, field);
|
string where = String.Join(" and ", terms.ToArray());
|
||||||
cmd.Parameters.AddWithValue(field, val);
|
|
||||||
|
|
||||||
if (ExecuteNonQuery(cmd) > 0)
|
string query = String.Format("delete from {0} where {1}", m_Realm, where);
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
cmd.CommandText = query;
|
||||||
|
|
||||||
|
return ExecuteNonQuery(cmd) > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,11 +85,21 @@ namespace OpenSim.Data.MySQL
|
||||||
return m_Folders.Delete(field, val);
|
return m_Folders.Delete(field, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool DeleteFolders(string[] fields, string[] vals)
|
||||||
|
{
|
||||||
|
return m_Folders.Delete(fields, vals);
|
||||||
|
}
|
||||||
|
|
||||||
public bool DeleteItems(string field, string val)
|
public bool DeleteItems(string field, string val)
|
||||||
{
|
{
|
||||||
return m_Items.Delete(field, val);
|
return m_Items.Delete(field, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool DeleteItems(string[] fields, string[] vals)
|
||||||
|
{
|
||||||
|
return m_Items.Delete(fields, vals);
|
||||||
|
}
|
||||||
|
|
||||||
public bool MoveItem(string id, string newParent)
|
public bool MoveItem(string id, string newParent)
|
||||||
{
|
{
|
||||||
return m_Items.MoveItem(id, newParent);
|
return m_Items.MoveItem(id, newParent);
|
||||||
|
|
|
@ -258,17 +258,33 @@ namespace OpenSim.Data.SQLite
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Delete(string field, string val)
|
public virtual bool Delete(string field, string key)
|
||||||
{
|
{
|
||||||
|
return Delete(new string[] { field }, new string[] { key });
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Delete(string[] fields, string[] keys)
|
||||||
|
{
|
||||||
|
if (fields.Length != keys.Length)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
List<string> terms = new List<string>();
|
||||||
|
|
||||||
SqliteCommand cmd = new SqliteCommand();
|
SqliteCommand cmd = new SqliteCommand();
|
||||||
|
|
||||||
cmd.CommandText = String.Format("delete from {0} where `{1}` = :{1}", m_Realm, field);
|
for (int i = 0 ; i < fields.Length ; i++)
|
||||||
cmd.Parameters.Add(new SqliteParameter(field, val));
|
{
|
||||||
|
cmd.Parameters.Add(new SqliteParameter(":" + fields[i], keys[i]));
|
||||||
|
terms.Add("`" + fields[i] + "` = :" + fields[i]);
|
||||||
|
}
|
||||||
|
|
||||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
string where = String.Join(" and ", terms.ToArray());
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
string query = String.Format("delete from {0} where {1}", m_Realm, where);
|
||||||
|
|
||||||
|
cmd.CommandText = query;
|
||||||
|
|
||||||
|
return ExecuteNonQuery(cmd, m_Connection) > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,11 +91,21 @@ namespace OpenSim.Data.SQLite
|
||||||
return m_Folders.Delete(field, val);
|
return m_Folders.Delete(field, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool DeleteFolders(string[] fields, string[] vals)
|
||||||
|
{
|
||||||
|
return m_Folders.Delete(fields, vals);
|
||||||
|
}
|
||||||
|
|
||||||
public bool DeleteItems(string field, string val)
|
public bool DeleteItems(string field, string val)
|
||||||
{
|
{
|
||||||
return m_Items.Delete(field, val);
|
return m_Items.Delete(field, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool DeleteItems(string[] fields, string[] vals)
|
||||||
|
{
|
||||||
|
return m_Items.Delete(fields, vals);
|
||||||
|
}
|
||||||
|
|
||||||
public bool MoveItem(string id, string newParent)
|
public bool MoveItem(string id, string newParent)
|
||||||
{
|
{
|
||||||
return m_Items.MoveItem(id, newParent);
|
return m_Items.MoveItem(id, newParent);
|
||||||
|
|
|
@ -592,9 +592,7 @@ namespace OpenSim.Framework.Console
|
||||||
string line = ReadLine(m_defaultPrompt + "# ", true, true);
|
string line = ReadLine(m_defaultPrompt + "# ", true, true);
|
||||||
|
|
||||||
if (line != String.Empty)
|
if (line != String.Empty)
|
||||||
{
|
Output("Invalid command");
|
||||||
m_log.Info("[CONSOLE] Invalid command");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RunCommand(string cmd)
|
public void RunCommand(string cmd)
|
||||||
|
|
|
@ -77,7 +77,7 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
public delegate void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag);
|
public delegate void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag);
|
||||||
|
|
||||||
public delegate void RequestMapName(IClientAPI remoteClient, string mapName);
|
public delegate void RequestMapName(IClientAPI remoteClient, string mapName, uint flags);
|
||||||
|
|
||||||
public delegate void TeleportLocationRequest(
|
public delegate void TeleportLocationRequest(
|
||||||
IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags);
|
IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags);
|
||||||
|
@ -702,7 +702,7 @@ namespace OpenSim.Framework
|
||||||
bool IsActive { get; set; }
|
bool IsActive { get; set; }
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Determines whether the client is logging out or not.
|
/// Determines whether the client is or has been removed from a given scene
|
||||||
/// </value>
|
/// </value>
|
||||||
bool IsLoggingOut { get; set; }
|
bool IsLoggingOut { get; set; }
|
||||||
|
|
||||||
|
@ -1124,7 +1124,19 @@ namespace OpenSim.Framework
|
||||||
void SendAgentAlertMessage(string message, bool modal);
|
void SendAgentAlertMessage(string message, bool modal);
|
||||||
void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message, string url);
|
void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message, string url);
|
||||||
|
|
||||||
void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch,
|
/// <summary>
|
||||||
|
/// Open a dialog box on the client.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="objectname"></param>
|
||||||
|
/// <param name="objectID"></param>
|
||||||
|
/// <param name="ownerID">/param>
|
||||||
|
/// <param name="ownerFirstName"></param>
|
||||||
|
/// <param name="ownerLastName"></param>
|
||||||
|
/// <param name="msg"></param>
|
||||||
|
/// <param name="textureID"></param>
|
||||||
|
/// <param name="ch"></param>
|
||||||
|
/// <param name="buttonlabels"></param>
|
||||||
|
void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch,
|
||||||
string[] buttonlabels);
|
string[] buttonlabels);
|
||||||
|
|
||||||
bool AddMoney(int debit);
|
bool AddMoney(int debit);
|
||||||
|
|
|
@ -96,251 +96,6 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class SimpleRegionInfo
|
|
||||||
{
|
|
||||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The port by which http communication occurs with the region (most noticeably, CAPS communication)
|
|
||||||
/// </summary>
|
|
||||||
public uint HttpPort
|
|
||||||
{
|
|
||||||
get { return m_httpPort; }
|
|
||||||
set { m_httpPort = value; }
|
|
||||||
}
|
|
||||||
protected uint m_httpPort;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A well-formed URI for the host region server (namely "http://" + ExternalHostName)
|
|
||||||
/// </summary>
|
|
||||||
public string ServerURI
|
|
||||||
{
|
|
||||||
get {
|
|
||||||
if ( m_serverURI != string.Empty ) {
|
|
||||||
return m_serverURI;
|
|
||||||
} else {
|
|
||||||
return "http://" + m_externalHostName + ":" + m_httpPort + "/";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
if ( value.EndsWith("/") ) {
|
|
||||||
m_serverURI = value;
|
|
||||||
} else {
|
|
||||||
m_serverURI = value + '/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected string m_serverURI;
|
|
||||||
|
|
||||||
public string RegionName
|
|
||||||
{
|
|
||||||
get { return m_regionName; }
|
|
||||||
set { m_regionName = value; }
|
|
||||||
}
|
|
||||||
protected string m_regionName = String.Empty;
|
|
||||||
|
|
||||||
protected bool Allow_Alternate_Ports;
|
|
||||||
public bool m_allow_alternate_ports;
|
|
||||||
protected string m_externalHostName;
|
|
||||||
|
|
||||||
protected IPEndPoint m_internalEndPoint;
|
|
||||||
protected uint? m_regionLocX;
|
|
||||||
protected uint? m_regionLocY;
|
|
||||||
protected uint m_remotingPort;
|
|
||||||
public UUID RegionID = UUID.Zero;
|
|
||||||
public string RemotingAddress;
|
|
||||||
public UUID ScopeID = UUID.Zero;
|
|
||||||
|
|
||||||
public SimpleRegionInfo()
|
|
||||||
{
|
|
||||||
m_serverURI = string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleRegionInfo(uint regionLocX, uint regionLocY, IPEndPoint internalEndPoint, string externalUri)
|
|
||||||
{
|
|
||||||
m_regionLocX = regionLocX;
|
|
||||||
m_regionLocY = regionLocY;
|
|
||||||
|
|
||||||
m_internalEndPoint = internalEndPoint;
|
|
||||||
m_externalHostName = externalUri;
|
|
||||||
m_serverURI = string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleRegionInfo(uint regionLocX, uint regionLocY, string externalUri, uint port)
|
|
||||||
{
|
|
||||||
m_regionLocX = regionLocX;
|
|
||||||
m_regionLocY = regionLocY;
|
|
||||||
|
|
||||||
m_externalHostName = externalUri;
|
|
||||||
|
|
||||||
m_internalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int) port);
|
|
||||||
m_serverURI = string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleRegionInfo(RegionInfo ConvertFrom)
|
|
||||||
{
|
|
||||||
m_regionName = ConvertFrom.RegionName;
|
|
||||||
m_regionLocX = ConvertFrom.RegionLocX;
|
|
||||||
m_regionLocY = ConvertFrom.RegionLocY;
|
|
||||||
m_internalEndPoint = ConvertFrom.InternalEndPoint;
|
|
||||||
m_externalHostName = ConvertFrom.ExternalHostName;
|
|
||||||
m_remotingPort = ConvertFrom.RemotingPort;
|
|
||||||
m_httpPort = ConvertFrom.HttpPort;
|
|
||||||
m_allow_alternate_ports = ConvertFrom.m_allow_alternate_ports;
|
|
||||||
RemotingAddress = ConvertFrom.RemotingAddress;
|
|
||||||
RegionID = UUID.Zero;
|
|
||||||
ServerURI = ConvertFrom.ServerURI;
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint RemotingPort
|
|
||||||
{
|
|
||||||
get { return m_remotingPort; }
|
|
||||||
set { m_remotingPort = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// This accessor can throw all the exceptions that Dns.GetHostAddresses can throw.
|
|
||||||
///
|
|
||||||
/// XXX Isn't this really doing too much to be a simple getter, rather than an explict method?
|
|
||||||
/// </value>
|
|
||||||
public IPEndPoint ExternalEndPoint
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
// Old one defaults to IPv6
|
|
||||||
//return new IPEndPoint(Dns.GetHostAddresses(m_externalHostName)[0], m_internalEndPoint.Port);
|
|
||||||
|
|
||||||
IPAddress ia = null;
|
|
||||||
// If it is already an IP, don't resolve it - just return directly
|
|
||||||
if (IPAddress.TryParse(m_externalHostName, out ia))
|
|
||||||
return new IPEndPoint(ia, m_internalEndPoint.Port);
|
|
||||||
|
|
||||||
// Reset for next check
|
|
||||||
ia = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
foreach (IPAddress Adr in Dns.GetHostAddresses(m_externalHostName))
|
|
||||||
{
|
|
||||||
if (ia == null)
|
|
||||||
ia = Adr;
|
|
||||||
|
|
||||||
if (Adr.AddressFamily == AddressFamily.InterNetwork)
|
|
||||||
{
|
|
||||||
ia = Adr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (SocketException e)
|
|
||||||
{
|
|
||||||
throw new Exception(
|
|
||||||
"Unable to resolve local hostname " + m_externalHostName + " innerException of type '" +
|
|
||||||
e + "' attached to this exception", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new IPEndPoint(ia, m_internalEndPoint.Port);
|
|
||||||
}
|
|
||||||
|
|
||||||
set { m_externalHostName = value.ToString(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ExternalHostName
|
|
||||||
{
|
|
||||||
get { return m_externalHostName; }
|
|
||||||
set { m_externalHostName = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public IPEndPoint InternalEndPoint
|
|
||||||
{
|
|
||||||
get { return m_internalEndPoint; }
|
|
||||||
set { m_internalEndPoint = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint RegionLocX
|
|
||||||
{
|
|
||||||
get { return m_regionLocX.Value; }
|
|
||||||
set { m_regionLocX = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint RegionLocY
|
|
||||||
{
|
|
||||||
get { return m_regionLocY.Value; }
|
|
||||||
set { m_regionLocY = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public ulong RegionHandle
|
|
||||||
{
|
|
||||||
get { return Util.UIntsToLong((RegionLocX * (uint) Constants.RegionSize), (RegionLocY * (uint) Constants.RegionSize)); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getInternalEndPointPort()
|
|
||||||
{
|
|
||||||
return m_internalEndPoint.Port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dictionary<string, object> ToKeyValuePairs()
|
|
||||||
{
|
|
||||||
Dictionary<string, object> kvp = new Dictionary<string, object>();
|
|
||||||
kvp["uuid"] = RegionID.ToString();
|
|
||||||
kvp["locX"] = RegionLocX.ToString();
|
|
||||||
kvp["locY"] = RegionLocY.ToString();
|
|
||||||
kvp["external_ip_address"] = ExternalEndPoint.Address.ToString();
|
|
||||||
kvp["external_port"] = ExternalEndPoint.Port.ToString();
|
|
||||||
kvp["external_host_name"] = ExternalHostName;
|
|
||||||
kvp["http_port"] = HttpPort.ToString();
|
|
||||||
kvp["internal_ip_address"] = InternalEndPoint.Address.ToString();
|
|
||||||
kvp["internal_port"] = InternalEndPoint.Port.ToString();
|
|
||||||
kvp["alternate_ports"] = m_allow_alternate_ports.ToString();
|
|
||||||
kvp["server_uri"] = ServerURI;
|
|
||||||
|
|
||||||
return kvp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleRegionInfo(Dictionary<string, object> kvp)
|
|
||||||
{
|
|
||||||
if ((kvp["external_ip_address"] != null) && (kvp["external_port"] != null))
|
|
||||||
{
|
|
||||||
int port = 0;
|
|
||||||
Int32.TryParse((string)kvp["external_port"], out port);
|
|
||||||
IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["external_ip_address"]), port);
|
|
||||||
ExternalEndPoint = ep;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ExternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
|
|
||||||
|
|
||||||
if (kvp["external_host_name"] != null)
|
|
||||||
ExternalHostName = (string)kvp["external_host_name"];
|
|
||||||
|
|
||||||
if (kvp["http_port"] != null)
|
|
||||||
{
|
|
||||||
UInt32 port = 0;
|
|
||||||
UInt32.TryParse((string)kvp["http_port"], out port);
|
|
||||||
HttpPort = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((kvp["internal_ip_address"] != null) && (kvp["internal_port"] != null))
|
|
||||||
{
|
|
||||||
int port = 0;
|
|
||||||
Int32.TryParse((string)kvp["internal_port"], out port);
|
|
||||||
IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["internal_ip_address"]), port);
|
|
||||||
InternalEndPoint = ep;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
|
|
||||||
|
|
||||||
if (kvp["alternate_ports"] != null)
|
|
||||||
{
|
|
||||||
bool alts = false;
|
|
||||||
Boolean.TryParse((string)kvp["alternate_ports"], out alts);
|
|
||||||
m_allow_alternate_ports = alts;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kvp["server_uri"] != null)
|
|
||||||
ServerURI = (string)kvp["server_uri"];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RegionInfo
|
public class RegionInfo
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
|
@ -29,8 +29,8 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
public class VersionInfo
|
public class VersionInfo
|
||||||
{
|
{
|
||||||
private const string VERSION_NUMBER = "0.7.1";
|
private const string VERSION_NUMBER = "0.7.1.1";
|
||||||
private const Flavour VERSION_FLAVOUR = Flavour.Dev;
|
private const Flavour VERSION_FLAVOUR = Flavour.Post_Fixes;
|
||||||
|
|
||||||
public enum Flavour
|
public enum Flavour
|
||||||
{
|
{
|
||||||
|
|
|
@ -140,19 +140,19 @@ namespace OpenSim.Framework
|
||||||
/// PUT JSON-encoded data to a web service that returns LLSD or
|
/// PUT JSON-encoded data to a web service that returns LLSD or
|
||||||
/// JSON data
|
/// JSON data
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static OSDMap PutToService(string url, OSDMap data)
|
public static OSDMap PutToService(string url, OSDMap data, int timeout)
|
||||||
{
|
{
|
||||||
return ServiceOSDRequest(url,data,"PUT",10000);
|
return ServiceOSDRequest(url,data, "PUT", timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OSDMap PostToService(string url, OSDMap data)
|
public static OSDMap PostToService(string url, OSDMap data, int timeout)
|
||||||
{
|
{
|
||||||
return ServiceOSDRequest(url,data,"POST",10000);
|
return ServiceOSDRequest(url, data, "POST", timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OSDMap GetFromService(string url)
|
public static OSDMap GetFromService(string url, int timeout)
|
||||||
{
|
{
|
||||||
return ServiceOSDRequest(url,null,"GET",10000);
|
return ServiceOSDRequest(url, null, "GET", timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout)
|
public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout)
|
||||||
|
@ -809,7 +809,7 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
if ((verb == "POST") || (verb == "PUT"))
|
if ((verb == "POST") || (verb == "PUT"))
|
||||||
{
|
{
|
||||||
request.ContentType = "text/www-form-urlencoded";
|
request.ContentType = "application/x-www-form-urlencoded";
|
||||||
|
|
||||||
int length = 0;
|
int length = 0;
|
||||||
using (StreamWriter writer = new StreamWriter(buffer))
|
using (StreamWriter writer = new StreamWriter(buffer))
|
||||||
|
@ -944,7 +944,7 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
using (WebResponse resp = request.GetResponse())
|
using (WebResponse resp = request.GetResponse())
|
||||||
{
|
{
|
||||||
if (resp.ContentLength > 0)
|
if (resp.ContentLength != 0)
|
||||||
{
|
{
|
||||||
Stream respStream = resp.GetResponseStream();
|
Stream respStream = resp.GetResponseStream();
|
||||||
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
|
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
|
||||||
|
|
|
@ -239,6 +239,8 @@ namespace OpenSim
|
||||||
configSource.AddSwitch("Startup", "physics");
|
configSource.AddSwitch("Startup", "physics");
|
||||||
configSource.AddSwitch("Startup", "gui");
|
configSource.AddSwitch("Startup", "gui");
|
||||||
configSource.AddSwitch("Startup", "console");
|
configSource.AddSwitch("Startup", "console");
|
||||||
|
configSource.AddSwitch("Startup", "save_crashes");
|
||||||
|
configSource.AddSwitch("Startup", "crash_dir");
|
||||||
|
|
||||||
configSource.AddConfig("StandAlone");
|
configSource.AddConfig("StandAlone");
|
||||||
configSource.AddConfig("Network");
|
configSource.AddConfig("Network");
|
||||||
|
|
|
@ -1358,7 +1358,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
|
public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
|
||||||
{
|
{
|
||||||
|
|
||||||
MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
|
MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
|
||||||
|
|
||||||
int maxsend = 10;
|
int maxsend = 10;
|
||||||
|
@ -1465,6 +1464,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
money.MoneyData.TransactionSuccess = success;
|
money.MoneyData.TransactionSuccess = success;
|
||||||
money.MoneyData.Description = description;
|
money.MoneyData.Description = description;
|
||||||
money.MoneyData.MoneyBalance = balance;
|
money.MoneyData.MoneyBalance = balance;
|
||||||
|
money.TransactionInfo.ItemDescription = Util.StringToBytes256("NONE");
|
||||||
OutPacket(money, ThrottleOutPacketType.Task);
|
OutPacket(money, ThrottleOutPacketType.Task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1608,14 +1608,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
currentPacket.ItemData[itemsSent % MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]);
|
currentPacket.ItemData[itemsSent % MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID);
|
||||||
OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
|
OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
|
||||||
currentPacket = null;
|
currentPacket = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentPacket != null)
|
if (currentPacket != null)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID);
|
||||||
OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
|
OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder)
|
private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder)
|
||||||
|
@ -2204,7 +2209,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
OutPacket(loadURL, ThrottleOutPacketType.Task);
|
OutPacket(loadURL, ThrottleOutPacketType.Task);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
public void SendDialog(
|
||||||
|
string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg,
|
||||||
|
UUID textureID, int ch, string[] buttonlabels)
|
||||||
{
|
{
|
||||||
ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
|
ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
|
||||||
dialog.Data.ObjectID = objectID;
|
dialog.Data.ObjectID = objectID;
|
||||||
|
@ -2222,6 +2229,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
buttons[i].ButtonLabel = Util.StringToBytes256(buttonlabels[i]);
|
buttons[i].ButtonLabel = Util.StringToBytes256(buttonlabels[i]);
|
||||||
}
|
}
|
||||||
dialog.Buttons = buttons;
|
dialog.Buttons = buttons;
|
||||||
|
|
||||||
|
dialog.OwnerData = new ScriptDialogPacket.OwnerDataBlock[1];
|
||||||
|
dialog.OwnerData[0] = new ScriptDialogPacket.OwnerDataBlock();
|
||||||
|
dialog.OwnerData[0].OwnerID = ownerID;
|
||||||
|
|
||||||
OutPacket(dialog, ThrottleOutPacketType.Task);
|
OutPacket(dialog, ThrottleOutPacketType.Task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2284,8 +2296,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
OrbitalPosition = (OrbitalPosition - m_sunPainDaHalfOrbitalCutoff) * 0.6666666667f + m_sunPainDaHalfOrbitalCutoff;
|
OrbitalPosition = (OrbitalPosition - m_sunPainDaHalfOrbitalCutoff) * 0.6666666667f + m_sunPainDaHalfOrbitalCutoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
|
SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
|
||||||
viewertime.TimeInfo.SunDirection = Position;
|
viewertime.TimeInfo.SunDirection = Position;
|
||||||
viewertime.TimeInfo.SunAngVelocity = Velocity;
|
viewertime.TimeInfo.SunAngVelocity = Velocity;
|
||||||
|
@ -4764,7 +4774,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
data.RelativePosition.ToBytes(objectData, 0);
|
data.RelativePosition.ToBytes(objectData, 0);
|
||||||
data.Velocity.ToBytes(objectData, 12);
|
data.Velocity.ToBytes(objectData, 12);
|
||||||
data.Acceleration.ToBytes(objectData, 24);
|
data.Acceleration.ToBytes(objectData, 24);
|
||||||
data.RotationOffset.ToBytes(objectData, 36);
|
try
|
||||||
|
{
|
||||||
|
data.RotationOffset.ToBytes(objectData, 36);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.Warn("[LLClientView]: exception converting quaternion to bytes, using Quaternion.Identity. Exception: " + e.ToString());
|
||||||
|
OpenMetaverse.Quaternion.Identity.ToBytes(objectData, 36);
|
||||||
|
}
|
||||||
data.AngularVelocity.ToBytes(objectData, 48);
|
data.AngularVelocity.ToBytes(objectData, 48);
|
||||||
|
|
||||||
ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
|
ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
@ -5882,7 +5900,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
|
AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
|
||||||
for (int i = 0; i < nowWearing.WearableData.Length; i++)
|
for (int i = 0; i < nowWearing.WearableData.Length; i++)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[XXX]: Wearable type {0} item {1}", nowWearing.WearableData[i].WearableType, nowWearing.WearableData[i].ItemID);
|
//m_log.DebugFormat("[XXX]: Wearable type {0} item {1}", nowWearing.WearableData[i].WearableType, nowWearing.WearableData[i].ItemID);
|
||||||
AvatarWearingArgs.Wearable wearable =
|
AvatarWearingArgs.Wearable wearable =
|
||||||
new AvatarWearingArgs.Wearable(nowWearing.WearableData[i].ItemID,
|
new AvatarWearingArgs.Wearable(nowWearing.WearableData[i].ItemID,
|
||||||
nowWearing.WearableData[i].WearableType);
|
nowWearing.WearableData[i].WearableType);
|
||||||
|
@ -8164,13 +8182,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
string mapName = Util.UTF8.GetString(map.NameData.Name, 0,
|
string mapName = Util.UTF8.GetString(map.NameData.Name, 0,
|
||||||
map.NameData.Name.Length - 1);
|
map.NameData.Name.Length - 1);
|
||||||
RequestMapName handlerMapNameRequest = OnMapNameRequest;
|
RequestMapName handlerMapNameRequest = OnMapNameRequest;
|
||||||
if (handlerMapNameRequest != null)
|
if (handlerMapNameRequest != null)
|
||||||
{
|
{
|
||||||
handlerMapNameRequest(this, mapName);
|
handlerMapNameRequest(this, mapName, map.AgentData.Flags);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,8 +41,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AgentAssetTransactions
|
public class AgentAssetTransactions
|
||||||
{
|
{
|
||||||
// private static readonly ILog m_log = LogManager.GetLogger(
|
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
// MethodBase.GetCurrentMethod().DeclaringType);
|
|
||||||
|
|
||||||
// Fields
|
// Fields
|
||||||
private bool m_dumpAssetsToFile;
|
private bool m_dumpAssetsToFile;
|
||||||
|
@ -149,6 +148,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||||
|
|
||||||
if (asset != null)
|
if (asset != null)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[AGENT ASSETS TRANSACTIONS]: Updating item {0} in {1} for transaction {2}",
|
||||||
|
// item.Name, part.Name, transactionID);
|
||||||
|
|
||||||
asset.FullID = UUID.Random();
|
asset.FullID = UUID.Random();
|
||||||
asset.Name = item.Name;
|
asset.Name = item.Name;
|
||||||
asset.Description = item.Description;
|
asset.Description = item.Description;
|
||||||
|
@ -156,8 +159,6 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||||
item.AssetID = asset.FullID;
|
item.AssetID = asset.FullID;
|
||||||
|
|
||||||
m_Scene.AssetService.Store(asset);
|
m_Scene.AssetService.Store(asset);
|
||||||
|
|
||||||
part.Inventory.UpdateInventoryItem(item);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,8 +64,8 @@ namespace OpenSim.Region.CoreModules.Agent.Capabilities
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
|
m_scene.RegisterModuleInterface<ICapabilitiesModule>(this);
|
||||||
MainConsole.Instance.Commands.AddCommand("Capabilities", false, "show caps",
|
MainConsole.Instance.Commands.AddCommand("Capabilities", false, "show caps",
|
||||||
"show capabilities",
|
"show caps",
|
||||||
"Shows all registered capabilities", CapabilitiesCommand);
|
"Shows all registered capabilities", CapabilitiesCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
|
|
|
@ -70,7 +70,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets
|
||||||
if (meshConfig == null)
|
if (meshConfig == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_enabled = meshConfig.GetBoolean("ColladaMesh", true);
|
m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddRegion(Scene pScene)
|
public void AddRegion(Scene pScene)
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets
|
||||||
if (meshConfig == null)
|
if (meshConfig == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_enabled = meshConfig.GetBoolean("ColladaMesh", true);
|
m_enabled = meshConfig.GetBoolean("AllowMeshUpload", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddRegion(Scene pScene)
|
public void AddRegion(Scene pScene)
|
||||||
|
|
|
@ -124,7 +124,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
|
||||||
|
|
||||||
ScenePresence sp = m_scene.GetScenePresence(avatarID);
|
ScenePresence sp = m_scene.GetScenePresence(avatarID);
|
||||||
if (sp != null)
|
if (sp != null)
|
||||||
sp.ControllingClient.SendDialog(objectName, objectID, ownerFirstName, ownerLastName, message, textureID, ch, buttonlabels);
|
sp.ControllingClient.SendDialog(
|
||||||
|
objectName, objectID, ownerID, ownerFirstName, ownerLastName, message, textureID, ch, buttonlabels);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendUrlToUser(
|
public void SendUrlToUser(
|
||||||
|
|
|
@ -150,7 +150,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
string serialization = UserInventoryItemSerializer.Serialize(inventoryItem, options, userAccountService);
|
string serialization = UserInventoryItemSerializer.Serialize(inventoryItem, options, userAccountService);
|
||||||
m_archiveWriter.WriteFile(filename, serialization);
|
m_archiveWriter.WriteFile(filename, serialization);
|
||||||
|
|
||||||
m_assetGatherer.GatherAssetUuids(inventoryItem.AssetID, (AssetType)inventoryItem.AssetType, m_assetUuids);
|
AssetType itemAssetType = (AssetType)inventoryItem.AssetType;
|
||||||
|
|
||||||
|
// Don't chase down link asset items as they actually point to their target item IDs rather than an asset
|
||||||
|
if (itemAssetType != AssetType.Link && itemAssetType != AssetType.LinkFolder)
|
||||||
|
m_assetGatherer.GatherAssetUuids(inventoryItem.AssetID, (AssetType)inventoryItem.AssetType, m_assetUuids);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -371,7 +371,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a hook to do some per-asset post-processing for subclasses that need that
|
// This is a hook to do some per-asset post-processing for subclasses that need that
|
||||||
ExportAsset(remoteClient.AgentId, assetID);
|
if (remoteClient != null)
|
||||||
|
ExportAsset(remoteClient.AgentId, assetID);
|
||||||
|
|
||||||
return assetID;
|
return assetID;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
@ -58,25 +59,44 @@ namespace OpenSim.Region.CoreModules.Hypergrid
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
protected override void GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
protected override List<MapBlockData> GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
||||||
{
|
{
|
||||||
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
||||||
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
||||||
(minX - 4) * (int)Constants.RegionSize, (maxX + 4) * (int)Constants.RegionSize,
|
minX * (int)Constants.RegionSize, maxX * (int)Constants.RegionSize,
|
||||||
(minY - 4) * (int)Constants.RegionSize, (maxY + 4) * (int)Constants.RegionSize);
|
minY * (int)Constants.RegionSize, maxY * (int)Constants.RegionSize);
|
||||||
|
|
||||||
foreach (GridRegion r in regions)
|
foreach (GridRegion r in regions)
|
||||||
{
|
{
|
||||||
MapBlockData block = new MapBlockData();
|
uint x = 0, y = 0;
|
||||||
MapBlockFromGridRegion(block, r);
|
long handle = 0;
|
||||||
mapBlocks.Add(block);
|
if (r.RegionSecret != null && r.RegionSecret != string.Empty)
|
||||||
|
{
|
||||||
|
if (long.TryParse(r.RegionSecret, out handle))
|
||||||
|
{
|
||||||
|
Utils.LongToUInts((ulong)handle, out x, out y);
|
||||||
|
x = x / Constants.RegionSize;
|
||||||
|
y = y / Constants.RegionSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handle == 0 ||
|
||||||
|
// Check the distance from the current region
|
||||||
|
(handle != 0 && Math.Abs((int)(x - m_scene.RegionInfo.RegionLocX)) < 4096 && Math.Abs((int)(y - m_scene.RegionInfo.RegionLocY)) < 4096))
|
||||||
|
{
|
||||||
|
MapBlockData block = new MapBlockData();
|
||||||
|
MapBlockFromGridRegion(block, r);
|
||||||
|
mapBlocks.Add(block);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Different from super
|
// Different from super
|
||||||
FillInMap(mapBlocks, minX, minY, maxX, maxY);
|
FillInMap(mapBlocks, minX, minY, maxX, maxY);
|
||||||
//
|
//
|
||||||
|
|
||||||
remoteClient.SendMapBlock(mapBlocks, flag);
|
remoteClient.SendMapBlock(mapBlocks, 0);
|
||||||
|
|
||||||
|
return mapBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,7 +113,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
|
||||||
mblock.X = (ushort)x;
|
mblock.X = (ushort)x;
|
||||||
mblock.Y = (ushort)y;
|
mblock.Y = (ushort)y;
|
||||||
mblock.Name = "";
|
mblock.Name = "";
|
||||||
mblock.Access = 254; // not here???
|
mblock.Access = 254; // means 'simulator is offline'. We need this because the viewer ignores 255's
|
||||||
mblock.MapImageId = UUID.Zero;
|
mblock.MapImageId = UUID.Zero;
|
||||||
mapBlocks.Add(mblock);
|
mapBlocks.Add(mblock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,9 +182,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
||||||
{
|
{
|
||||||
InventoryCollection invCol = m_InventoryService.GetFolderContent(userID, folderID);
|
InventoryCollection invCol = m_InventoryService.GetFolderContent(userID, folderID);
|
||||||
if (UserManager != null)
|
Util.FireAndForget(delegate
|
||||||
foreach (InventoryItemBase item in invCol.Items)
|
{
|
||||||
UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
if (UserManager != null)
|
||||||
|
foreach (InventoryItemBase item in invCol.Items)
|
||||||
|
UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
||||||
|
});
|
||||||
|
|
||||||
return invCol;
|
return invCol;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,10 +46,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private bool m_Enabled = false;
|
private bool m_Enabled = false;
|
||||||
private bool m_Initialized = false;
|
private Scene m_Scene;
|
||||||
// private Scene m_Scene;
|
|
||||||
private XInventoryServicesConnector m_RemoteConnector;
|
private XInventoryServicesConnector m_RemoteConnector;
|
||||||
|
|
||||||
|
private IUserManagement m_UserManager;
|
||||||
|
private IUserManagement UserManager
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (m_UserManager == null)
|
||||||
|
{
|
||||||
|
m_UserManager = m_Scene.RequestModuleInterface<IUserManagement>();
|
||||||
|
}
|
||||||
|
return m_UserManager;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Type ReplaceableInterface
|
public Type ReplaceableInterface
|
||||||
{
|
{
|
||||||
get { return null; }
|
get { return null; }
|
||||||
|
@ -114,12 +126,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
if (!m_Enabled)
|
if (!m_Enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!m_Initialized)
|
|
||||||
{
|
|
||||||
m_Initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
scene.RegisterModuleInterface<IInventoryService>(this);
|
scene.RegisterModuleInterface<IInventoryService>(this);
|
||||||
|
|
||||||
|
if (m_Scene == null)
|
||||||
|
m_Scene = scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
|
@ -173,7 +183,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
||||||
{
|
{
|
||||||
return m_RemoteConnector.GetFolderContent(userID, folderID);
|
InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID);
|
||||||
|
Util.FireAndForget(delegate
|
||||||
|
{
|
||||||
|
if (UserManager != null)
|
||||||
|
foreach (InventoryItemBase item in invCol.Items)
|
||||||
|
UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
||||||
|
});
|
||||||
|
|
||||||
|
return invCol;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
|
public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
|
||||||
|
|
|
@ -347,12 +347,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
|
|
||||||
landData.Add(parcel);
|
landData.Add(parcel);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_merge)
|
if (!m_merge)
|
||||||
m_scene.LandChannel.Clear(false);
|
{
|
||||||
|
bool setupDefaultParcel = (landData.Count == 0);
|
||||||
|
m_scene.LandChannel.Clear(setupDefaultParcel);
|
||||||
|
}
|
||||||
|
|
||||||
m_scene.EventManager.TriggerIncomingLandDataFromStorage(landData);
|
m_scene.EventManager.TriggerIncomingLandDataFromStorage(landData);
|
||||||
m_log.InfoFormat("[ARCHIVER]: Restored {0} parcels.", landData.Count);
|
m_log.InfoFormat("[ARCHIVER]: Restored {0} parcels.", landData.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -230,6 +230,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
/// <param name="asset"></param>
|
/// <param name="asset"></param>
|
||||||
public void AssetRequestCallback(string id, object sender, AssetBase asset)
|
public void AssetRequestCallback(string id, object sender, AssetBase asset)
|
||||||
{
|
{
|
||||||
|
Culture.SetCurrentCulture();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
lock (this)
|
lock (this)
|
||||||
|
@ -293,6 +295,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected void PerformAssetsRequestCallback(object o)
|
protected void PerformAssetsRequestCallback(object o)
|
||||||
{
|
{
|
||||||
|
Culture.SetCurrentCulture();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_assetsRequestCallback(m_foundAssetUuids, m_notFoundAssetUuids);
|
m_assetsRequestCallback(m_foundAssetUuids, m_notFoundAssetUuids);
|
||||||
|
|
|
@ -313,6 +313,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
|
||||||
Assert.That(loadedSoundAsset, Is.Not.Null, "loaded sound asset was null");
|
Assert.That(loadedSoundAsset, Is.Not.Null, "loaded sound asset was null");
|
||||||
Assert.That(loadedSoundAsset.Data, Is.EqualTo(soundData), "saved and loaded sound data do not match");
|
Assert.That(loadedSoundAsset.Data, Is.EqualTo(soundData), "saved and loaded sound data do not match");
|
||||||
|
|
||||||
|
Assert.Greater(m_scene.LandChannel.AllParcels().Count, 0, "incorrect number of parcels");
|
||||||
|
|
||||||
// Temporary
|
// Temporary
|
||||||
Console.WriteLine("Successfully completed {0}", MethodBase.GetCurrentMethod());
|
Console.WriteLine("Successfully completed {0}", MethodBase.GetCurrentMethod());
|
||||||
}
|
}
|
||||||
|
|
|
@ -668,14 +668,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
//m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
|
//m_scene.SimulationDataService.RemoveLandObject(lo.LandData.GlobalID);
|
||||||
m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
|
m_scene.EventManager.TriggerLandObjectRemoved(lo.LandData.GlobalID);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_landList.Clear();
|
m_landList.Clear();
|
||||||
|
|
||||||
|
ResetSimLandObjects();
|
||||||
|
|
||||||
|
if (setupDefaultParcel)
|
||||||
|
CreateDefaultParcel();
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetSimLandObjects();
|
|
||||||
|
|
||||||
if (setupDefaultParcel)
|
|
||||||
CreateDefaultParcel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void performFinalLandJoin(ILandObject master, ILandObject slave)
|
private void performFinalLandJoin(ILandObject master, ILandObject slave)
|
||||||
|
@ -1391,8 +1391,11 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public void EventManagerOnNoLandDataFromStorage()
|
public void EventManagerOnNoLandDataFromStorage()
|
||||||
{
|
{
|
||||||
ResetSimLandObjects();
|
lock (m_landList)
|
||||||
CreateDefaultParcel();
|
{
|
||||||
|
ResetSimLandObjects();
|
||||||
|
CreateDefaultParcel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -84,7 +84,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
client.OnMapNameRequest += OnMapNameRequest;
|
client.OnMapNameRequest += OnMapNameRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMapNameRequest(IClientAPI remoteClient, string mapName)
|
private void OnMapNameRequest(IClientAPI remoteClient, string mapName, uint flags)
|
||||||
{
|
{
|
||||||
if (mapName.Length < 3)
|
if (mapName.Length < 3)
|
||||||
{
|
{
|
||||||
|
@ -106,7 +106,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
else if (regionInfos.Count == 0 && mapName.StartsWith("http://"))
|
else if (regionInfos.Count == 0 && mapName.StartsWith("http://"))
|
||||||
remoteClient.SendAlertMessage("Hyperlink could not be established.");
|
remoteClient.SendAlertMessage("Hyperlink could not be established.");
|
||||||
|
|
||||||
m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count);
|
m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags);
|
||||||
List<MapBlockData> blocks = new List<MapBlockData>();
|
List<MapBlockData> blocks = new List<MapBlockData>();
|
||||||
|
|
||||||
MapBlockData data;
|
MapBlockData data;
|
||||||
|
@ -117,7 +117,10 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
data = new MapBlockData();
|
data = new MapBlockData();
|
||||||
data.Agents = 0;
|
data.Agents = 0;
|
||||||
data.Access = info.Access;
|
data.Access = info.Access;
|
||||||
data.MapImageId = UUID.Zero; // could use info.TerrainImage but it seems to break viewer2
|
if (flags == 2) // V2 sends this
|
||||||
|
data.MapImageId = UUID.Zero;
|
||||||
|
else
|
||||||
|
data.MapImageId = info.TerrainImage;
|
||||||
data.Name = info.RegionName;
|
data.Name = info.RegionName;
|
||||||
data.RegionFlags = 0; // TODO not used?
|
data.RegionFlags = 0; // TODO not used?
|
||||||
data.WaterHeight = 0; // not used
|
data.WaterHeight = 0; // not used
|
||||||
|
@ -139,9 +142,9 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
data.Y = 0;
|
data.Y = 0;
|
||||||
blocks.Add(data);
|
blocks.Add(data);
|
||||||
|
|
||||||
// not sure what the flags do here, but seems to be necessary
|
// flags are agent flags sent from the viewer.
|
||||||
// to set to "2" for viewer 2
|
// they have different values depending on different viewers, apparently
|
||||||
remoteClient.SendMapBlock(blocks, 2);
|
remoteClient.SendMapBlock(blocks, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// private Scene GetClientScene(IClientAPI client)
|
// private Scene GetClientScene(IClientAPI client)
|
||||||
|
|
|
@ -205,8 +205,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
{
|
{
|
||||||
//try
|
//try
|
||||||
//{
|
//{
|
||||||
//m_log.DebugFormat("[MAPLAYER]: request: {0}, path: {1}, param: {2}, agent:{3}",
|
//m_log.DebugFormat("[MAPLAYER]: path: {0}, param: {1}, agent:{2}",
|
||||||
//request, path, param,agentID.ToString());
|
// path, param, agentID.ToString());
|
||||||
|
|
||||||
// this is here because CAPS map requests work even beyond the 10,000 limit.
|
// this is here because CAPS map requests work even beyond the 10,000 limit.
|
||||||
ScenePresence avatarPresence = null;
|
ScenePresence avatarPresence = null;
|
||||||
|
@ -233,20 +233,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
}
|
}
|
||||||
if (lookup)
|
if (lookup)
|
||||||
{
|
{
|
||||||
List<MapBlockData> mapBlocks = new List<MapBlockData>(); ;
|
List<MapBlockData> mapBlocks = GetAndSendBlocks(avatarPresence.ControllingClient, (int)(m_scene.RegionInfo.RegionLocX) - 4, (int)(m_scene.RegionInfo.RegionLocY) - 4,
|
||||||
|
(int)(m_scene.RegionInfo.RegionLocX) + 4, (int)(m_scene.RegionInfo.RegionLocY) + 4, 0);
|
||||||
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
|
||||||
(int)(m_scene.RegionInfo.RegionLocX - 8) * (int)Constants.RegionSize,
|
|
||||||
(int)(m_scene.RegionInfo.RegionLocX + 8) * (int)Constants.RegionSize,
|
|
||||||
(int)(m_scene.RegionInfo.RegionLocY - 8) * (int)Constants.RegionSize,
|
|
||||||
(int)(m_scene.RegionInfo.RegionLocY + 8) * (int)Constants.RegionSize);
|
|
||||||
foreach (GridRegion r in regions)
|
|
||||||
{
|
|
||||||
MapBlockData block = new MapBlockData();
|
|
||||||
MapBlockFromGridRegion(block, r);
|
|
||||||
mapBlocks.Add(block);
|
|
||||||
}
|
|
||||||
avatarPresence.ControllingClient.SendMapBlock(mapBlocks, 0);
|
|
||||||
|
|
||||||
lock (cachedMapBlocks)
|
lock (cachedMapBlocks)
|
||||||
cachedMapBlocks = mapBlocks;
|
cachedMapBlocks = mapBlocks;
|
||||||
|
@ -784,7 +772,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
/// <param name="maxY"></param>
|
/// <param name="maxY"></param>
|
||||||
public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
||||||
{
|
{
|
||||||
if ((flag & 0x10000) != 0) // user clicked on the map a tile that isn't visible
|
//m_log.ErrorFormat("[YYY] RequestMapBlocks {0}={1}={2}={3} {4}", minX, minY, maxX, maxY, flag);
|
||||||
|
if ((flag & 0x10000) != 0) // user clicked on qthe map a tile that isn't visible
|
||||||
{
|
{
|
||||||
List<MapBlockData> response = new List<MapBlockData>();
|
List<MapBlockData> response = new List<MapBlockData>();
|
||||||
|
|
||||||
|
@ -819,7 +808,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
MapBlockData block = new MapBlockData();
|
MapBlockData block = new MapBlockData();
|
||||||
block.X = (ushort)minX;
|
block.X = (ushort)minX;
|
||||||
block.Y = (ushort)minY;
|
block.Y = (ushort)minY;
|
||||||
block.Access = 254; // == not there
|
block.Access = 254; // means 'simulator is offline'
|
||||||
response.Add(block);
|
response.Add(block);
|
||||||
}
|
}
|
||||||
remoteClient.SendMapBlock(response, 0);
|
remoteClient.SendMapBlock(response, 0);
|
||||||
|
@ -831,7 +820,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
protected virtual List<MapBlockData> GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag)
|
||||||
{
|
{
|
||||||
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
List<MapBlockData> mapBlocks = new List<MapBlockData>();
|
||||||
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
List<GridRegion> regions = m_scene.GridService.GetRegionRange(m_scene.RegionInfo.ScopeID,
|
||||||
|
@ -845,7 +834,9 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
MapBlockFromGridRegion(block, r);
|
MapBlockFromGridRegion(block, r);
|
||||||
mapBlocks.Add(block);
|
mapBlocks.Add(block);
|
||||||
}
|
}
|
||||||
remoteClient.SendMapBlock(mapBlocks, flag);
|
remoteClient.SendMapBlock(mapBlocks, 0);
|
||||||
|
|
||||||
|
return mapBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void MapBlockFromGridRegion(MapBlockData block, GridRegion r)
|
protected void MapBlockFromGridRegion(MapBlockData block, GridRegion r)
|
||||||
|
|
|
@ -540,7 +540,7 @@ namespace OpenSim.Region.Examples.SimpleModule
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
public virtual void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
* 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.Reflection;
|
||||||
|
using System.Threading;
|
||||||
|
using log4net;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Framework.Scenes
|
||||||
|
{
|
||||||
|
class FetchHolder
|
||||||
|
{
|
||||||
|
public IClientAPI Client { get; private set; }
|
||||||
|
public UUID ItemID { get; private set; }
|
||||||
|
|
||||||
|
public FetchHolder(IClientAPI client, UUID itemID)
|
||||||
|
{
|
||||||
|
Client = client;
|
||||||
|
ItemID = itemID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send FetchInventoryReply information to clients asynchronously on a single thread rather than asynchronously via
|
||||||
|
/// multiple threads.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// If the main root inventory is right-clicked on a version 1 viewer for a user with a large inventory, a very
|
||||||
|
/// very large number of FetchInventory requests are sent to the simulator. Each is handled on a separate thread
|
||||||
|
/// by the IClientAPI, but the sheer number of requests overwhelms the number of threads available and ends up
|
||||||
|
/// freezing the inbound packet handling.
|
||||||
|
///
|
||||||
|
/// This class makes the first FetchInventory packet thread process the queue. If new requests come
|
||||||
|
/// in while it is processing, then the subsequent threads just add the requests and leave it to the original
|
||||||
|
/// thread to process them.
|
||||||
|
///
|
||||||
|
/// This might slow down outbound packets but these are limited by the IClientAPI outbound queues
|
||||||
|
/// anyway.
|
||||||
|
///
|
||||||
|
/// It might be possible to ignore FetchInventory requests altogether, particularly as they are redundant wrt to
|
||||||
|
/// FetchInventoryDescendents requests, but this would require more investigation.
|
||||||
|
/// </remarks>
|
||||||
|
public class AsyncInventorySender
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
protected Scene m_scene;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Queues fetch requests
|
||||||
|
/// </summary>
|
||||||
|
Queue<FetchHolder> m_fetchHolder = new Queue<FetchHolder>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Signal whether a queue is currently being processed or not.
|
||||||
|
/// </summary>
|
||||||
|
protected volatile bool m_processing;
|
||||||
|
|
||||||
|
public AsyncInventorySender(Scene scene)
|
||||||
|
{
|
||||||
|
m_processing = false;
|
||||||
|
m_scene = scene;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle a fetch inventory request from the client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
/// <param name="itemID"></param>
|
||||||
|
/// <param name="ownerID"></param>
|
||||||
|
public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID)
|
||||||
|
{
|
||||||
|
lock (m_fetchHolder)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[ASYNC INVENTORY SENDER]: Putting request from {0} for {1} on queue", remoteClient.Name, itemID);
|
||||||
|
|
||||||
|
m_fetchHolder.Enqueue(new FetchHolder(remoteClient, itemID));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_processing)
|
||||||
|
{
|
||||||
|
m_processing = true;
|
||||||
|
ProcessQueue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Process the queue of fetches
|
||||||
|
/// </summary>
|
||||||
|
protected void ProcessQueue()
|
||||||
|
{
|
||||||
|
FetchHolder fh = null;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
lock (m_fetchHolder)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASYNC INVENTORY SENDER]: {0} items left to process", m_fetchHolder.Count);
|
||||||
|
|
||||||
|
if (m_fetchHolder.Count == 0)
|
||||||
|
{
|
||||||
|
m_processing = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fh = m_fetchHolder.Dequeue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fh.Client.IsLoggingOut)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[ASYNC INVENTORY SENDER]: Handling request from {0} for {1} on queue", fh.Client.Name, fh.ItemID);
|
||||||
|
|
||||||
|
InventoryItemBase item = new InventoryItemBase(fh.ItemID, fh.Client.AgentId);
|
||||||
|
item = m_scene.InventoryService.GetItem(item);
|
||||||
|
|
||||||
|
if (item != null)
|
||||||
|
fh.Client.SendInventoryItemDetails(item.Owner, item);
|
||||||
|
|
||||||
|
// TODO: Possibly log any failure
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -51,6 +51,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected AsyncSceneObjectGroupDeleter m_asyncSceneObjectDeleter;
|
protected AsyncSceneObjectGroupDeleter m_asyncSceneObjectDeleter;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Allows inventory details to be sent to clients asynchronously
|
||||||
|
/// </summary>
|
||||||
|
protected AsyncInventorySender m_asyncInventorySender;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Start all the scripts in the scene which should be started.
|
/// Start all the scripts in the scene which should be started.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -713,7 +718,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
newName = item.Name;
|
newName = item.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (remoteClient.AgentId == oldAgentID)
|
if (remoteClient.AgentId == oldAgentID || (LibraryService != null && LibraryService.LibraryRootFolder != null && oldAgentID == LibraryService.LibraryRootFolder.Owner))
|
||||||
{
|
{
|
||||||
CreateNewInventoryItem(
|
CreateNewInventoryItem(
|
||||||
remoteClient, item.CreatorId, item.CreatorData, newFolderID, newName, item.Flags, callbackID, asset, (sbyte)item.InvType,
|
remoteClient, item.CreatorId, item.CreatorData, newFolderID, newName, item.Flags, callbackID, asset, (sbyte)item.InvType,
|
||||||
|
@ -904,11 +909,29 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Link an inventory item to an existing item.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// The linkee item id is placed in the asset id slot. This appears to be what the viewer expects when
|
||||||
|
/// it receives inventory information.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
/// <param name="transActionID"></param>
|
||||||
|
/// <param name="folderID"></param>
|
||||||
|
/// <param name="callbackID"></param>
|
||||||
|
/// <param name="description"></param>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="invType"></param>
|
||||||
|
/// <param name="type">/param>
|
||||||
|
/// <param name="olditemID"></param>
|
||||||
private void HandleLinkInventoryItem(IClientAPI remoteClient, UUID transActionID, UUID folderID,
|
private void HandleLinkInventoryItem(IClientAPI remoteClient, UUID transActionID, UUID folderID,
|
||||||
uint callbackID, string description, string name,
|
uint callbackID, string description, string name,
|
||||||
sbyte invType, sbyte type, UUID olditemID)
|
sbyte invType, sbyte type, UUID olditemID)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item link {0} in folder {1} pointing to {2}", name, folderID, olditemID);
|
// m_log.DebugFormat(
|
||||||
|
// "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}",
|
||||||
|
// remoteClient.Name, name, folderID, olditemID);
|
||||||
|
|
||||||
if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
|
if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
|
||||||
return;
|
return;
|
||||||
|
@ -916,7 +939,25 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
ScenePresence presence;
|
ScenePresence presence;
|
||||||
if (TryGetScenePresence(remoteClient.AgentId, out presence))
|
if (TryGetScenePresence(remoteClient.AgentId, out presence))
|
||||||
{
|
{
|
||||||
// byte[] data = null;
|
// Disabled the check for duplicate links.
|
||||||
|
//
|
||||||
|
// When outfits are being adjusted, the viewer rapidly sends delete link messages followed by
|
||||||
|
// create links. However, since these are handled asynchronously, the deletes do not complete before
|
||||||
|
// the creates are handled. Therefore, we cannot enforce a duplicate link check.
|
||||||
|
// InventoryItemBase existingLink = null;
|
||||||
|
// List<InventoryItemBase> existingItems = InventoryService.GetFolderItems(remoteClient.AgentId, folderID);
|
||||||
|
// foreach (InventoryItemBase item in existingItems)
|
||||||
|
// if (item.AssetID == olditemID)
|
||||||
|
// existingLink = item;
|
||||||
|
//
|
||||||
|
// if (existingLink != null)
|
||||||
|
// {
|
||||||
|
// m_log.WarnFormat(
|
||||||
|
// "[AGENT INVENTORY]: Ignoring request from {0} to create item link {1} in folder {2} pointing to {3} since a link named {4} with id {5} already exists",
|
||||||
|
// remoteClient.Name, name, folderID, olditemID, existingLink.Name, existingLink.ID);
|
||||||
|
//
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
AssetBase asset = new AssetBase();
|
AssetBase asset = new AssetBase();
|
||||||
asset.FullID = olditemID;
|
asset.FullID = olditemID;
|
||||||
|
@ -944,7 +985,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="itemID"></param>
|
/// <param name="itemID"></param>
|
||||||
private void RemoveInventoryItem(IClientAPI remoteClient, List<UUID> itemIDs)
|
private void RemoveInventoryItem(IClientAPI remoteClient, List<UUID> itemIDs)
|
||||||
{
|
{
|
||||||
//m_log.Debug("[SCENE INVENTORY]: user " + remoteClient.AgentId);
|
// m_log.DebugFormat(
|
||||||
|
// "[AGENT INVENTORY]: Removing inventory items {0} for {1}",
|
||||||
|
// string.Join(",", itemIDs.ConvertAll<string>(uuid => uuid.ToString()).ToArray()),
|
||||||
|
// remoteClient.Name);
|
||||||
|
|
||||||
InventoryService.DeleteItems(remoteClient.AgentId, itemIDs);
|
InventoryService.DeleteItems(remoteClient.AgentId, itemIDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1351,11 +1396,31 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
InventoryFolderBase containingFolder = new InventoryFolderBase(folder.ID, client.AgentId);
|
InventoryFolderBase containingFolder = new InventoryFolderBase(folder.ID, client.AgentId);
|
||||||
containingFolder = InventoryService.GetFolder(containingFolder);
|
containingFolder = InventoryService.GetFolder(containingFolder);
|
||||||
|
|
||||||
//m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}",
|
// m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}",
|
||||||
// contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName);
|
// contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName);
|
||||||
|
|
||||||
if (containingFolder != null && containingFolder != null)
|
if (containingFolder != null && containingFolder != null)
|
||||||
|
{
|
||||||
|
// If the folder requested contains links, then we need to send those folders first, otherwise the links
|
||||||
|
// will be broken in the viewer.
|
||||||
|
HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>();
|
||||||
|
foreach (InventoryItemBase item in contents.Items)
|
||||||
|
{
|
||||||
|
if (item.AssetType == (int)AssetType.Link)
|
||||||
|
{
|
||||||
|
InventoryItemBase linkedItem = InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||||
|
|
||||||
|
// Take care of genuinely broken links where the target doesn't exist
|
||||||
|
if (linkedItem != null)
|
||||||
|
linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
||||||
|
SendInventoryUpdate(client, new InventoryFolderBase(linkedItemFolderId), false, true);
|
||||||
|
|
||||||
client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, containingFolder.Version, fetchFolders, fetchItems);
|
client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, containingFolder.Version, fetchFolders, fetchItems);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1430,6 +1495,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
else // Updating existing item with new perms etc
|
else // Updating existing item with new perms etc
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[PRIM INVENTORY]: Updating item {0} in {1} for UpdateTaskInventory()",
|
||||||
|
// currentItem.Name, part.Name);
|
||||||
|
|
||||||
IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
|
IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
|
||||||
if (agentTransactions != null)
|
if (agentTransactions != null)
|
||||||
{
|
{
|
||||||
|
@ -2039,6 +2108,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (rot != null)
|
if (rot != null)
|
||||||
group.UpdateGroupRotationR((Quaternion)rot);
|
group.UpdateGroupRotationR((Quaternion)rot);
|
||||||
|
|
||||||
|
// TODO: This needs to be refactored with the similar code in
|
||||||
|
// SceneGraph.AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, Vector3 pos, Quaternion rot, Vector3 vel)
|
||||||
|
// possibly by allowing this method to take a null rotation.
|
||||||
|
if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
|
||||||
|
group.RootPart.ApplyImpulse((vel * group.GetMass()), false);
|
||||||
|
|
||||||
// We can only call this after adding the scene object, since the scene object references the scene
|
// We can only call this after adding the scene object, since the scene object references the scene
|
||||||
// to find out if scripts should be activated at all.
|
// to find out if scripts should be activated at all.
|
||||||
group.CreateScriptInstances(param, true, DefaultScriptEngine, 3);
|
group.CreateScriptInstances(param, true, DefaultScriptEngine, 3);
|
||||||
|
|
|
@ -461,31 +461,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handle a fetch inventory request from the client
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="remoteClient"></param>
|
|
||||||
/// <param name="itemID"></param>
|
|
||||||
/// <param name="ownerID"></param>
|
|
||||||
public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID)
|
|
||||||
{
|
|
||||||
if (LibraryService != null && LibraryService.LibraryRootFolder != null && ownerID == LibraryService.LibraryRootFolder.Owner)
|
|
||||||
{
|
|
||||||
//m_log.Debug("request info for library item");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
|
|
||||||
item = InventoryService.GetItem(item);
|
|
||||||
|
|
||||||
if (item != null)
|
|
||||||
{
|
|
||||||
remoteClient.SendInventoryItemDetails(ownerID, item);
|
|
||||||
}
|
|
||||||
// else shouldn't we send an alert message?
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tell the client about the various child items and folders contained in the requested folder.
|
/// Tell the client about the various child items and folders contained in the requested folder.
|
||||||
|
@ -499,6 +474,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public void HandleFetchInventoryDescendents(IClientAPI remoteClient, UUID folderID, UUID ownerID,
|
public void HandleFetchInventoryDescendents(IClientAPI remoteClient, UUID folderID, UUID ownerID,
|
||||||
bool fetchFolders, bool fetchItems, int sortOrder)
|
bool fetchFolders, bool fetchItems, int sortOrder)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[USER INVENTORY]: HandleFetchInventoryDescendents() for {0}, folder={1}, fetchFolders={2}, fetchItems={3}, sortOrder={4}",
|
||||||
|
// remoteClient.Name, folderID, fetchFolders, fetchItems, sortOrder);
|
||||||
|
|
||||||
if (folderID == UUID.Zero)
|
if (folderID == UUID.Zero)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -574,6 +574,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
|
m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
|
||||||
m_asyncSceneObjectDeleter.Enabled = true;
|
m_asyncSceneObjectDeleter.Enabled = true;
|
||||||
|
|
||||||
|
m_asyncInventorySender = new AsyncInventorySender(this);
|
||||||
|
|
||||||
#region Region Settings
|
#region Region Settings
|
||||||
|
|
||||||
// Load region settings
|
// Load region settings
|
||||||
|
@ -775,6 +777,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_regInfo = regInfo;
|
m_regInfo = regInfo;
|
||||||
m_eventManager = new EventManager();
|
m_eventManager = new EventManager();
|
||||||
|
|
||||||
|
m_permissions = new ScenePermissions(this);
|
||||||
|
|
||||||
m_lastUpdate = Util.EnvironmentTickCount();
|
m_lastUpdate = Util.EnvironmentTickCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2675,7 +2679,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
client.OnMoveInventoryFolder += HandleMoveInventoryFolder; // 2; //!!
|
client.OnMoveInventoryFolder += HandleMoveInventoryFolder; // 2; //!!
|
||||||
client.OnFetchInventoryDescendents += HandleFetchInventoryDescendents;
|
client.OnFetchInventoryDescendents += HandleFetchInventoryDescendents;
|
||||||
client.OnPurgeInventoryDescendents += HandlePurgeInventoryDescendents; // 2; //!!
|
client.OnPurgeInventoryDescendents += HandlePurgeInventoryDescendents; // 2; //!!
|
||||||
client.OnFetchInventory += HandleFetchInventory;
|
client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
|
||||||
client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
|
client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
|
||||||
client.OnCopyInventoryItem += CopyInventoryItem;
|
client.OnCopyInventoryItem += CopyInventoryItem;
|
||||||
client.OnMoveInventoryItem += MoveInventoryItem;
|
client.OnMoveInventoryItem += MoveInventoryItem;
|
||||||
|
@ -2801,7 +2805,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!!
|
client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!!
|
||||||
client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents;
|
client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents;
|
||||||
client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!!
|
client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!!
|
||||||
client.OnFetchInventory -= HandleFetchInventory;
|
client.OnFetchInventory -= m_asyncInventorySender.HandleFetchInventory;
|
||||||
client.OnUpdateInventoryItem -= UpdateInventoryItemAsset;
|
client.OnUpdateInventoryItem -= UpdateInventoryItemAsset;
|
||||||
client.OnCopyInventoryItem -= CopyInventoryItem;
|
client.OnCopyInventoryItem -= CopyInventoryItem;
|
||||||
client.OnMoveInventoryItem -= MoveInventoryItem;
|
client.OnMoveInventoryItem -= MoveInventoryItem;
|
||||||
|
|
|
@ -693,8 +693,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
TaskInventoryItem it = GetInventoryItem(item.ItemID);
|
TaskInventoryItem it = GetInventoryItem(item.ItemID);
|
||||||
if (it != null)
|
if (it != null)
|
||||||
|
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name);
|
||||||
|
|
||||||
item.ParentID = m_part.UUID;
|
item.ParentID = m_part.UUID;
|
||||||
item.ParentPartID = m_part.UUID;
|
item.ParentPartID = m_part.UUID;
|
||||||
|
|
||||||
|
@ -711,14 +712,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_items[item.ItemID] = item;
|
m_items[item.ItemID] = item;
|
||||||
m_inventorySerial++;
|
m_inventorySerial++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fireScriptEvents)
|
if (fireScriptEvents)
|
||||||
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
||||||
|
|
||||||
if (considerChanged)
|
if (considerChanged)
|
||||||
{
|
{
|
||||||
HasInventoryChanged = true;
|
HasInventoryChanged = true;
|
||||||
m_part.ParentGroup.HasGroupChanged = true;
|
m_part.ParentGroup.HasGroupChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -121,7 +121,6 @@ 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>
|
||||||
|
@ -565,7 +564,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
|
|
||||||
private static void ProcessShape(SceneObjectPart obj, XmlTextReader reader)
|
private static void ProcessShape(SceneObjectPart obj, XmlTextReader reader)
|
||||||
{
|
{
|
||||||
obj.Shape = ReadShape(reader, "Shape");
|
bool errors = false;
|
||||||
|
obj.Shape = ReadShape(reader, "Shape", out errors);
|
||||||
|
|
||||||
|
if (errors)
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[SceneObjectSerializer]: Parsing PrimitiveBaseShape for object part {0} {1} encountered errors. Please see earlier log entries.",
|
||||||
|
obj.Name, obj.UUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ProcessScale(SceneObjectPart obj, XmlTextReader reader)
|
private static void ProcessScale(SceneObjectPart obj, XmlTextReader reader)
|
||||||
|
@ -1136,7 +1141,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
writer.WriteElementString("R", sop.Color.R.ToString(Utils.EnUsCulture));
|
writer.WriteElementString("R", sop.Color.R.ToString(Utils.EnUsCulture));
|
||||||
writer.WriteElementString("G", sop.Color.G.ToString(Utils.EnUsCulture));
|
writer.WriteElementString("G", sop.Color.G.ToString(Utils.EnUsCulture));
|
||||||
writer.WriteElementString("B", sop.Color.B.ToString(Utils.EnUsCulture));
|
writer.WriteElementString("B", sop.Color.B.ToString(Utils.EnUsCulture));
|
||||||
writer.WriteElementString("A", sop.Color.G.ToString(Utils.EnUsCulture));
|
writer.WriteElementString("A", sop.Color.A.ToString(Utils.EnUsCulture));
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
|
|
||||||
writer.WriteElementString("Text", sop.Text);
|
writer.WriteElementString("Text", sop.Text);
|
||||||
|
@ -1435,7 +1440,9 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[SceneObjectSerializer]: exception while parsing {0}: {1}", nodeName, e);
|
m_log.DebugFormat(
|
||||||
|
"[SceneObjectSerializer]: exception while parsing {0} in object {1} {2}: {3}{4}",
|
||||||
|
obj.Name, obj.UUID, nodeName, e.Message, e.StackTrace);
|
||||||
if (reader.NodeType == XmlNodeType.EndElement)
|
if (reader.NodeType == XmlNodeType.EndElement)
|
||||||
reader.Read();
|
reader.Read();
|
||||||
}
|
}
|
||||||
|
@ -1493,8 +1500,17 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
return tinv;
|
return tinv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name)
|
/// <summary>
|
||||||
|
/// Read a shape from xml input
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reader"></param>
|
||||||
|
/// <param name="name">The name of the xml element containing the shape</param>
|
||||||
|
/// <param name="errors">true if any errors were encountered during parsing, false otherwise</param>
|
||||||
|
/// <returns>The shape parsed</returns>
|
||||||
|
static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out bool errors)
|
||||||
{
|
{
|
||||||
|
errors = false;
|
||||||
|
|
||||||
PrimitiveBaseShape shape = new PrimitiveBaseShape();
|
PrimitiveBaseShape shape = new PrimitiveBaseShape();
|
||||||
|
|
||||||
if (reader.IsEmptyElement)
|
if (reader.IsEmptyElement)
|
||||||
|
@ -1519,7 +1535,11 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[SceneObjectSerializer]: exception while parsing Shape {0}: {1}", nodeName, e);
|
errors = true;
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[SceneObjectSerializer]: exception while parsing Shape property {0}: {1}{2}",
|
||||||
|
nodeName, e.Message, e.StackTrace);
|
||||||
|
|
||||||
if (reader.NodeType == XmlNodeType.EndElement)
|
if (reader.NodeType == XmlNodeType.EndElement)
|
||||||
reader.Read();
|
reader.Read();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1177,7 +1177,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
||||||
IRC_SendChannelPrivmsg(objectname,url);
|
IRC_SendChannelPrivmsg(objectname,url);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
public void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1233,20 +1233,36 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(requestingClient.AgentId, dataForAgentID);
|
List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(requestingClient.AgentId, dataForAgentID);
|
||||||
GroupMembershipData[] membershipArray;
|
GroupMembershipData[] membershipArray;
|
||||||
|
|
||||||
if (requestingClient.AgentId != dataForAgentID)
|
// c_scene and property accessor 'is_god' are in support of the opertions to bypass 'hidden' group attributes for
|
||||||
{
|
// those with a GodLike aspect.
|
||||||
|
Scene c_scene = (Scene) requestingClient.Scene;
|
||||||
|
bool is_god = c_scene.Permissions.IsGod(requestingClient.AgentId);
|
||||||
|
|
||||||
|
if(is_god) {
|
||||||
Predicate<GroupMembershipData> showInProfile = delegate(GroupMembershipData membership)
|
Predicate<GroupMembershipData> showInProfile = delegate(GroupMembershipData membership)
|
||||||
{
|
{
|
||||||
return membership.ListInProfile;
|
return membership.ListInProfile;
|
||||||
};
|
};
|
||||||
|
|
||||||
membershipArray = membershipData.FindAll(showInProfile).ToArray();
|
membershipArray = membershipData.ToArray();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
membershipArray = membershipData.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (requestingClient.AgentId != dataForAgentID)
|
||||||
|
{
|
||||||
|
Predicate<GroupMembershipData> showInProfile = delegate(GroupMembershipData membership)
|
||||||
|
{
|
||||||
|
return membership.ListInProfile;
|
||||||
|
};
|
||||||
|
|
||||||
|
membershipArray = membershipData.FindAll(showInProfile).ToArray();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
membershipArray = membershipData.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
if (m_debugEnabled)
|
if (m_debugEnabled)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId);
|
m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId);
|
||||||
|
@ -1259,6 +1275,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return membershipArray;
|
return membershipArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void SendAgentDataUpdate(IClientAPI remoteClient, UUID dataForAgentID, UUID activeGroupID, string activeGroupName, ulong activeGroupPowers, string activeGroupTitle)
|
private void SendAgentDataUpdate(IClientAPI remoteClient, UUID dataForAgentID, UUID activeGroupID, string activeGroupName, ulong activeGroupPowers, string activeGroupTitle)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
|
@ -631,7 +631,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
public virtual void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,8 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
|
|
||||||
decodedSculptMapPath = start_config.GetString("DecodedSculptMapPath","j2kDecodeCache");
|
decodedSculptMapPath = start_config.GetString("DecodedSculptMapPath","j2kDecodeCache");
|
||||||
cacheSculptMaps = start_config.GetBoolean("CacheSculptMaps", cacheSculptMaps);
|
cacheSculptMaps = start_config.GetBoolean("CacheSculptMaps", cacheSculptMaps);
|
||||||
useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh);
|
if(mesh_config != null)
|
||||||
|
useMeshiesPhysicsMesh = mesh_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
@ -9908,8 +9908,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
public LSL_Integer llGetParcelMaxPrims(LSL_Vector pos, int sim_wide)
|
public LSL_Integer llGetParcelMaxPrims(LSL_Vector pos, int sim_wide)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
// Alondria: This currently just is utilizing the normal grid's 0.22 prims/m2 calculation
|
|
||||||
// Which probably will be irrelevent in OpenSim....
|
|
||||||
LandData land = World.GetLandData((float)pos.x, (float)pos.y);
|
LandData land = World.GetLandData((float)pos.x, (float)pos.y);
|
||||||
|
|
||||||
float bonusfactor = (float)World.RegionInfo.RegionSettings.ObjectBonus;
|
float bonusfactor = (float)World.RegionInfo.RegionSettings.ObjectBonus;
|
||||||
|
@ -9921,16 +9920,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
if (sim_wide != 0)
|
if (sim_wide != 0)
|
||||||
{
|
{
|
||||||
decimal v = land.SimwideArea * (decimal)(0.22) * (decimal)bonusfactor;
|
int v = (int)((land.SimwideArea / 65536.0f) * (float)World.RegionInfo.ObjectCapacity * bonusfactor);
|
||||||
|
|
||||||
return (int)v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
decimal v = land.Area * (decimal)(0.22) * (decimal)bonusfactor;
|
int v = (int)((land.Area / 65536.0f) * (float)World.RegionInfo.ObjectCapacity * bonusfactor);
|
||||||
|
|
||||||
return (int)v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,7 +308,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
// In attachments, the sensor cone always orients with the
|
// In attachments, the sensor cone always orients with the
|
||||||
// avatar rotation. This may include a nonzero elevation if
|
// avatar rotation. This may include a nonzero elevation if
|
||||||
// in mouselook.
|
// in mouselook.
|
||||||
|
|
||||||
ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.RootPart.AttachedAvatar);
|
ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.RootPart.AttachedAvatar);
|
||||||
q = avatar.Rotation;
|
q = avatar.Rotation;
|
||||||
}
|
}
|
||||||
|
@ -422,7 +421,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
|
|
||||||
SceneObjectPart SensePoint = ts.host;
|
SceneObjectPart SensePoint = ts.host;
|
||||||
Vector3 fromRegionPos = SensePoint.AbsolutePosition;
|
Vector3 fromRegionPos = SensePoint.AbsolutePosition;
|
||||||
|
|
||||||
Quaternion q = SensePoint.RotationOffset;
|
Quaternion q = SensePoint.RotationOffset;
|
||||||
|
if (SensePoint.ParentGroup.RootPart.IsAttachment)
|
||||||
|
{
|
||||||
|
// In attachments, the sensor cone always orients with the
|
||||||
|
// avatar rotation. This may include a nonzero elevation if
|
||||||
|
// in mouselook.
|
||||||
|
ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.RootPart.AttachedAvatar);
|
||||||
|
q = avatar.Rotation;
|
||||||
|
}
|
||||||
|
|
||||||
LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W);
|
LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W);
|
||||||
LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
|
LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
|
||||||
double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
|
double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
|
||||||
|
|
|
@ -30,6 +30,7 @@ using System.Collections;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Security;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
|
@ -143,7 +144,7 @@ namespace OpenSim.Server.Handlers.Grid
|
||||||
sb.Append("<gridinfo>\n");
|
sb.Append("<gridinfo>\n");
|
||||||
foreach (string k in _info.Keys)
|
foreach (string k in _info.Keys)
|
||||||
{
|
{
|
||||||
sb.AppendFormat("<{0}>{1}</{0}>\n", k, _info[k]);
|
sb.AppendFormat("<{0}>{1}</{0}>\n", k, SecurityElement.Escape(_info[k].ToString()));
|
||||||
}
|
}
|
||||||
sb.Append("</gridinfo>\n");
|
sb.Append("</gridinfo>\n");
|
||||||
|
|
||||||
|
|
|
@ -156,10 +156,12 @@ namespace OpenSim.Services.AssetService
|
||||||
|
|
||||||
public virtual string Store(AssetBase asset)
|
public virtual string Store(AssetBase asset)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat(
|
if (!m_Database.ExistsAsset(asset.FullID))
|
||||||
// "[ASSET SERVICE]: Storing asset {0} {1}, bytes {2}", asset.Name, asset.ID, asset.Data.Length);
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
m_Database.StoreAsset(asset);
|
// "[ASSET SERVICE]: Storing asset {0} {1}, bytes {2}", asset.Name, asset.FullID, asset.Data.Length);
|
||||||
|
m_Database.StoreAsset(asset);
|
||||||
|
}
|
||||||
|
|
||||||
return asset.ID;
|
return asset.ID;
|
||||||
}
|
}
|
||||||
|
|
|
@ -314,7 +314,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
|
||||||
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
||||||
args["teleport_flags"] = OSD.FromString(flags.ToString());
|
args["teleport_flags"] = OSD.FromString(flags.ToString());
|
||||||
|
|
||||||
OSDMap result = WebUtil.PostToService(uri,args);
|
OSDMap result = WebUtil.PostToService(uri, args, 20000);
|
||||||
if (result["Success"].AsBoolean())
|
if (result["Success"].AsBoolean())
|
||||||
{
|
{
|
||||||
OSDMap unpacked = (OSDMap)result["_Result"];
|
OSDMap unpacked = (OSDMap)result["_Result"];
|
||||||
|
|
|
@ -158,7 +158,10 @@ namespace OpenSim.Services.Connectors
|
||||||
public InventoryCollection GetFolderContent(UUID principalID, UUID folderID)
|
public InventoryCollection GetFolderContent(UUID principalID, UUID folderID)
|
||||||
{
|
{
|
||||||
InventoryCollection inventory = new InventoryCollection();
|
InventoryCollection inventory = new InventoryCollection();
|
||||||
|
inventory.Folders = new List<InventoryFolderBase>();
|
||||||
|
inventory.Items = new List<InventoryItemBase>();
|
||||||
|
inventory.UserID = principalID;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Dictionary<string,object> ret = MakeRequest("GETFOLDERCONTENT",
|
Dictionary<string,object> ret = MakeRequest("GETFOLDERCONTENT",
|
||||||
|
@ -172,11 +175,6 @@ namespace OpenSim.Services.Connectors
|
||||||
if (ret.Count == 0)
|
if (ret.Count == 0)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|
||||||
inventory.Folders = new List<InventoryFolderBase>();
|
|
||||||
inventory.Items = new List<InventoryItemBase>();
|
|
||||||
inventory.UserID = principalID;
|
|
||||||
|
|
||||||
Dictionary<string,object> folders =
|
Dictionary<string,object> folders =
|
||||||
(Dictionary<string,object>)ret["FOLDERS"];
|
(Dictionary<string,object>)ret["FOLDERS"];
|
||||||
Dictionary<string,object> items =
|
Dictionary<string,object> items =
|
||||||
|
|
|
@ -102,7 +102,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
||||||
args["teleport_flags"] = OSD.FromString(flags.ToString());
|
args["teleport_flags"] = OSD.FromString(flags.ToString());
|
||||||
|
|
||||||
OSDMap result = WebUtil.PostToService(uri,args);
|
OSDMap result = WebUtil.PostToService(uri, args, 20000);
|
||||||
if (result["Success"].AsBoolean())
|
if (result["Success"].AsBoolean())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool UpdateAgent(GridRegion destination, AgentData data)
|
public bool UpdateAgent(GridRegion destination, AgentData data)
|
||||||
{
|
{
|
||||||
return UpdateAgent(destination, (IAgentData)data);
|
return UpdateAgent(destination, (IAgentData)data, 200000); // yes, 200 seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -181,7 +181,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateAgent(destination,(IAgentData)pos);
|
UpdateAgent(destination, (IAgentData)pos, 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// unreachable
|
// unreachable
|
||||||
|
@ -191,7 +191,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This is the worker function to send AgentData to a neighbor region
|
/// This is the worker function to send AgentData to a neighbor region
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private bool UpdateAgent(GridRegion destination, IAgentData cAgentData)
|
private bool UpdateAgent(GridRegion destination, IAgentData cAgentData, int timeout)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start");
|
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start");
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
args["destination_name"] = OSD.FromString(destination.RegionName);
|
args["destination_name"] = OSD.FromString(destination.RegionName);
|
||||||
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
||||||
|
|
||||||
OSDMap result = WebUtil.PutToService(uri,args);
|
OSDMap result = WebUtil.PutToService(uri, args, timeout);
|
||||||
return result["Success"].AsBoolean();
|
return result["Success"].AsBoolean();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -233,7 +233,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
OSDMap result = WebUtil.GetFromService(uri);
|
OSDMap result = WebUtil.GetFromService(uri, 10000);
|
||||||
if (result["Success"].AsBoolean())
|
if (result["Success"].AsBoolean())
|
||||||
{
|
{
|
||||||
// OSDMap args = Util.GetOSDMap(result["_RawResult"].AsString());
|
// OSDMap args = Util.GetOSDMap(result["_RawResult"].AsString());
|
||||||
|
@ -384,7 +384,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
args["destination_name"] = OSD.FromString(destination.RegionName);
|
args["destination_name"] = OSD.FromString(destination.RegionName);
|
||||||
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
|
||||||
|
|
||||||
WebUtil.PostToService(uri, args);
|
WebUtil.PostToService(uri, args, 40000);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|
|
@ -363,10 +363,13 @@ namespace OpenSim.Services.GridService
|
||||||
else
|
else
|
||||||
regInfo.RegionName = externalName;
|
regInfo.RegionName = externalName;
|
||||||
|
|
||||||
m_log.Debug("[HYPERGRID LINKER]: naming linked region " + regInfo.RegionName);
|
m_log.DebugFormat("[HYPERGRID LINKER]: naming linked region {0}, handle {1}", regInfo.RegionName, handle.ToString());
|
||||||
|
|
||||||
// Get the map image
|
// Get the map image
|
||||||
regInfo.TerrainImage = m_GatekeeperConnector.GetMapImage(regionID, imageURL, m_MapTileDirectory);
|
regInfo.TerrainImage = GetMapImage(regionID, imageURL);
|
||||||
|
|
||||||
|
// Store the origin's coordinates somewhere
|
||||||
|
regInfo.RegionSecret = handle.ToString();
|
||||||
|
|
||||||
AddHyperlinkRegion(regInfo, handle);
|
AddHyperlinkRegion(regInfo, handle);
|
||||||
m_log.InfoFormat("[HYPERGRID LINKER]: Successfully linked to region {0} with image {1}", regInfo.RegionName, regInfo.TerrainImage);
|
m_log.InfoFormat("[HYPERGRID LINKER]: Successfully linked to region {0} with image {1}", regInfo.RegionName, regInfo.TerrainImage);
|
||||||
|
@ -463,6 +466,10 @@ namespace OpenSim.Services.GridService
|
||||||
m_Database.Delete(regionID);
|
m_Database.Delete(regionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UUID GetMapImage(UUID regionID, string imageURL)
|
||||||
|
{
|
||||||
|
return m_GatekeeperConnector.GetMapImage(regionID, imageURL, m_MapTileDirectory);
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -40,9 +40,9 @@ namespace OpenSim.Services.InventoryService
|
||||||
{
|
{
|
||||||
public class XInventoryService : ServiceBase, IInventoryService
|
public class XInventoryService : ServiceBase, IInventoryService
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log =
|
// private static readonly ILog m_log =
|
||||||
LogManager.GetLogger(
|
// LogManager.GetLogger(
|
||||||
MethodBase.GetCurrentMethod().DeclaringType);
|
// MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
protected IXInventoryData m_Database;
|
protected IXInventoryData m_Database;
|
||||||
protected bool m_AllowDelete = true;
|
protected bool m_AllowDelete = true;
|
||||||
|
@ -244,7 +244,7 @@ namespace OpenSim.Services.InventoryService
|
||||||
// connector. So we disregard the principal and look
|
// connector. So we disregard the principal and look
|
||||||
// by ID.
|
// by ID.
|
||||||
//
|
//
|
||||||
m_log.DebugFormat("[XINVENTORY SERVICE]: Fetch contents for folder {0}", folderID.ToString());
|
//m_log.DebugFormat("[XINVENTORY SERVICE]: Fetch contents for folder {0}", folderID.ToString());
|
||||||
InventoryCollection inventory = new InventoryCollection();
|
InventoryCollection inventory = new InventoryCollection();
|
||||||
inventory.UserID = principalID;
|
inventory.UserID = principalID;
|
||||||
inventory.Folders = new List<InventoryFolderBase>();
|
inventory.Folders = new List<InventoryFolderBase>();
|
||||||
|
@ -411,12 +411,30 @@ namespace OpenSim.Services.InventoryService
|
||||||
public virtual bool DeleteItems(UUID principalID, List<UUID> itemIDs)
|
public virtual bool DeleteItems(UUID principalID, List<UUID> itemIDs)
|
||||||
{
|
{
|
||||||
if (!m_AllowDelete)
|
if (!m_AllowDelete)
|
||||||
return false;
|
{
|
||||||
|
// We must still allow links and links to folders to be deleted, otherwise they will build up
|
||||||
// Just use the ID... *facepalms*
|
// in the player's inventory until they can no longer log in. Deletions of links due to code bugs or
|
||||||
//
|
// similar is inconvenient but on a par with accidental movement of items. The original item is never
|
||||||
foreach (UUID id in itemIDs)
|
// touched.
|
||||||
m_Database.DeleteItems("inventoryID", id.ToString());
|
foreach (UUID id in itemIDs)
|
||||||
|
{
|
||||||
|
if (!m_Database.DeleteItems(
|
||||||
|
new string[] { "inventoryID", "assetType" },
|
||||||
|
new string[] { id.ToString(), ((sbyte)AssetType.Link).ToString() }))
|
||||||
|
{
|
||||||
|
m_Database.DeleteItems(
|
||||||
|
new string[] { "inventoryID", "assetType" },
|
||||||
|
new string[] { id.ToString(), ((sbyte)AssetType.LinkFolder).ToString() });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Just use the ID... *facepalms*
|
||||||
|
//
|
||||||
|
foreach (UUID id in itemIDs)
|
||||||
|
m_Database.DeleteItems("inventoryID", id.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -637,7 +637,7 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
public virtual void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,10 +40,12 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
public class TestLandChannel : ILandChannel
|
public class TestLandChannel : ILandChannel
|
||||||
{
|
{
|
||||||
private Scene m_scene;
|
private Scene m_scene;
|
||||||
|
private List<ILandObject> m_parcels;
|
||||||
|
|
||||||
public TestLandChannel(Scene scene)
|
public TestLandChannel(Scene scene)
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
m_parcels = new List<ILandObject>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ILandObject> ParcelsNearPoint(Vector3 position)
|
public List<ILandObject> ParcelsNearPoint(Vector3 position)
|
||||||
|
@ -53,12 +55,19 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
|
|
||||||
public List<ILandObject> AllParcels()
|
public List<ILandObject> AllParcels()
|
||||||
{
|
{
|
||||||
return new List<ILandObject>();
|
return m_parcels;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clear(bool setupDefaultParcel)
|
public void Clear(bool setupDefaultParcel)
|
||||||
{
|
{
|
||||||
// Intentionally blank since we don't save any parcel data in the test channel
|
m_parcels.Clear();
|
||||||
|
|
||||||
|
if (setupDefaultParcel)
|
||||||
|
{
|
||||||
|
ILandObject obj = new LandObject(UUID.Zero, false, m_scene);
|
||||||
|
obj.LandData.Name = "Your Parcel";
|
||||||
|
m_parcels.Add(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ILandObject GetNoLand()
|
protected ILandObject GetNoLand()
|
||||||
|
|
|
@ -37,7 +37,7 @@ Now see the "Configuring OpenSim" section
|
||||||
=== Running OpenSim on Linux ===
|
=== Running OpenSim on Linux ===
|
||||||
================================
|
================================
|
||||||
|
|
||||||
You will need Mono >= 2.4.2 to run OpenSim. On some Linux distributions you
|
You will need Mono >= 2.4.3 to run OpenSim. On some Linux distributions you
|
||||||
may need to install additional packages. See http://opensimulator.org/wiki/Dependencies
|
may need to install additional packages. See http://opensimulator.org/wiki/Dependencies
|
||||||
for more information.
|
for more information.
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/DotSets.dll
BIN
bin/DotSets.dll
Binary file not shown.
BIN
bin/MXP.dll
BIN
bin/MXP.dll
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue