2010-01-04 18:47:47 +00:00
/ *
* 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 OpenMetaverse ;
using log4net ;
using Nini.Config ;
using System.Reflection ;
using OpenSim.Services.Base ;
using OpenSim.Services.Interfaces ;
using OpenSim.Data ;
using OpenSim.Framework ;
namespace OpenSim.Services.InventoryService
{
public class XInventoryService : ServiceBase , IInventoryService
{
2012-04-06 18:48:41 +00:00
private static readonly ILog m_log =
LogManager . GetLogger (
MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
2010-01-04 18:47:47 +00:00
protected IXInventoryData m_Database ;
2010-07-24 22:36:07 +00:00
protected bool m_AllowDelete = true ;
2012-03-27 17:08:13 +00:00
protected string m_ConfigName = "InventoryService" ;
2010-01-04 18:47:47 +00:00
2012-03-27 17:08:13 +00:00
public XInventoryService ( IConfigSource config )
: this ( config , "InventoryService" )
2010-01-04 18:47:47 +00:00
{
2012-03-27 17:08:13 +00:00
}
2012-05-04 19:37:21 +00:00
2012-03-27 17:08:13 +00:00
public XInventoryService ( IConfigSource config , string configName ) : base ( config )
{
if ( configName ! = string . Empty )
m_ConfigName = configName ;
2010-01-04 18:47:47 +00:00
string dllName = String . Empty ;
string connString = String . Empty ;
//string realm = "Inventory"; // OSG version doesn't use this
/ /
// Try reading the [InventoryService] section first, if it exists
/ /
2012-03-27 17:08:13 +00:00
IConfig authConfig = config . Configs [ m_ConfigName ] ;
2010-01-04 18:47:47 +00:00
if ( authConfig ! = null )
{
dllName = authConfig . GetString ( "StorageProvider" , dllName ) ;
connString = authConfig . GetString ( "ConnectionString" , connString ) ;
2010-07-24 22:36:07 +00:00
m_AllowDelete = authConfig . GetBoolean ( "AllowDelete" , true ) ;
2010-01-04 18:47:47 +00:00
// realm = authConfig.GetString("Realm", realm);
}
/ /
// Try reading the [DatabaseService] section, if it exists
/ /
IConfig dbConfig = config . Configs [ "DatabaseService" ] ;
if ( dbConfig ! = null )
{
if ( dllName = = String . Empty )
dllName = dbConfig . GetString ( "StorageProvider" , String . Empty ) ;
if ( connString = = String . Empty )
connString = dbConfig . GetString ( "ConnectionString" , String . Empty ) ;
}
/ /
// We tried, but this doesn't exist. We can't proceed.
/ /
if ( dllName = = String . Empty )
throw new Exception ( "No StorageProvider configured" ) ;
m_Database = LoadPlugin < IXInventoryData > ( dllName ,
new Object [ ] { connString , String . Empty } ) ;
2012-08-29 01:01:43 +00:00
2010-01-04 18:47:47 +00:00
if ( m_Database = = null )
throw new Exception ( "Could not find a storage interface in the given module" ) ;
}
2010-01-31 19:10:57 +00:00
public virtual bool CreateUserInventory ( UUID principalID )
2010-01-04 18:47:47 +00:00
{
// This is braindeaad. We can't ever communicate that we fixed
// an existing inventory. Well, just return root folder status,
// but check sanity anyway.
/ /
bool result = false ;
InventoryFolderBase rootFolder = GetRootFolder ( principalID ) ;
if ( rootFolder = = null )
{
2010-02-08 17:46:54 +00:00
rootFolder = ConvertToOpenSim ( CreateFolder ( principalID , UUID . Zero , ( int ) AssetType . RootFolder , "My Inventory" ) ) ;
2010-01-04 18:47:47 +00:00
result = true ;
}
2012-04-06 18:48:41 +00:00
XInventoryFolder [ ] sysFolders = GetSystemFolders ( principalID , rootFolder . ID ) ;
2010-01-04 18:47:47 +00:00
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Animation ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Animation , "Animations" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Bodypart ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Bodypart , "Body Parts" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . CallingCard ) return true ; return false ; } ) )
2014-05-22 15:23:19 +00:00
{
XInventoryFolder folder = CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . CallingCard , "Calling Cards" ) ;
folder = CreateFolder ( principalID , folder . folderID , ( int ) AssetType . CallingCard , "Friends" ) ;
CreateFolder ( principalID , folder . folderID , ( int ) AssetType . CallingCard , "All" ) ;
}
2010-01-04 18:47:47 +00:00
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Clothing ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Clothing , "Clothing" ) ;
2014-05-22 15:23:19 +00:00
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . CurrentOutfitFolder ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . CurrentOutfitFolder , "Current Outfit" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . FavoriteFolder ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . FavoriteFolder , "Favorites" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Gesture ) return true ; return false ; } ) )
2010-01-04 18:47:47 +00:00
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Gesture , "Gestures" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Landmark ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Landmark , "Landmarks" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . LostAndFoundFolder ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . LostAndFoundFolder , "Lost And Found" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Notecard ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Notecard , "Notecards" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Object ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Object , "Objects" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . SnapshotFolder ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . SnapshotFolder , "Photo Album" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . LSLText ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . LSLText , "Scripts" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Sound ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Sound , "Sounds" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . Texture ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . Texture , "Textures" ) ;
if ( ! Array . Exists ( sysFolders , delegate ( XInventoryFolder f ) { if ( f . type = = ( int ) AssetType . TrashFolder ) return true ; return false ; } ) )
CreateFolder ( principalID , rootFolder . ID , ( int ) AssetType . TrashFolder , "Trash" ) ;
return result ;
}
2010-01-31 19:10:57 +00:00
protected XInventoryFolder CreateFolder ( UUID principalID , UUID parentID , int type , string name )
2010-01-04 18:47:47 +00:00
{
XInventoryFolder newFolder = new XInventoryFolder ( ) ;
newFolder . folderName = name ;
newFolder . type = type ;
newFolder . version = 1 ;
newFolder . folderID = UUID . Random ( ) ;
newFolder . agentID = principalID ;
newFolder . parentFolderID = parentID ;
m_Database . StoreFolder ( newFolder ) ;
return newFolder ;
}
2012-04-06 18:48:41 +00:00
protected virtual XInventoryFolder [ ] GetSystemFolders ( UUID principalID , UUID rootID )
2010-01-04 18:47:47 +00:00
{
2010-08-23 21:24:23 +00:00
// m_log.DebugFormat("[XINVENTORY SERVICE]: Getting system folders for {0}", principalID);
2010-01-04 18:47:47 +00:00
XInventoryFolder [ ] allFolders = m_Database . GetFolders (
2012-04-06 18:48:41 +00:00
new string [ ] { "agentID" , "parentFolderID" } ,
new string [ ] { principalID . ToString ( ) , rootID . ToString ( ) } ) ;
2010-01-04 18:47:47 +00:00
XInventoryFolder [ ] sysFolders = Array . FindAll (
allFolders ,
delegate ( XInventoryFolder f )
{
if ( f . type > 0 )
return true ;
return false ;
} ) ;
2010-08-23 21:24:23 +00:00
// m_log.DebugFormat(
// "[XINVENTORY SERVICE]: Found {0} system folders for {1}", sysFolders.Length, principalID);
2010-01-04 18:47:47 +00:00
return sysFolders ;
}
2010-01-31 19:10:57 +00:00
public virtual List < InventoryFolderBase > GetInventorySkeleton ( UUID principalID )
2010-01-04 18:47:47 +00:00
{
XInventoryFolder [ ] allFolders = m_Database . GetFolders (
new string [ ] { "agentID" } ,
new string [ ] { principalID . ToString ( ) } ) ;
if ( allFolders . Length = = 0 )
return null ;
List < InventoryFolderBase > folders = new List < InventoryFolderBase > ( ) ;
foreach ( XInventoryFolder x in allFolders )
2010-01-04 20:52:44 +00:00
{
2010-08-23 21:24:23 +00:00
//m_log.DebugFormat("[XINVENTORY SERVICE]: Adding folder {0} to skeleton", x.folderName);
2010-01-04 18:47:47 +00:00
folders . Add ( ConvertToOpenSim ( x ) ) ;
2010-01-04 20:52:44 +00:00
}
2010-01-04 18:47:47 +00:00
return folders ;
}
2010-01-31 19:10:57 +00:00
public virtual InventoryFolderBase GetRootFolder ( UUID principalID )
2010-01-04 18:47:47 +00:00
{
XInventoryFolder [ ] folders = m_Database . GetFolders (
new string [ ] { "agentID" , "parentFolderID" } ,
new string [ ] { principalID . ToString ( ) , UUID . Zero . ToString ( ) } ) ;
if ( folders . Length = = 0 )
return null ;
2010-06-29 11:38:15 +00:00
XInventoryFolder root = null ;
foreach ( XInventoryFolder folder in folders )
2012-10-21 13:58:01 +00:00
{
2010-06-29 11:38:15 +00:00
if ( folder . folderName = = "My Inventory" )
2012-10-21 13:58:01 +00:00
{
2010-06-29 11:38:15 +00:00
root = folder ;
2012-10-21 13:58:01 +00:00
break ;
}
}
if ( root = = null ) // oops
2010-06-29 11:38:15 +00:00
root = folders [ 0 ] ;
return ConvertToOpenSim ( root ) ;
2010-01-04 18:47:47 +00:00
}
2010-01-31 19:10:57 +00:00
public virtual InventoryFolderBase GetFolderForType ( UUID principalID , AssetType type )
2010-01-04 18:47:47 +00:00
{
2010-08-23 22:16:48 +00:00
// m_log.DebugFormat("[XINVENTORY SERVICE]: Getting folder type {0} for user {1}", type, principalID);
2012-08-25 01:00:17 +00:00
InventoryFolderBase rootFolder = GetRootFolder ( principalID ) ;
if ( rootFolder = = null )
{
m_log . WarnFormat (
"[XINVENTORY]: Found no root folder for {0} in GetFolderForType() when looking for {1}" ,
principalID , type ) ;
return null ;
}
return GetSystemFolderForType ( rootFolder , type ) ;
}
private InventoryFolderBase GetSystemFolderForType ( InventoryFolderBase rootFolder , AssetType type )
{
// m_log.DebugFormat("[XINVENTORY SERVICE]: Getting folder type {0} for user {1}", type, principalID);
2010-08-23 22:16:48 +00:00
2012-10-21 13:58:01 +00:00
if ( type = = AssetType . RootFolder )
return rootFolder ;
2010-01-04 18:47:47 +00:00
XInventoryFolder [ ] folders = m_Database . GetFolders (
2012-08-25 01:00:17 +00:00
new string [ ] { "agentID" , "parentFolderID" , "type" } ,
new string [ ] { rootFolder . Owner . ToString ( ) , rootFolder . ID . ToString ( ) , ( ( int ) type ) . ToString ( ) } ) ;
2010-01-04 18:47:47 +00:00
if ( folders . Length = = 0 )
2010-08-23 22:16:48 +00:00
{
// m_log.WarnFormat("[XINVENTORY SERVICE]: Found no folder for type {0} for user {1}", type, principalID);
2010-01-04 18:47:47 +00:00
return null ;
2010-08-23 22:16:48 +00:00
}
// m_log.DebugFormat(
// "[XINVENTORY SERVICE]: Found folder {0} {1} for type {2} for user {3}",
// folders[0].folderName, folders[0].folderID, type, principalID);
2010-01-04 18:47:47 +00:00
return ConvertToOpenSim ( folders [ 0 ] ) ;
}
2010-01-31 19:10:57 +00:00
public virtual InventoryCollection GetFolderContent ( UUID principalID , UUID folderID )
2010-01-04 18:47:47 +00:00
{
2010-01-04 20:52:44 +00:00
// This method doesn't receive a valud principal id from the
// connector. So we disregard the principal and look
// by ID.
/ /
2011-04-24 23:14:24 +00:00
//m_log.DebugFormat("[XINVENTORY SERVICE]: Fetch contents for folder {0}", folderID.ToString());
2010-01-04 18:47:47 +00:00
InventoryCollection inventory = new InventoryCollection ( ) ;
2015-05-08 02:24:08 +00:00
inventory . OwnerID = principalID ;
2010-01-04 18:47:47 +00:00
inventory . Folders = new List < InventoryFolderBase > ( ) ;
inventory . Items = new List < InventoryItemBase > ( ) ;
XInventoryFolder [ ] folders = m_Database . GetFolders (
2010-01-04 20:52:44 +00:00
new string [ ] { "parentFolderID" } ,
new string [ ] { folderID . ToString ( ) } ) ;
2010-01-04 18:47:47 +00:00
foreach ( XInventoryFolder x in folders )
2010-01-04 20:52:44 +00:00
{
2010-04-29 18:39:13 +00:00
//m_log.DebugFormat("[XINVENTORY]: Adding folder {0} to response", x.folderName);
2010-01-04 18:47:47 +00:00
inventory . Folders . Add ( ConvertToOpenSim ( x ) ) ;
2010-01-04 20:52:44 +00:00
}
2010-01-04 18:47:47 +00:00
XInventoryItem [ ] items = m_Database . GetItems (
2010-01-04 20:52:44 +00:00
new string [ ] { "parentFolderID" } ,
new string [ ] { folderID . ToString ( ) } ) ;
2010-01-04 18:47:47 +00:00
foreach ( XInventoryItem i in items )
2010-01-04 20:52:44 +00:00
{
2010-04-29 18:39:13 +00:00
//m_log.DebugFormat("[XINVENTORY]: Adding item {0} to response", i.inventoryName);
2010-01-04 18:47:47 +00:00
inventory . Items . Add ( ConvertToOpenSim ( i ) ) ;
2010-01-04 20:52:44 +00:00
}
2010-01-04 18:47:47 +00:00
2015-05-08 02:24:08 +00:00
InventoryFolderBase f = new InventoryFolderBase ( folderID , principalID ) ;
f = GetFolder ( f ) ;
if ( f ! = null )
{
inventory . Version = f . Version ;
inventory . OwnerID = f . Owner ;
}
inventory . FolderID = folderID ;
2010-01-04 18:47:47 +00:00
return inventory ;
}
2015-05-08 02:24:08 +00:00
public virtual InventoryCollection [ ] GetMultipleFoldersContent ( UUID principalID , UUID [ ] folderIDs )
{
InventoryCollection [ ] multiple = new InventoryCollection [ folderIDs . Length ] ;
int i = 0 ;
foreach ( UUID fid in folderIDs )
multiple [ i + + ] = GetFolderContent ( principalID , fid ) ;
return multiple ;
}
2010-01-04 18:47:47 +00:00
2010-01-31 19:10:57 +00:00
public virtual List < InventoryItemBase > GetFolderItems ( UUID principalID , UUID folderID )
2010-01-04 18:47:47 +00:00
{
2010-07-14 16:12:12 +00:00
// m_log.DebugFormat("[XINVENTORY]: Fetch items for folder {0}", folderID);
2010-01-04 20:52:44 +00:00
// Since we probably don't get a valid principal here, either ...
/ /
2010-01-04 18:47:47 +00:00
List < InventoryItemBase > invItems = new List < InventoryItemBase > ( ) ;
XInventoryItem [ ] items = m_Database . GetItems (
2010-07-14 16:12:12 +00:00
new string [ ] { "parentFolderID" } ,
new string [ ] { folderID . ToString ( ) } ) ;
2010-01-04 18:47:47 +00:00
foreach ( XInventoryItem i in items )
invItems . Add ( ConvertToOpenSim ( i ) ) ;
return invItems ;
}
2010-01-31 19:10:57 +00:00
public virtual bool AddFolder ( InventoryFolderBase folder )
2010-01-04 18:47:47 +00:00
{
2012-05-21 20:00:22 +00:00
// m_log.DebugFormat("[XINVENTORY]: Add folder {0} type {1} in parent {2}", folder.Name, folder.Type, folder.ParentID);
2010-09-01 23:00:54 +00:00
InventoryFolderBase check = GetFolder ( folder ) ;
if ( check ! = null )
return false ;
2012-08-29 01:01:43 +00:00
if ( folder . Type ! = ( short ) AssetType . Folder & & folder . Type ! = ( short ) AssetType . Unknown )
2012-05-18 22:55:18 +00:00
{
2012-08-25 01:00:17 +00:00
InventoryFolderBase rootFolder = GetRootFolder ( folder . Owner ) ;
if ( rootFolder = = null )
{
m_log . WarnFormat (
"[XINVENTORY]: Found no root folder for {0} in AddFolder() when looking for {1}" ,
folder . Owner , folder . Type ) ;
return false ;
}
// Check we're not trying to add this as a system folder.
if ( folder . ParentID = = rootFolder . ID )
{
InventoryFolderBase existingSystemFolder
= GetSystemFolderForType ( rootFolder , ( AssetType ) folder . Type ) ;
if ( existingSystemFolder ! = null )
{
m_log . WarnFormat (
"[XINVENTORY]: System folder of type {0} already exists when tried to add {1} to {2} for {3}" ,
folder . Type , folder . Name , folder . ParentID , folder . Owner ) ;
return false ;
}
}
2012-05-18 22:55:18 +00:00
}
2012-04-06 18:48:41 +00:00
2012-08-25 01:00:17 +00:00
XInventoryFolder xFolder = ConvertFromOpenSim ( folder ) ;
return m_Database . StoreFolder ( xFolder ) ;
2010-01-04 18:47:47 +00:00
}
2010-01-31 19:10:57 +00:00
public virtual bool UpdateFolder ( InventoryFolderBase folder )
2010-01-04 18:47:47 +00:00
{
2012-05-21 18:38:43 +00:00
// m_log.DebugFormat("[XINVENTORY]: Update folder {0} {1} ({2})", folder.Name, folder.Type, folder.ID);
2010-09-01 23:00:54 +00:00
XInventoryFolder xFolder = ConvertFromOpenSim ( folder ) ;
InventoryFolderBase check = GetFolder ( folder ) ;
2012-05-21 18:38:43 +00:00
2010-09-01 23:00:54 +00:00
if ( check = = null )
return AddFolder ( folder ) ;
2012-05-21 18:38:43 +00:00
if ( ( check . Type ! = ( short ) AssetType . Unknown | | xFolder . type ! = ( short ) AssetType . Unknown )
& & ( check . Type ! = ( short ) AssetType . OutfitFolder | | xFolder . type ! = ( short ) AssetType . OutfitFolder ) )
2010-09-01 23:04:17 +00:00
{
2012-03-27 22:11:06 +00:00
if ( xFolder . version < check . Version )
2012-04-06 18:48:41 +00:00
{
2012-05-21 18:38:43 +00:00
// m_log.DebugFormat("[XINVENTORY]: {0} < {1} can't do", xFolder.version, check.Version);
2010-09-01 23:04:17 +00:00
return false ;
2012-04-06 18:48:41 +00:00
}
2012-05-21 18:38:43 +00:00
2010-09-01 23:20:57 +00:00
check . Version = ( ushort ) xFolder . version ;
2010-09-01 23:04:17 +00:00
xFolder = ConvertFromOpenSim ( check ) ;
2012-05-21 20:00:22 +00:00
2012-05-21 18:38:43 +00:00
// m_log.DebugFormat(
// "[XINVENTORY]: Storing version only update to system folder {0} {1} {2}",
// xFolder.folderName, xFolder.version, xFolder.type);
2010-09-01 23:04:17 +00:00
return m_Database . StoreFolder ( xFolder ) ;
}
2010-09-01 23:00:54 +00:00
2010-09-01 23:02:07 +00:00
if ( xFolder . version < check . Version )
xFolder . version = check . Version ;
2012-05-21 18:38:43 +00:00
2010-09-01 23:00:54 +00:00
xFolder . folderID = check . ID ;
return m_Database . StoreFolder ( xFolder ) ;
2010-01-04 18:47:47 +00:00
}
2010-01-31 19:10:57 +00:00
public virtual bool MoveFolder ( InventoryFolderBase folder )
2010-01-04 18:47:47 +00:00
{
2012-11-09 00:59:18 +00:00
return m_Database . MoveFolder ( folder . ID . ToString ( ) , folder . ParentID . ToString ( ) ) ;
2010-01-04 18:47:47 +00:00
}
// We don't check the principal's ID here
/ /
2010-01-31 19:10:57 +00:00
public virtual bool DeleteFolders ( UUID principalID , List < UUID > folderIDs )
2012-04-23 15:36:36 +00:00
{
2012-05-04 19:37:21 +00:00
return DeleteFolders ( principalID , folderIDs , true ) ;
2012-04-23 15:36:36 +00:00
}
2012-05-04 19:37:21 +00:00
public virtual bool DeleteFolders ( UUID principalID , List < UUID > folderIDs , bool onlyIfTrash )
2010-01-04 18:47:47 +00:00
{
2010-07-24 22:36:07 +00:00
if ( ! m_AllowDelete )
return false ;
2010-01-04 20:52:44 +00:00
// Ignore principal ID, it's bogus at connector level
/ /
2010-01-04 18:47:47 +00:00
foreach ( UUID id in folderIDs )
{
2012-04-23 15:36:36 +00:00
if ( onlyIfTrash & & ! ParentIsTrash ( id ) )
2010-07-24 22:15:06 +00:00
continue ;
2012-04-23 15:36:36 +00:00
//m_log.InfoFormat("[XINVENTORY SERVICE]: Delete folder {0}", id);
2010-01-04 18:47:47 +00:00
InventoryFolderBase f = new InventoryFolderBase ( ) ;
f . ID = id ;
2012-05-04 19:37:21 +00:00
PurgeFolder ( f , onlyIfTrash ) ;
2010-01-04 18:47:47 +00:00
m_Database . DeleteFolders ( "folderID" , id . ToString ( ) ) ;
}
return true ;
}
2010-01-31 19:10:57 +00:00
public virtual bool PurgeFolder ( InventoryFolderBase folder )
2012-04-23 15:36:36 +00:00
{
2012-05-04 19:37:21 +00:00
return PurgeFolder ( folder , true ) ;
2012-04-23 15:36:36 +00:00
}
2012-05-04 19:37:21 +00:00
public virtual bool PurgeFolder ( InventoryFolderBase folder , bool onlyIfTrash )
2010-01-04 18:47:47 +00:00
{
2010-07-24 22:36:07 +00:00
if ( ! m_AllowDelete )
return false ;
2012-04-23 15:36:36 +00:00
if ( onlyIfTrash & & ! ParentIsTrash ( folder . ID ) )
2010-07-24 22:15:06 +00:00
return false ;
2010-01-04 18:47:47 +00:00
XInventoryFolder [ ] subFolders = m_Database . GetFolders (
new string [ ] { "parentFolderID" } ,
new string [ ] { folder . ID . ToString ( ) } ) ;
foreach ( XInventoryFolder x in subFolders )
2010-01-04 20:52:44 +00:00
{
2012-05-04 19:37:21 +00:00
PurgeFolder ( ConvertToOpenSim ( x ) , onlyIfTrash ) ;
2010-01-04 20:52:44 +00:00
m_Database . DeleteFolders ( "folderID" , x . folderID . ToString ( ) ) ;
}
2010-01-04 18:47:47 +00:00
m_Database . DeleteItems ( "parentFolderID" , folder . ID . ToString ( ) ) ;
return true ;
}
2010-01-31 19:10:57 +00:00
public virtual bool AddItem ( InventoryItemBase item )
2010-01-04 18:47:47 +00:00
{
2011-09-23 01:59:33 +00:00
// m_log.DebugFormat(
2012-06-02 03:57:10 +00:00
// "[XINVENTORY SERVICE]: Adding item {0} {1} to folder {2} for {3}", item.Name, item.ID, item.Folder, item.Owner);
2010-08-23 22:16:48 +00:00
2010-01-04 18:47:47 +00:00
return m_Database . StoreItem ( ConvertFromOpenSim ( item ) ) ;
}
2010-01-31 19:10:57 +00:00
public virtual bool UpdateItem ( InventoryItemBase item )
2010-01-04 18:47:47 +00:00
{
2011-05-18 23:51:14 +00:00
if ( ! m_AllowDelete )
if ( item . AssetType = = ( sbyte ) AssetType . Link | | item . AssetType = = ( sbyte ) AssetType . LinkFolder )
return false ;
2011-09-23 01:59:33 +00:00
// m_log.InfoFormat(
// "[XINVENTORY SERVICE]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder);
2012-11-17 01:01:14 +00:00
InventoryItemBase retrievedItem = GetItem ( item ) ;
if ( retrievedItem = = null )
{
m_log . WarnFormat (
"[XINVENTORY SERVICE]: Tried to update item {0} {1}, owner {2} but no existing item found." ,
item . Name , item . ID , item . Owner ) ;
return false ;
}
// Do not allow invariants to change. Changes to folder ID occur in MoveItems()
if ( retrievedItem . InvType ! = item . InvType
| | retrievedItem . AssetType ! = item . AssetType
| | retrievedItem . Folder ! = item . Folder
| | retrievedItem . CreatorIdentification ! = item . CreatorIdentification
| | retrievedItem . Owner ! = item . Owner )
{
m_log . WarnFormat (
"[XINVENTORY SERVICE]: Caller to UpdateItem() for {0} {1} tried to alter property(s) that should be invariant, (InvType, AssetType, Folder, CreatorIdentification, Owner), existing ({2}, {3}, {4}, {5}, {6}), update ({7}, {8}, {9}, {10}, {11})" ,
retrievedItem . Name ,
retrievedItem . ID ,
retrievedItem . InvType ,
retrievedItem . AssetType ,
retrievedItem . Folder ,
retrievedItem . CreatorIdentification ,
retrievedItem . Owner ,
item . InvType ,
item . AssetType ,
item . Folder ,
item . CreatorIdentification ,
item . Owner ) ;
item . InvType = retrievedItem . InvType ;
item . AssetType = retrievedItem . AssetType ;
item . Folder = retrievedItem . Folder ;
item . CreatorIdentification = retrievedItem . CreatorIdentification ;
item . Owner = retrievedItem . Owner ;
}
2010-01-04 18:47:47 +00:00
return m_Database . StoreItem ( ConvertFromOpenSim ( item ) ) ;
}
2010-01-31 19:10:57 +00:00
public virtual bool MoveItems ( UUID principalID , List < InventoryItemBase > items )
2010-01-04 18:47:47 +00:00
{
2010-01-04 20:52:44 +00:00
// Principal is b0rked. *sigh*
/ /
2010-01-04 18:47:47 +00:00
foreach ( InventoryItemBase i in items )
{
2010-01-04 20:52:44 +00:00
m_Database . MoveItem ( i . ID . ToString ( ) , i . Folder . ToString ( ) ) ;
2010-01-04 18:47:47 +00:00
}
return true ;
}
2010-01-31 19:10:57 +00:00
public virtual bool DeleteItems ( UUID principalID , List < UUID > itemIDs )
2010-01-04 18:47:47 +00:00
{
2010-07-24 22:36:07 +00:00
if ( ! m_AllowDelete )
2011-05-18 23:51:14 +00:00
{
// We must still allow links and links to folders to be deleted, otherwise they will build up
// in the player's inventory until they can no longer log in. Deletions of links due to code bugs or
// similar is inconvenient but on a par with accidental movement of items. The original item is never
// touched.
foreach ( UUID id in itemIDs )
{
if ( ! m_Database . DeleteItems (
new string [ ] { "inventoryID" , "assetType" } ,
2011-05-26 00:32:12 +00:00
new string [ ] { id . ToString ( ) , ( ( sbyte ) AssetType . Link ) . ToString ( ) } ) )
2011-05-18 23:51:14 +00:00
{
m_Database . DeleteItems (
new string [ ] { "inventoryID" , "assetType" } ,
new string [ ] { id . ToString ( ) , ( ( sbyte ) AssetType . LinkFolder ) . ToString ( ) } ) ;
}
}
}
else
{
// Just use the ID... *facepalms*
/ /
foreach ( UUID id in itemIDs )
m_Database . DeleteItems ( "inventoryID" , id . ToString ( ) ) ;
}
2010-01-04 18:47:47 +00:00
return true ;
}
2010-01-31 19:10:57 +00:00
public virtual InventoryItemBase GetItem ( InventoryItemBase item )
2010-01-04 18:47:47 +00:00
{
XInventoryItem [ ] items = m_Database . GetItems (
new string [ ] { "inventoryID" } ,
new string [ ] { item . ID . ToString ( ) } ) ;
if ( items . Length = = 0 )
return null ;
return ConvertToOpenSim ( items [ 0 ] ) ;
}
2010-01-31 19:10:57 +00:00
public virtual InventoryFolderBase GetFolder ( InventoryFolderBase folder )
2010-01-04 18:47:47 +00:00
{
XInventoryFolder [ ] folders = m_Database . GetFolders (
new string [ ] { "folderID" } ,
new string [ ] { folder . ID . ToString ( ) } ) ;
if ( folders . Length = = 0 )
return null ;
return ConvertToOpenSim ( folders [ 0 ] ) ;
}
2010-01-31 19:10:57 +00:00
public virtual List < InventoryItemBase > GetActiveGestures ( UUID principalID )
2010-01-04 18:47:47 +00:00
{
2010-01-04 20:52:44 +00:00
XInventoryItem [ ] items = m_Database . GetActiveGestures ( principalID ) ;
if ( items . Length = = 0 )
2010-05-16 16:12:40 +00:00
return new List < InventoryItemBase > ( ) ;
2010-01-04 20:52:44 +00:00
List < InventoryItemBase > ret = new List < InventoryItemBase > ( ) ;
foreach ( XInventoryItem x in items )
ret . Add ( ConvertToOpenSim ( x ) ) ;
return ret ;
2010-01-04 18:47:47 +00:00
}
2010-01-31 19:10:57 +00:00
public virtual int GetAssetPermissions ( UUID principalID , UUID assetID )
2010-01-04 18:47:47 +00:00
{
2010-01-04 20:52:44 +00:00
return m_Database . GetAssetPermissions ( principalID , assetID ) ;
2010-01-04 18:47:47 +00:00
}
// Unused.
/ /
public bool HasInventoryForUser ( UUID userID )
{
return false ;
}
// CM Helpers
/ /
2010-01-31 19:10:57 +00:00
protected InventoryFolderBase ConvertToOpenSim ( XInventoryFolder folder )
2010-01-04 18:47:47 +00:00
{
InventoryFolderBase newFolder = new InventoryFolderBase ( ) ;
newFolder . ParentID = folder . parentFolderID ;
newFolder . Type = ( short ) folder . type ;
2012-04-06 18:48:41 +00:00
// Viewer can't understand anything that's not in it's LLFolderType enum
2014-05-04 10:36:36 +00:00
if ( newFolder . Type = = InventoryItemBase . SUITCASE_FOLDER_TYPE )
newFolder . Type = InventoryItemBase . SUITCASE_FOLDER_FAKE_TYPE ;
2010-01-04 18:47:47 +00:00
newFolder . Version = ( ushort ) folder . version ;
newFolder . Name = folder . folderName ;
newFolder . Owner = folder . agentID ;
newFolder . ID = folder . folderID ;
return newFolder ;
}
2010-01-31 19:10:57 +00:00
protected XInventoryFolder ConvertFromOpenSim ( InventoryFolderBase folder )
2010-01-04 18:47:47 +00:00
{
XInventoryFolder newFolder = new XInventoryFolder ( ) ;
newFolder . parentFolderID = folder . ParentID ;
newFolder . type = ( int ) folder . Type ;
newFolder . version = ( int ) folder . Version ;
newFolder . folderName = folder . Name ;
newFolder . agentID = folder . Owner ;
newFolder . folderID = folder . ID ;
return newFolder ;
}
2010-01-31 19:10:57 +00:00
protected InventoryItemBase ConvertToOpenSim ( XInventoryItem item )
2010-01-04 18:47:47 +00:00
{
InventoryItemBase newItem = new InventoryItemBase ( ) ;
newItem . AssetID = item . assetID ;
newItem . AssetType = item . assetType ;
newItem . Name = item . inventoryName ;
newItem . Owner = item . avatarID ;
newItem . ID = item . inventoryID ;
newItem . InvType = item . invType ;
newItem . Folder = item . parentFolderID ;
2010-11-22 01:19:24 +00:00
newItem . CreatorIdentification = item . creatorID ;
2010-01-04 18:47:47 +00:00
newItem . Description = item . inventoryDescription ;
newItem . NextPermissions = ( uint ) item . inventoryNextPermissions ;
newItem . CurrentPermissions = ( uint ) item . inventoryCurrentPermissions ;
newItem . BasePermissions = ( uint ) item . inventoryBasePermissions ;
newItem . EveryOnePermissions = ( uint ) item . inventoryEveryOnePermissions ;
newItem . GroupPermissions = ( uint ) item . inventoryGroupPermissions ;
newItem . GroupID = item . groupID ;
2010-01-31 19:26:12 +00:00
if ( item . groupOwned = = 0 )
newItem . GroupOwned = false ;
else
newItem . GroupOwned = true ;
2010-01-04 18:47:47 +00:00
newItem . SalePrice = item . salePrice ;
newItem . SaleType = ( byte ) item . saleType ;
newItem . Flags = ( uint ) item . flags ;
newItem . CreationDate = item . creationDate ;
return newItem ;
}
2010-01-31 19:10:57 +00:00
protected XInventoryItem ConvertFromOpenSim ( InventoryItemBase item )
2010-01-04 18:47:47 +00:00
{
XInventoryItem newItem = new XInventoryItem ( ) ;
newItem . assetID = item . AssetID ;
newItem . assetType = item . AssetType ;
newItem . inventoryName = item . Name ;
newItem . avatarID = item . Owner ;
newItem . inventoryID = item . ID ;
newItem . invType = item . InvType ;
newItem . parentFolderID = item . Folder ;
2010-11-22 01:19:24 +00:00
newItem . creatorID = item . CreatorIdentification ;
2010-01-04 18:47:47 +00:00
newItem . inventoryDescription = item . Description ;
newItem . inventoryNextPermissions = ( int ) item . NextPermissions ;
newItem . inventoryCurrentPermissions = ( int ) item . CurrentPermissions ;
newItem . inventoryBasePermissions = ( int ) item . BasePermissions ;
newItem . inventoryEveryOnePermissions = ( int ) item . EveryOnePermissions ;
newItem . inventoryGroupPermissions = ( int ) item . GroupPermissions ;
newItem . groupID = item . GroupID ;
2010-01-31 19:26:12 +00:00
if ( item . GroupOwned )
newItem . groupOwned = 1 ;
else
newItem . groupOwned = 0 ;
2010-01-04 18:47:47 +00:00
newItem . salePrice = item . SalePrice ;
newItem . saleType = ( int ) item . SaleType ;
newItem . flags = ( int ) item . Flags ;
newItem . creationDate = item . CreationDate ;
return newItem ;
}
2010-07-24 22:15:06 +00:00
private bool ParentIsTrash ( UUID folderID )
{
XInventoryFolder [ ] folder = m_Database . GetFolders ( new string [ ] { "folderID" } , new string [ ] { folderID . ToString ( ) } ) ;
if ( folder . Length < 1 )
return false ;
2010-08-06 13:18:48 +00:00
if ( folder [ 0 ] . type = = ( int ) AssetType . TrashFolder )
return true ;
2010-07-24 22:15:06 +00:00
UUID parentFolder = folder [ 0 ] . parentFolderID ;
while ( parentFolder ! = UUID . Zero )
{
XInventoryFolder [ ] parent = m_Database . GetFolders ( new string [ ] { "folderID" } , new string [ ] { parentFolder . ToString ( ) } ) ;
if ( parent . Length < 1 )
return false ;
if ( parent [ 0 ] . type = = ( int ) AssetType . TrashFolder )
return true ;
if ( parent [ 0 ] . type = = ( int ) AssetType . RootFolder )
return false ;
parentFolder = parent [ 0 ] . parentFolderID ;
}
return false ;
}
2010-01-04 18:47:47 +00:00
}
}