From f45a69821b04fd743b7e79ab594484d055e06226 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 22 Dec 2009 21:00:46 -0800 Subject: [PATCH 01/20] Added Close() to Inventory/Archiver/InventoryArchiveReadRequest, so that the stream can be closed. --- .../Inventory/Archiver/InventoryArchiveReadRequest.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index b7783899cd..f299b0cc62 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. /// From 9c294c566313c4d2a97d519b9efd08c7ca0f43db Mon Sep 17 00:00:00 2001 From: "dr scofield (aka dirk husemann)" Date: Wed, 23 Dec 2009 18:33:54 +0100 Subject: [PATCH 02/20] - commented out unused method ConvertIHttpClientContextToOSHttp --- .../Framework/Servers/HttpServer/BaseHttpServer.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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) { From fddefff28479b6874235419dd5d26214afabb4f2 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Wed, 23 Dec 2009 10:34:11 -0800 Subject: [PATCH 03/20] Thank you kindly, Ziah for a patch that adds the channel to the class ChatEventArgs and retrieves it's value along with the others from the OSChatMessage in HandleChatPackage. With this the MRM Script can check if a ChatEvent is coming in on a specifc Channel. The Second Part adds the Method say(string msg , int channel) to send a chat message on the specified channel. The idea behind this is to enable MRM's to communicate with regular LSL or OSSL Scripts so that they may can act as a Backend to access a Database or do business Logic for those Scripts. Signed-off-by: Charles Krinke --- .../Scripting/Minimodule/Interfaces/IObject.cs | 2 ++ .../Scripting/Minimodule/Interfaces/IWorld.cs | 1 + .../OptionalModules/Scripting/Minimodule/SOPObject.cs | 9 +++++++++ .../Region/OptionalModules/Scripting/Minimodule/World.cs | 6 ++++-- 4 files changed, 16 insertions(+), 2 deletions(-) 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; } From c27aa3749c093d87b7d3216e7045d9fab948b4e1 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 23 Dec 2009 11:45:39 -0800 Subject: [PATCH 04/20] Change in how the Library returns its descendant folders, so that it includes folders added after the initial load off the file system, by other mechanisms. --- .../Communications/Cache/LibraryRootFolder.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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; } } } From c05a35cc7168d13655f7e3a38e0e0df0f2bf1060 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 23 Dec 2009 21:20:48 +0000 Subject: [PATCH 05/20] Fix a bounds exception I came across in IAR restore --- .../Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index b7783899cd..304c08141f 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -258,6 +258,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); From 53386b6f1f6fe02f3b6e544ce5d50bdf2cc6e7ec Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 23 Dec 2009 23:09:41 +0000 Subject: [PATCH 06/20] Add saving assets from gestures to IAR --- .../Region/Framework/Scenes/UuidGatherer.cs | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 930af813c2..7e3c192e10 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs @@ -91,6 +91,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 +282,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.Parse(id, out uuid)) + assetUuids[uuid] = 1; + } + } } -} \ No newline at end of file +} From 908992a105280780cbdc8955ee1926e535176875 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 23 Dec 2009 17:10:37 -0800 Subject: [PATCH 07/20] Fixes the broken build of the previous commit. --- OpenSim/Region/Framework/Scenes/UuidGatherer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 7e3c192e10..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; @@ -314,7 +315,7 @@ namespace OpenSim.Region.Framework.Scenes // If it can be parsed as a UUID, it is an asset ID UUID uuid; - if (UUID.Parse(id, out uuid)) + if (UUID.TryParse(id, out uuid)) assetUuids[uuid] = 1; } } From 1fa938aab0b748768ff3528e41ba76dd6baa1bf3 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 23 Dec 2009 17:31:30 -0800 Subject: [PATCH 08/20] Library Module: allows adding folders/items to the Library from IAR files placed under bin/Library. This works only for standalones. --- .../Framework/Library/LibraryModule.cs | 219 +++++++++++++++ .../Library/LocalInventoryService.cs | 263 ++++++++++++++++++ .../Resources/CoreModulePlugin.addin.xml | 1 + bin/Library/.keep | 0 bin/config-include/Standalone.ini | 2 + .../StandaloneCommon.ini.example | 4 + bin/config-include/StandaloneHypergrid.ini | 2 +- 7 files changed, 490 insertions(+), 1 deletion(-) create mode 100644 OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs create mode 100644 OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs create mode 100644 bin/Library/.keep diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs new file mode 100644 index 0000000000..df7df464d5 --- /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."); + 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/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 From 2c3d7972b97b057a7bef6969fbea03591789fcab Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 23 Dec 2009 19:43:50 -0800 Subject: [PATCH 09/20] No-op in this commit. Just increasing the tag number due to weirdnesses. --- OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs index df7df464d5..6941e009cd 100644 --- a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs @@ -130,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library InventoryFolderImpl lib = m_Scene.CommsManager.UserProfileCacheService.LibraryRoot; if (lib == null) { - m_log.Debug("[LIBRARY MODULE]: No library."); + m_log.Debug("[LIBRARY MODULE]: No library. Ignoring Library Module"); return; } From 86a429bc44b6fc503b3303a946d088d796d5c530 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 24 Dec 2009 18:18:14 +0100 Subject: [PATCH 10/20] Add the LSL List Size property --- .../Region/ScriptEngine/Shared/LSL_Types.cs | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index 3f38bb653f..faf9c4041a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -422,13 +422,52 @@ namespace OpenSim.Region.ScriptEngine.Shared public int Length { - get { + get + { if (m_data == null) m_data=new Object[0]; return m_data.Length; } } + public int Size + { + 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 { get { From 7f699fca9a34cd0f3525534bdbc04c8b8ee975fe Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 24 Dec 2009 18:18:14 +0100 Subject: [PATCH 11/20] Add the body to the LSL List Size property --- .../Region/ScriptEngine/Shared/LSL_Types.cs | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) 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 From 7a06ab834d6d6404c2bfdbf9c71d5f34bfc0fae2 Mon Sep 17 00:00:00 2001 From: dahlia Date: Thu, 24 Dec 2009 11:00:08 -0800 Subject: [PATCH 12/20] Clear Shape.SculptEntry if prim type is not a sculptie in llSetPrimitiveParams() - addresses Mantis #4462 --- .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index cf3a1a04a8..2b6d9bd67c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -6502,6 +6502,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // retain pathcurve shapeBlock.PathCurve = part.Shape.PathCurve; + part.Shape.SculptEntry = false; return shapeBlock; } @@ -6550,6 +6551,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); } @@ -6591,6 +6593,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); } @@ -6711,6 +6714,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } shapeBlock.PathSkew = (sbyte)(100 * skew); + part.Shape.SculptEntry = false; part.UpdateShape(shapeBlock); } From e7439efc74a1cc0daedc51eb25ae66cd03db70b5 Mon Sep 17 00:00:00 2001 From: Kitto Flora Date: Thu, 24 Dec 2009 19:19:44 -0500 Subject: [PATCH 13/20] Recover out-of-region objects during db load. --- OpenSim/Framework/Servers/VersionInfo.cs | 2 +- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 24 +++++++++++++++++++ OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs | 4 +++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index a7d34f586c..7274a06f18 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.92Ch"; private const Flavour VERSION_FLAVOUR = Flavour.Dev; public enum Flavour { 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/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 { From 8d36d7beed0f5bc932407671596d5a79ff8f8eb6 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 25 Dec 2009 23:10:07 +0000 Subject: [PATCH 14/20] Enable the profile module to be replaced completely, even for the base profile data --- .../Avatar/Profiles/AvatarProfilesModule.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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(); } From b19e5643171d9a081426026c0e96c84c3e7f97b2 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 25 Dec 2009 23:20:30 +0000 Subject: [PATCH 15/20] Restore version suffix. --- OpenSim/Framework/Servers/VersionInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index 7274a06f18..4844a66197 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.92Ch"; + private const string VERSION_NUMBER = "0.6.92CM"; private const Flavour VERSION_FLAVOUR = Flavour.Dev; public enum Flavour { From 59f683066a60a99111cc032ee122dfe709c78440 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 25 Dec 2009 23:23:49 +0000 Subject: [PATCH 16/20] Set version back to core version (base) and suffix CM. Please DO NOT CHANGE THIS in the repo. This is the Caremninster repo and the number follows CORE. Always. --- OpenSim/Framework/Servers/VersionInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs index 4844a66197..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.92CM"; + private const string VERSION_NUMBER = "0.6.8CM"; private const Flavour VERSION_FLAVOUR = Flavour.Dev; public enum Flavour { From 9972b12812d343c48843057ddb2f4ea9c7f96bb4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 26 Dec 2009 00:19:54 +0000 Subject: [PATCH 17/20] Add a generic REPLACE INTO handler for put into the generic table handler --- .../Data/MySQL/MySQLGenericTableHandler.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 2f5937d3c1..9b8a001675 100644 --- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs +++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs @@ -195,6 +195,31 @@ 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()) + "')"; + + if (ExecuteNonQuery(cmd) > 0) + return true; return false; } From 92be01d5e60c00568a4b8efc4bfa17f8b3df8a63 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 26 Dec 2009 03:24:46 +0100 Subject: [PATCH 18/20] Make the GenericTableHandler work as intended --- OpenSim/Data/MySQL/MySQLGenericTableHandler.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 9b8a001675..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); } @@ -218,6 +222,8 @@ namespace OpenSim.Data.MySQL 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; From 43c303e27a93f07022ed0b151ca6945e34169ee9 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 26 Dec 2009 03:24:46 +0100 Subject: [PATCH 19/20] Make the GenericTableHandler work as intended --- OpenSim/Data/MySQL/MySQLGenericTableHandler.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs index 9b8a001675..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); } @@ -218,6 +222,8 @@ namespace OpenSim.Data.MySQL 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; From 88b3b98811e70709536bb41410ec88509e0460a5 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 26 Dec 2009 04:12:51 +0000 Subject: [PATCH 20/20] Add AvatarInterestsReply --- OpenSim/Client/MXP/ClientStack/MXPClientView.cs | 4 ++++ .../Client/VWoHTTP/ClientStack/VWHClientView.cs | 4 ++++ OpenSim/Framework/IClientAPI.cs | 2 ++ .../ClientStack/LindenUDP/LLClientView.cs | 17 +++++++++++++++++ .../Examples/SimpleModule/MyNpcCharacter.cs | 4 ++++ .../Server/IRCClientView.cs | 4 ++++ .../OptionalModules/World/NPC/NPCAvatar.cs | 4 ++++ OpenSim/Tests/Common/Mock/TestClient.cs | 5 ++++- 8 files changed, 43 insertions(+), 1 deletion(-) diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 0cae3dd513..0141718d4c 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 fb87c1516a..74cecea028 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/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 04ba9c69e9..f83fea2d90 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/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 4780701095..f6c505ad0e 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -15809,5 +15809,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/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 9754da3c78..89e77473c3 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/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 6c3e7eb64c..8b34396a82 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/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index cf36d080e1..1573c7349e 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/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 27025d9959..6265ab736d 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) + { + } } }