Merge branch 'master' into casper

avinationmerge
CasperW 2009-12-26 18:17:55 +01:00
commit 1b8f91a0db
30 changed files with 744 additions and 20 deletions

View File

@ -1655,5 +1655,9 @@ namespace OpenSim.Client.MXP.ClientStack
public void SendRebakeAvatarTextures(UUID textureID)
{
}
public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
{
}
}
}

View File

@ -1161,5 +1161,9 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
public void SendRebakeAvatarTextures(UUID textureID)
{
}
public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
{
}
}
}

View File

@ -37,7 +37,7 @@ using OpenSim.Region.Framework.Interfaces;
namespace OpenSim.Data.MySQL
{
public class MySQLGenericTableHandler<T> : MySqlFramework where T: struct
public class MySQLGenericTableHandler<T> : MySqlFramework where T: class, new()
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@ -63,7 +63,7 @@ namespace OpenSim.Data.MySQL
}
Type t = typeof(T);
FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic |
FieldInfo[] fields = t.GetFields(BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly);
@ -165,7 +165,11 @@ namespace OpenSim.Data.MySQL
new Dictionary<string, string>();
foreach (string col in m_ColumnNames)
{
data[col] = reader[col].ToString();
if (data[col] == null)
data[col] = String.Empty;
}
m_DataField.SetValue(row, data);
}
@ -195,6 +199,33 @@ namespace OpenSim.Data.MySQL
MySqlCommand cmd = new MySqlCommand();
string query = "";
List<String> names = new List<String>();
List<String> values = new List<String>();
foreach (FieldInfo fi in m_Fields.Values)
{
names.Add(fi.Name);
values.Add(fi.GetValue(row).ToString());
}
if (m_DataField != null)
{
Dictionary<string, string> data =
(Dictionary<string, string>)m_DataField.GetValue(row);
foreach (KeyValuePair<string, string> kvp in data)
{
names.Add(kvp.Key);
values.Add(kvp.Value);
}
}
query = String.Format("replace into {0} (`", m_Realm) + String.Join("`,`", names.ToArray()) + "`) values ('" + String.Join("','", values.ToArray()) + "')";
cmd.CommandText = query;
if (ExecuteNonQuery(cmd) > 0)
return true;
return false;
}

View File

@ -232,7 +232,26 @@ namespace OpenSim.Framework.Communications.Cache
/// <returns></returns>
public Dictionary<UUID, InventoryFolderImpl> RequestSelfAndDescendentFolders()
{
return libraryFolders;
Dictionary<UUID, InventoryFolderImpl> fs = new Dictionary<UUID, InventoryFolderImpl>();
fs.Add(ID, this);
List<InventoryFolderImpl> fis = TraverseFolder(this);
foreach (InventoryFolderImpl f in fis)
{
fs.Add(f.ID, f);
}
//return libraryFolders;
return fs;
}
private List<InventoryFolderImpl> TraverseFolder(InventoryFolderImpl node)
{
List<InventoryFolderImpl> folders = node.RequestListOfFolderImpls();
List<InventoryFolderImpl> subs = new List<InventoryFolderImpl>();
foreach (InventoryFolderImpl f in folders)
subs.AddRange(TraverseFolder(f));
folders.AddRange(subs);
return folders;
}
}
}

View File

@ -1392,5 +1392,7 @@ namespace OpenSim.Framework
bool AddGenericPacketHandler(string MethodName, GenericMessage handler);
void SendRebakeAvatarTextures(UUID textureID);
void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages);
}
}

View File

@ -322,15 +322,15 @@ namespace OpenSim.Framework.Servers.HttpServer
HandleRequest(req, resp);
}
public void ConvertIHttpClientContextToOSHttp(object stateinfo)
{
HttpServerContextObj objstate = (HttpServerContextObj)stateinfo;
// public void ConvertIHttpClientContextToOSHttp(object stateinfo)
// {
// HttpServerContextObj objstate = (HttpServerContextObj)stateinfo;
OSHttpRequest request = objstate.oreq;
OSHttpResponse resp = objstate.oresp;
// OSHttpRequest request = objstate.oreq;
// OSHttpResponse resp = objstate.oresp;
HandleRequest(request,resp);
}
// HandleRequest(request,resp);
// }
public virtual void HandleRequest(OSHttpRequest request, OSHttpResponse response)
{

View File

@ -29,7 +29,7 @@ namespace OpenSim
{
public class VersionInfo
{
private const string VERSION_NUMBER = "0.6.91CM";
private const string VERSION_NUMBER = "0.6.8CM";
private const Flavour VERSION_FLAVOUR = Flavour.Dev;
public enum Flavour
{

View File

@ -15792,5 +15792,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return osdEvent;
}
public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
{
AvatarInterestsReplyPacket packet = (AvatarInterestsReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarInterestsReply);
packet.AgentData = new AvatarInterestsReplyPacket.AgentDataBlock();
packet.AgentData.AgentID = AgentId;
packet.AgentData.AvatarID = avatarID;
packet.PropertiesData = new AvatarInterestsReplyPacket.PropertiesDataBlock();
packet.PropertiesData.WantToMask = wantMask;
packet.PropertiesData.WantToText = Utils.StringToBytes(wantText);
packet.PropertiesData.SkillsMask = skillsMask;
packet.PropertiesData.SkillsText = Utils.StringToBytes(skillsText);
packet.PropertiesData.LanguagesText = Utils.StringToBytes(languages);
OutPacket(packet, ThrottleOutPacketType.Task);
}
}
}

View File

@ -174,7 +174,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
return nodesLoaded;
}
public void Close()
{
if (m_loadStream != null)
m_loadStream.Close();
}
/// <summary>
/// Replicate the inventory paths in the archive to the user's inventory as necessary.
/// </summary>
@ -258,6 +264,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
= rawDirsToCreate[i].LastIndexOf(
ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR);
if (identicalNameIdentifierIndex < 0)
{
i++;
continue;
}
string newFolderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex);
newFolderName = InventoryArchiveUtils.UnescapeArchivePath(newFolderName);

View File

@ -43,6 +43,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profiles
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Scene m_scene;
private IProfileModule m_profileModule = null;
private bool m_enabled = true;
public AvatarProfilesModule()
{
@ -52,12 +53,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Profiles
public void Initialise(Scene scene, IConfigSource config)
{
IConfig profileConfig = config.Configs["Profile"];
if (profileConfig != null)
{
if (profileConfig.GetString("Module", Name) != Name)
{
m_enabled = false;
return;
}
}
m_scene = scene;
m_scene.EventManager.OnNewClient += NewClient;
}
public void PostInitialise()
{
if (!m_enabled)
return;
m_profileModule = m_scene.RequestModuleInterface<IProfileModule>();
}

View File

@ -0,0 +1,219 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using OpenSim.Framework;
using OpenSim.Framework.Communications;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver;
using OpenSim.Region.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
using log4net;
using Nini.Config;
namespace OpenSim.Region.CoreModules.Framework.Library
{
public class LibraryModule : ISharedRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static bool m_HasRunOnce = false;
private bool m_Enabled = false;
private string m_LibraryName = "OpenSim Library";
private Scene m_Scene;
#region ISharedRegionModule
public void Initialise(IConfigSource config)
{
m_Enabled = config.Configs["Modules"].GetBoolean("LibraryModule", m_Enabled);
if (m_Enabled)
{
IConfig libConfig = config.Configs["LibraryModule"];
if (libConfig != null)
m_LibraryName = libConfig.GetString("LibraryName", m_LibraryName);
}
}
public bool IsSharedModule
{
get { return true; }
}
public string Name
{
get { return "Library Module"; }
}
public Type ReplaceableInterface
{
get { return null; }
}
public void AddRegion(Scene scene)
{
if (!m_Enabled)
return;
// Store only the first scene
if (m_Scene == null)
{
m_Scene = scene;
}
}
public void RemoveRegion(Scene scene)
{
}
public void RegionLoaded(Scene scene)
{
if (!m_Enabled)
return;
// This will never run more than once, even if the region is restarted
if (!m_HasRunOnce)
{
LoadLibrariesFromArchives();
//DumpLibrary();
m_HasRunOnce = true;
}
}
public void PostInitialise()
{
}
public void Close()
{
m_Scene = null;
}
#endregion ISharedRegionModule
#region LoadLibraries
private string pathToLibraries = "Library";
protected void LoadLibrariesFromArchives()
{
InventoryFolderImpl lib = m_Scene.CommsManager.UserProfileCacheService.LibraryRoot;
if (lib == null)
{
m_log.Debug("[LIBRARY MODULE]: No library. Ignoring Library Module");
return;
}
lib.Name = m_LibraryName;
RegionInfo regInfo = new RegionInfo();
Scene m_MockScene = new Scene(regInfo);
m_MockScene.CommsManager = m_Scene.CommsManager;
LocalInventoryService invService = new LocalInventoryService((LibraryRootFolder)lib);
m_MockScene.RegisterModuleInterface<IInventoryService>(invService);
m_MockScene.RegisterModuleInterface<IAssetService>(m_Scene.AssetService);
UserProfileData profile = new UserProfileData();
profile.FirstName = "OpenSim";
profile.ID = lib.Owner;
profile.SurName = "Library";
CachedUserInfo uinfo = new CachedUserInfo(invService, profile);
foreach (string iarFileName in Directory.GetFiles(pathToLibraries, "*.iar"))
{
string simpleName = Path.GetFileNameWithoutExtension(iarFileName);
m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
simpleName = GetInventoryPathFromName(simpleName);
try
{
InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName);
List<InventoryNodeBase> nodes = archread.Execute();
if (nodes.Count == 0)
{
// didn't find the subfolder with the given name; place it on the top
m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
archread.Close();
archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName);
archread.Execute();
}
archread.Close();
}
catch (Exception e)
{
m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.Message);
}
}
}
private void DumpLibrary()
{
InventoryFolderImpl lib = m_Scene.CommsManager.UserProfileCacheService.LibraryRoot;
m_log.DebugFormat(" - folder {0}", lib.Name);
DumpFolder(lib);
}
private void DumpFolder(InventoryFolderImpl folder)
{
foreach (InventoryItemBase item in folder.Items.Values)
{
m_log.DebugFormat(" --> item {0}", item.Name);
}
foreach (InventoryFolderImpl f in folder.RequestListOfFolderImpls())
{
m_log.DebugFormat(" - folder {0}", f.Name);
DumpFolder(f);
}
}
private string GetInventoryPathFromName(string name)
{
string[] parts = name.Split(new char[] { ' ' });
if (parts.Length == 3)
{
name = string.Empty;
// cut the last part
for (int i = 0; i < parts.Length - 1; i++)
name = name + ' ' + parts[i];
}
return name;
}
#endregion LoadLibraries
}
}

View File

@ -0,0 +1,263 @@
/*
* 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 OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
using log4net;
namespace OpenSim.Region.CoreModules.Framework.Library
{
public class LocalInventoryService : IInventoryService
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private LibraryRootFolder m_Library;
public LocalInventoryService(LibraryRootFolder lib)
{
m_Library = lib;
}
/// <summary>
/// Retrieve the root inventory folder for the given user.
/// </summary>
/// <param name="userID"></param>
/// <returns>null if no root folder was found</returns>
public InventoryFolderBase GetRootFolder(UUID userID) { return m_Library; }
/// <summary>
/// Gets everything (folders and items) inside a folder
/// </summary>
/// <param name="userId"></param>
/// <param name="folderID"></param>
/// <returns></returns>
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
{
InventoryFolderImpl folder = null;
InventoryCollection inv = new InventoryCollection();
inv.UserID = m_Library.Owner;
if (folderID != m_Library.ID)
{
folder = m_Library.FindFolder(folderID);
if (folder == null)
{
inv.Folders = new List<InventoryFolderBase>();
inv.Items = new List<InventoryItemBase>();
return inv;
}
}
else
folder = m_Library;
inv.Folders = folder.RequestListOfFolders();
inv.Items = folder.RequestListOfItems();
m_log.DebugFormat("[LIBRARY MODULE]: Got content for folder {0}", folder.Name);
return inv;
}
/// <summary>
/// Add a new folder to the user's inventory
/// </summary>
/// <param name="folder"></param>
/// <returns>true if the folder was successfully added</returns>
public bool AddFolder(InventoryFolderBase folder)
{
//m_log.DebugFormat("[LIBRARY MODULE]: Adding folder {0} ({1}) to {2}", folder.Name, folder.ID, folder.ParentID);
InventoryFolderImpl parent = m_Library;
if (m_Library.ID != folder.ParentID)
parent = m_Library.FindFolder(folder.ParentID);
if (parent == null)
{
m_log.DebugFormat("[LIBRARY MODULE]: could not add folder {0} because parent folder {1} not found", folder.Name, folder.ParentID);
return false;
}
parent.CreateChildFolder(folder.ID, folder.Name, (ushort)folder.Type);
return true;
}
/// <summary>
/// Add a new item to the user's inventory
/// </summary>
/// <param name="item"></param>
/// <returns>true if the item was successfully added</returns>
public bool AddItem(InventoryItemBase item)
{
//m_log.DebugFormat("[LIBRARY MODULE]: Adding item {0} to {1}", item.Name, item.Folder);
InventoryFolderImpl folder = m_Library;
if (m_Library.ID != item.Folder)
folder = m_Library.FindFolder(item.Folder);
if (folder == null)
{
m_log.DebugFormat("[LIBRARY MODULE]: could not add item {0} because folder {1} not found", item.Name, item.Folder);
return false;
}
folder.Items.Add(item.ID, item);
return true;
}
public bool CreateUserInventory(UUID user) { return false; }
/// <summary>
/// Gets the skeleton of the inventory -- folders only
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public List<InventoryFolderBase> GetInventorySkeleton(UUID userId) { return null; }
/// <summary>
/// Synchronous inventory fetch.
/// </summary>
/// <param name="userID"></param>
/// <returns></returns>
public InventoryCollection GetUserInventory(UUID userID) { return null; }
/// <summary>
/// Request the inventory for a user. This is an asynchronous operation that will call the callback when the
/// inventory has been received
/// </summary>
/// <param name="userID"></param>
/// <param name="callback"></param>
public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { }
/// <summary>
/// Gets the user folder for the given folder-type
/// </summary>
/// <param name="userID"></param>
/// <param name="type"></param>
/// <returns></returns>
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) { return null; }
/// <summary>
/// Gets the items inside a folder
/// </summary>
/// <param name="userID"></param>
/// <param name="folderID"></param>
/// <returns></returns>
public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID) { return null; }
/// <summary>
/// Update a folder in the user's inventory
/// </summary>
/// <param name="folder"></param>
/// <returns>true if the folder was successfully updated</returns>
public bool UpdateFolder(InventoryFolderBase folder) { return false; }
/// <summary>
/// Move an inventory folder to a new location
/// </summary>
/// <param name="folder">A folder containing the details of the new location</param>
/// <returns>true if the folder was successfully moved</returns>
public bool MoveFolder(InventoryFolderBase folder) { return false; }
/// <summary>
/// Delete an item from the user's inventory
/// </summary>
/// <param name="item"></param>
/// <returns>true if the item was successfully deleted</returns>
//bool DeleteItem(InventoryItemBase item);
public bool DeleteFolders(UUID userID, List<UUID> folderIDs) { return false; }
/// <summary>
/// Purge an inventory folder of all its items and subfolders.
/// </summary>
/// <param name="folder"></param>
/// <returns>true if the folder was successfully purged</returns>
public bool PurgeFolder(InventoryFolderBase folder) { return false; }
/// <summary>
/// Update an item in the user's inventory
/// </summary>
/// <param name="item"></param>
/// <returns>true if the item was successfully updated</returns>
public bool UpdateItem(InventoryItemBase item) { return false; }
public bool MoveItems(UUID ownerID, List<InventoryItemBase> items) { return false; }
/// <summary>
/// Delete an item from the user's inventory
/// </summary>
/// <param name="item"></param>
/// <returns>true if the item was successfully deleted</returns>
//bool DeleteItem(InventoryItemBase item);
public bool DeleteItems(UUID userID, List<UUID> itemIDs) { return false; }
/// <summary>
/// Get an item, given by its UUID
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public InventoryItemBase GetItem(InventoryItemBase item) { return null; }
/// <summary>
/// Get a folder, given by its UUID
/// </summary>
/// <param name="folder"></param>
/// <returns></returns>
public InventoryFolderBase GetFolder(InventoryFolderBase folder) { return null; }
/// <summary>
/// Does the given user have an inventory structure?
/// </summary>
/// <param name="userID"></param>
/// <returns></returns>
public bool HasInventoryForUser(UUID userID) { return false; }
/// <summary>
/// Get the active gestures of the agent.
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public List<InventoryItemBase> GetActiveGestures(UUID userId) { return null; }
/// <summary>
/// Get the union of permissions of all inventory items
/// that hold the given assetID.
/// </summary>
/// <param name="userID"></param>
/// <param name="assetID"></param>
/// <returns>The permissions or 0 if no such asset is found in
/// the user's inventory</returns>
public int GetAssetPermissions(UUID userID, UUID assetID) { return 0; }
}
}

View File

@ -20,6 +20,7 @@
<RegionModule id="CoreAssetCache" type="OpenSim.Region.CoreModules.Asset.CoreAssetCache" />
<RegionModule id="GlynnTuckerAssetCache" type="OpenSim.Region.CoreModules.Asset.GlynnTuckerAssetCache" />
<RegionModule id="CenomeMemoryAssetCache" type="OpenSim.Region.CoreModules.Asset.CenomeMemoryAssetCache"/>
<RegionModule id="LibraryModule" type="OpenSim.Region.CoreModules.Framework.Library.LibraryModule"/>
<!-- Service connectors OUT modules -->
<RegionModule id="LocalUserServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.User.LocalUserServicesConnector" />
<RegionModule id="RemoteUserServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.User.RemoteUserServicesConnector" />

View File

@ -1099,5 +1099,9 @@ namespace OpenSim.Region.Examples.SimpleModule
public void SendRebakeAvatarTextures(UUID textureID)
{
}
public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
{
}
}
}

View File

@ -222,6 +222,30 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool AddRestoredSceneObject(
SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
{
// KF: Check for out-of-region, move inside and make static.
Vector3 npos = new Vector3(sceneObject.RootPart.GroupPosition.X,
sceneObject.RootPart.GroupPosition.Y,
sceneObject.RootPart.GroupPosition.Z);
if (npos.X < 0.0 || npos.Y < 0.0 || npos.Z < 0.0 ||
npos.X > Constants.RegionSize ||
npos.Y > Constants.RegionSize)
{
if (npos.X < 0.0) npos.X = 1.0f;
if (npos.Y < 0.0) npos.Y = 1.0f;
if (npos.Z < 0.0) npos.Z = 0.0f;
if (npos.X > Constants.RegionSize) npos.X = Constants.RegionSize - 1.0f;
if (npos.Y > Constants.RegionSize) npos.Y = Constants.RegionSize - 1.0f;
foreach (SceneObjectPart part in sceneObject.Children.Values)
{
part.GroupPosition = npos;
}
sceneObject.RootPart.Velocity = Vector3.Zero;
sceneObject.RootPart.AngularVelocity = Vector3.Zero;
sceneObject.RootPart.Acceleration = Vector3.Zero;
sceneObject.RootPart.Velocity = Vector3.Zero;
}
if (!alreadyPersisted)
{
sceneObject.ForceInventoryPersistence();

View File

@ -27,6 +27,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading;
@ -91,6 +92,10 @@ namespace OpenSim.Region.Framework.Scenes
{
GetWearableAssetUuids(assetUuid, assetUuids);
}
else if (AssetType.Gesture == assetType)
{
GetGestureAssetUuids(assetUuid, assetUuids);
}
else if (AssetType.LSLText == assetType)
{
GetScriptAssetUuids(assetUuid, assetUuids);
@ -278,5 +283,41 @@ namespace OpenSim.Region.Framework.Scenes
GatherAssetUuids(sog, assetUuids);
}
}
protected void GetGestureAssetUuids(UUID gestureUuid, IDictionary<UUID, int> assetUuids)
{
AssetBase assetBase = GetAsset(gestureUuid);
MemoryStream ms = new MemoryStream(assetBase.Data);
StreamReader sr = new StreamReader(ms);
sr.ReadLine(); // Unknown (Version?)
sr.ReadLine(); // Unknown
sr.ReadLine(); // Unknown
sr.ReadLine(); // Name
sr.ReadLine(); // Comment ?
int count = Convert.ToInt32(sr.ReadLine()); // Item count
for (int i = 0 ; i < count ; i++)
{
string type = sr.ReadLine();
if (type == null)
break;
string name = sr.ReadLine();
if (name == null)
break;
string id = sr.ReadLine();
if (id == null)
break;
string unknown = sr.ReadLine();
if (unknown == null)
break;
// If it can be parsed as a UUID, it is an asset ID
UUID uuid;
if (UUID.TryParse(id, out uuid))
assetUuids[uuid] = 1;
}
}
}
}
}

View File

@ -1624,5 +1624,9 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
public void SendRebakeAvatarTextures(UUID textureID)
{
}
public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
{
}
}
}

View File

@ -179,6 +179,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
/// </summary>
/// <param name="msg">The message to send to the user</param>
void Say(string msg);
void Say(string msg,int channel);
//// <value>
/// Grants access to the objects inventory

View File

@ -41,6 +41,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
{
public string Text;
public IEntity Sender;
public int Channel;
}
public delegate void OnChatDelegate(IWorld sender, ChatEventArgs e);

View File

@ -384,6 +384,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
m_rootScene.SimChat(msg, ChatTypeEnum.Say, sop.AbsolutePosition, sop.Name, sop.UUID, false);
}
public void Say(string msg,int channel)
{
if (!CanEdit())
return;
SceneObjectPart sop = GetSOP();
m_rootScene.SimChat(Utils.StringToBytes(msg), ChatTypeEnum.Say,channel, sop.AbsolutePosition, sop.Name, sop.UUID, false);
}
#endregion

View File

@ -148,7 +148,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
ChatEventArgs e = new ChatEventArgs();
e.Sender = new SOPObject(m_internalScene, ((SceneObjectPart) chat.SenderObject).LocalId, m_security);
e.Text = chat.Message;
e.Channel = chat.Channel;
_OnChat(this, e);
return;
}
@ -158,7 +159,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
ChatEventArgs e = new ChatEventArgs();
e.Sender = new SPAvatar(m_internalScene, chat.SenderUUID, m_security);
e.Text = chat.Message;
e.Channel = chat.Channel;
_OnChat(this, e);
return;
}

View File

@ -1104,5 +1104,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC
public void SendRebakeAvatarTextures(UUID textureID)
{
}
public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
{
}
}
}

View File

@ -215,6 +215,7 @@ namespace OpenSim.Region.Physics.OdePlugin
parent_scene.GetTerrainHeightAtXY(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f)) + 0.5f);
m_log.Warn("[PHYSICS]: Got nonFinite Object create Position");
}
_position = pos;
m_taintposition = pos;
PID_D = parent_scene.bodyPIDD;
@ -254,7 +255,8 @@ namespace OpenSim.Region.Physics.OdePlugin
_parent_scene = parent_scene;
m_targetSpace = (IntPtr)0;
if (pos.Z < 0)
// if (pos.Z < 0)
if (pos.Z < parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y))
m_isphysical = false;
else
{

View File

@ -6606,6 +6606,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// retain pathcurve
shapeBlock.PathCurve = part.Shape.PathCurve;
part.Shape.SculptEntry = false;
return shapeBlock;
}
@ -6657,6 +6658,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
shapeBlock.PathShearX = (byte)(100 * topshear.x);
shapeBlock.PathShearY = (byte)(100 * topshear.y);
part.Shape.SculptEntry = false;
part.UpdateShape(shapeBlock);
}
@ -6701,6 +6703,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
shapeBlock.ProfileBegin = (ushort)(50000 * dimple.x);
shapeBlock.ProfileEnd = (ushort)(50000 * (1 - dimple.y));
part.Shape.SculptEntry = false;
part.UpdateShape(shapeBlock);
}
@ -6824,6 +6827,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
shapeBlock.PathSkew = (sbyte)(100 * skew);
part.Shape.SculptEntry = false;
part.UpdateShape(shapeBlock);
}

View File

@ -422,7 +422,8 @@ namespace OpenSim.Region.ScriptEngine.Shared
public int Length
{
get {
get
{
if (m_data == null)
m_data=new Object[0];
return m_data.Length;
@ -431,7 +432,40 @@ namespace OpenSim.Region.ScriptEngine.Shared
public int Size
{
get { return 0; }
get
{
if (m_data == null)
m_data=new Object[0];
int size = 0;
foreach (Object o in m_data)
{
if (o is LSL_Types.LSLInteger)
size += 4;
else if (o is LSL_Types.LSLFloat)
size += 8;
else if (o is LSL_Types.LSLString)
size += ((LSL_Types.LSLString)o).m_string.Length;
else if (o is LSL_Types.key)
size += ((LSL_Types.key)o).value.Length;
else if (o is LSL_Types.Vector3)
size += 32;
else if (o is LSL_Types.Quaternion)
size += 64;
else if (o is int)
size += 4;
else if (o is string)
size += ((string)o).Length;
else if (o is float)
size += 8;
else if (o is double)
size += 16;
else
throw new Exception("Unknown type in List.Size: " + o.GetType().ToString());
}
return size;
}
}
public object[] Data

View File

@ -1159,6 +1159,9 @@ namespace OpenSim.Tests.Common.Mock
public void SendRebakeAvatarTextures(UUID textureID)
{
}
public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
{
}
}
}

0
bin/Library/.keep Normal file
View File

View File

@ -13,6 +13,7 @@
NeighbourServices = "LocalNeighbourServicesConnector"
AuthorizationServices = "LocalAuthorizationServicesConnector"
GridServices = "LocalGridServicesConnector"
LibraryModule = true
[AssetService]
LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
@ -26,3 +27,4 @@
[GridService]
LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
Realm = "regions"

View File

@ -39,3 +39,7 @@
;;--- For MySql region storage (alternative)
;StorageProvider = "OpenSim.Data.MySQL.dll:MySqlRegionData"
;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;"
[LibraryModule]
; Set this if you want to change the name of the OpenSim Library
;LibraryName = "My World's Library"

View File

@ -21,7 +21,7 @@
HGAuthServiceInConnector = true
HypergridServiceInConnector = true
NeighbourServiceInConnector = true
LibraryModule = true
[AssetService]
; For the AssetServiceInConnector