diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 9f9d1516ab..6e04a40b89 100644 --- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs +++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs @@ -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) + { + } } } diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs index 533475f91e..02b1deef33 100644 --- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs +++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs @@ -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) + { + } } } diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 2f5937d3c1..4dfc32403a 100644 --- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs +++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs @@ -37,7 +37,7 @@ using OpenSim.Region.Framework.Interfaces; namespace OpenSim.Data.MySQL { - public class MySQLGenericTableHandler : MySqlFramework where T: struct + public class MySQLGenericTableHandler : 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(); 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 names = new List(); + List values = new List(); + + foreach (FieldInfo fi in m_Fields.Values) + { + names.Add(fi.Name); + values.Add(fi.GetValue(row).ToString()); + } + + if (m_DataField != null) + { + Dictionary data = + (Dictionary)m_DataField.GetValue(row); + + foreach (KeyValuePair 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; } diff --git a/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs b/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs index 42e6510683..74ba0a5668 100644 --- a/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs +++ b/OpenSim/Framework/Communications/Cache/LibraryRootFolder.cs @@ -232,7 +232,26 @@ namespace OpenSim.Framework.Communications.Cache /// public Dictionary RequestSelfAndDescendentFolders() { - return libraryFolders; + Dictionary fs = new Dictionary(); + fs.Add(ID, this); + List fis = TraverseFolder(this); + foreach (InventoryFolderImpl f in fis) + { + fs.Add(f.ID, f); + } + //return libraryFolders; + return fs; + } + + private List TraverseFolder(InventoryFolderImpl node) + { + List folders = node.RequestListOfFolderImpls(); + List subs = new List(); + foreach (InventoryFolderImpl f in folders) + subs.AddRange(TraverseFolder(f)); + + folders.AddRange(subs); + return folders; } } } diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index cb136e24b2..d8743b547a 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -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); } } diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 08f1becab0..857c584027 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -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) { diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index a7d34f586c..f618047245 100644 --- a/OpenSim/Framework/Servers/VersionInfo.cs +++ b/OpenSim/Framework/Servers/VersionInfo.cs @@ -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 { diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index e7ce2e0005..3ac4e5e336 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -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); + } } } diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index b7783899cd..0ced2f90dd 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -174,7 +174,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return nodesLoaded; } - + + public void Close() + { + if (m_loadStream != null) + m_loadStream.Close(); + } + /// /// Replicate the inventory paths in the archive to the user's inventory as necessary. /// @@ -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); diff --git a/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs b/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs index 0f5878873b..8cf58c6df0 100644 --- a/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs @@ -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(); } diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs new file mode 100644 index 0000000000..6941e009cd --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs @@ -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(invService); + m_MockScene.RegisterModuleInterface(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 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 + } +} diff --git a/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs b/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs new file mode 100644 index 0000000000..2c95b5a592 --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs @@ -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; + } + + /// + /// Retrieve the root inventory folder for the given user. + /// + /// + /// null if no root folder was found + public InventoryFolderBase GetRootFolder(UUID userID) { return m_Library; } + + /// + /// Gets everything (folders and items) inside a folder + /// + /// + /// + /// + 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(); + inv.Items = new List(); + 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; + } + + /// + /// Add a new folder to the user's inventory + /// + /// + /// true if the folder was successfully added + 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; + } + + /// + /// Add a new item to the user's inventory + /// + /// + /// true if the item was successfully added + 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; } + + /// + /// Gets the skeleton of the inventory -- folders only + /// + /// + /// + public List GetInventorySkeleton(UUID userId) { return null; } + + /// + /// Synchronous inventory fetch. + /// + /// + /// + public InventoryCollection GetUserInventory(UUID userID) { return null; } + + /// + /// Request the inventory for a user. This is an asynchronous operation that will call the callback when the + /// inventory has been received + /// + /// + /// + public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { } + + + /// + /// Gets the user folder for the given folder-type + /// + /// + /// + /// + public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) { return null; } + + + /// + /// Gets the items inside a folder + /// + /// + /// + /// + public List GetFolderItems(UUID userID, UUID folderID) { return null; } + + + /// + /// Update a folder in the user's inventory + /// + /// + /// true if the folder was successfully updated + public bool UpdateFolder(InventoryFolderBase folder) { return false; } + + /// + /// Move an inventory folder to a new location + /// + /// A folder containing the details of the new location + /// true if the folder was successfully moved + public bool MoveFolder(InventoryFolderBase folder) { return false; } + + /// + /// Delete an item from the user's inventory + /// + /// + /// true if the item was successfully deleted + //bool DeleteItem(InventoryItemBase item); + public bool DeleteFolders(UUID userID, List folderIDs) { return false; } + + /// + /// Purge an inventory folder of all its items and subfolders. + /// + /// + /// true if the folder was successfully purged + public bool PurgeFolder(InventoryFolderBase folder) { return false; } + + + /// + /// Update an item in the user's inventory + /// + /// + /// true if the item was successfully updated + public bool UpdateItem(InventoryItemBase item) { return false; } + + public bool MoveItems(UUID ownerID, List items) { return false; } + + /// + /// Delete an item from the user's inventory + /// + /// + /// true if the item was successfully deleted + //bool DeleteItem(InventoryItemBase item); + public bool DeleteItems(UUID userID, List itemIDs) { return false; } + + /// + /// Get an item, given by its UUID + /// + /// + /// + public InventoryItemBase GetItem(InventoryItemBase item) { return null; } + + /// + /// Get a folder, given by its UUID + /// + /// + /// + public InventoryFolderBase GetFolder(InventoryFolderBase folder) { return null; } + + /// + /// Does the given user have an inventory structure? + /// + /// + /// + public bool HasInventoryForUser(UUID userID) { return false; } + + /// + /// Get the active gestures of the agent. + /// + /// + /// + public List GetActiveGestures(UUID userId) { return null; } + + /// + /// Get the union of permissions of all inventory items + /// that hold the given assetID. + /// + /// + /// + /// The permissions or 0 if no such asset is found in + /// the user's inventory + public int GetAssetPermissions(UUID userID, UUID assetID) { return 0; } + } +} diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml index 975707258e..beb2307c57 100644 --- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml +++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml @@ -20,6 +20,7 @@ + diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 816060fcc3..fed8f642bd 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -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) + { + } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index b0fb8b3e44..998d598333 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -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(); diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 930af813c2..3edb6775cf 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs @@ -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 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; + } + } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index bdf157469b..c333413913 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -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) + { + } } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IObject.cs index 19f72109dc..9d6466714e 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IObject.cs @@ -179,6 +179,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule /// /// The message to send to the user void Say(string msg); + + void Say(string msg,int channel); //// /// Grants access to the objects inventory diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IWorld.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IWorld.cs index 3c14ed5186..3b3b3d0e9e 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IWorld.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IWorld.cs @@ -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); diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs index 143c45490f..9596d13a32 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs @@ -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 diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs index 6fcb5d04f3..82020cb4cc 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/World.cs @@ -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; } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 975033a1c8..9ca5a0a878 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -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) + { + } } } diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs index 983431de57..01792409ad 100644 --- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs @@ -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 { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index cc903e0591..c9d6742822 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -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); } diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index 1fc31c5a37..faf9c4041a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -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 diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 5f172c4575..266e703518 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -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) + { + } } } diff --git a/bin/Library/.keep b/bin/Library/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini index a6c089c353..cdfdf4b863 100644 --- a/bin/config-include/Standalone.ini +++ b/bin/config-include/Standalone.ini @@ -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" + diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example index b0e2de35d1..1679f93777 100644 --- a/bin/config-include/StandaloneCommon.ini.example +++ b/bin/config-include/StandaloneCommon.ini.example @@ -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" \ No newline at end of file diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini index baff811794..909286cc52 100644 --- a/bin/config-include/StandaloneHypergrid.ini +++ b/bin/config-include/StandaloneHypergrid.ini @@ -21,7 +21,7 @@ HGAuthServiceInConnector = true HypergridServiceInConnector = true NeighbourServiceInConnector = true - + LibraryModule = true [AssetService] ; For the AssetServiceInConnector