mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 19:36:07 +08:00
Grid Inventory feature upgrade: renaming folders should now be correct, subfolders work, moving folders works.
Tested only in MYSQL, but may work in MSSQL and sqlite. Probably not working in standalone mode.
This commit is contained in:
@@ -142,5 +142,15 @@ namespace OpenSim.Framework.Communications.Cache
|
||||
}
|
||||
return itemList;
|
||||
}
|
||||
|
||||
public List<InventoryFolderBase> RequestListOfFolders()
|
||||
{
|
||||
List<InventoryFolderBase> folderList = new List<InventoryFolderBase>();
|
||||
foreach (InventoryFolderBase folder in SubFolders.Values)
|
||||
{
|
||||
folderList.Add(folder);
|
||||
}
|
||||
return folderList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,6 +147,23 @@ namespace OpenSim.Framework.Communications.Cache
|
||||
}
|
||||
}
|
||||
|
||||
public void HandleMoveInventoryFolder(IClientAPI remoteClient, LLUUID folderID, LLUUID parentID)
|
||||
{
|
||||
CachedUserInfo userProfile;
|
||||
|
||||
if (m_userProfiles.TryGetValue(remoteClient.AgentId, out userProfile))
|
||||
{
|
||||
if (userProfile.RootFolder != null)
|
||||
{
|
||||
InventoryFolderBase baseFolder = new InventoryFolderBase();
|
||||
baseFolder.agentID = remoteClient.AgentId;
|
||||
baseFolder.folderID = folderID;
|
||||
baseFolder.parentID = parentID;
|
||||
m_parent.InventoryService.MoveInventoryFolder(remoteClient.AgentId, baseFolder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tell the client about the various child items and folders contained in the requested folder.
|
||||
/// </summary>
|
||||
@@ -163,14 +180,15 @@ namespace OpenSim.Framework.Communications.Cache
|
||||
if (folderID == libraryRoot.folderID)
|
||||
{
|
||||
remoteClient.SendInventoryFolderDetails(libraryRoot.agentID, libraryRoot.folderID,
|
||||
libraryRoot.RequestListOfItems(), libraryRoot.SubFoldersCount);
|
||||
libraryRoot.RequestListOfItems(), libraryRoot.RequestListOfFolders(), libraryRoot.SubFoldersCount);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ((fold = libraryRoot.HasSubFolder(folderID)) != null)
|
||||
{
|
||||
remoteClient.SendInventoryFolderDetails(libraryRoot.agentID, folderID, fold.RequestListOfItems(), fold.SubFoldersCount);
|
||||
System.Console.WriteLine("fetching librarysubfolder");
|
||||
remoteClient.SendInventoryFolderDetails(libraryRoot.agentID, folderID, fold.RequestListOfItems(), fold.RequestListOfFolders(), fold.SubFoldersCount);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -182,19 +200,19 @@ namespace OpenSim.Framework.Communications.Cache
|
||||
{
|
||||
if (userProfile.RootFolder.folderID == folderID)
|
||||
{
|
||||
System.Console.Write("fetching root folder");
|
||||
if (fetchItems)
|
||||
{
|
||||
remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID,
|
||||
userProfile.RootFolder.RequestListOfItems(), userProfile.RootFolder.SubFoldersCount);
|
||||
userProfile.RootFolder.RequestListOfItems(), userProfile.RootFolder.RequestListOfFolders(), userProfile.RootFolder.SubFoldersCount);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
InventoryFolderImpl folder = userProfile.RootFolder.HasSubFolder(folderID);
|
||||
|
||||
if (fetchItems && folder != null)
|
||||
if ((fold = userProfile.RootFolder.HasSubFolder(folderID)) != null)
|
||||
{
|
||||
remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, folder.RequestListOfItems(), folder.SubFoldersCount);
|
||||
remoteClient.SendInventoryFolderDetails(remoteClient.AgentId, folderID, fold.RequestListOfItems(), fold.RequestListOfFolders(), fold.SubFoldersCount);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ namespace OpenSim.Framework.Communications
|
||||
{
|
||||
void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, InventoryItemInfo itemCallBack);
|
||||
void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder);
|
||||
void MoveInventoryFolder(LLUUID userID, InventoryFolderBase folder);
|
||||
void AddNewInventoryItem(LLUUID userID, InventoryItemBase item);
|
||||
void DeleteInventoryItem(LLUUID userID, InventoryItemBase item);
|
||||
void CreateNewUserInventory(LLUUID user);
|
||||
|
||||
@@ -127,6 +127,17 @@ namespace OpenSim.Framework.Communications
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void MoveInventoryFolder(LLUUID userID, InventoryFolderBase folder)
|
||||
{
|
||||
foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins)
|
||||
{
|
||||
plugin.Value.moveInventoryFolder(folder);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -161,6 +172,14 @@ namespace OpenSim.Framework.Communications
|
||||
}
|
||||
}
|
||||
|
||||
public void MoveFolder(InventoryFolderBase folder)
|
||||
{
|
||||
foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins)
|
||||
{
|
||||
plugin.Value.moveInventoryFolder(folder);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddItem(InventoryItemBase item)
|
||||
{
|
||||
foreach (KeyValuePair<string, IInventoryData> plugin in m_plugins)
|
||||
@@ -251,6 +270,7 @@ namespace OpenSim.Framework.Communications
|
||||
InventoryItemInfo itemCallBack);
|
||||
|
||||
public abstract void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder);
|
||||
public abstract void MoveExistingInventoryFolder(InventoryFolderBase folder);
|
||||
public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item);
|
||||
public abstract void DeleteInventoryItem(LLUUID userID, InventoryItemBase item);
|
||||
}
|
||||
|
||||
@@ -604,6 +604,34 @@ namespace OpenSim.Framework.Data.MSSQL
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates an inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">Folder to update</param>
|
||||
|
||||
public void moveInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
SqlCommand command = new SqlCommand("UPDATE inventoryfolders set folderID = @folderID, " +
|
||||
"parentFolderID = @parentFolderID," +
|
||||
"folderID = @keyFolderID;", database.getConnection());
|
||||
SqlParameter param1 = new SqlParameter("@folderID", folder.folderID.ToStringHyphenated());
|
||||
SqlParameter param2 = new SqlParameter("@parentFolderID", folder.parentID.ToStringHyphenated());
|
||||
SqlParameter param3 = new SqlParameter("@keyFolderID", folder.folderID.ToStringHyphenated());
|
||||
command.Parameters.Add(param1);
|
||||
command.Parameters.Add(param2);
|
||||
command.Parameters.Add(param3);
|
||||
|
||||
try
|
||||
{
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MainLog.Instance.Error(e.ToString());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Append a list of all the child folders of a parent folder
|
||||
|
||||
@@ -529,6 +529,28 @@ namespace OpenSim.Framework.Data.MySQL
|
||||
addInventoryFolder(folder);
|
||||
}
|
||||
|
||||
/// Creates a new inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">Folder to create</param>
|
||||
public void moveInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
string sql =
|
||||
"UPDATE inventoryfolders SET parentFolderID=?parentFolderID WHERE folderID=?folderID";
|
||||
|
||||
MySqlCommand cmd = new MySqlCommand(sql, database.Connection);
|
||||
cmd.Parameters.AddWithValue("?folderID", folder.folderID.ToStringHyphenated());
|
||||
cmd.Parameters.AddWithValue("?parentFolderID", folder.parentID.ToStringHyphenated());
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MainLog.Instance.Error(e.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Append a list of all the child folders of a parent folder
|
||||
|
||||
@@ -141,6 +141,24 @@ namespace OpenSim.Framework.Data.SQLite
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
|
||||
private void moveFolder(InventoryFolderBase folder)
|
||||
{
|
||||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
||||
DataRow inventoryRow = inventoryFolderTable.Rows.Find(folder.folderID);
|
||||
if (inventoryRow == null)
|
||||
{
|
||||
inventoryRow = inventoryFolderTable.NewRow();
|
||||
fillFolderRow(inventoryRow, folder);
|
||||
inventoryFolderTable.Rows.Add(inventoryRow);
|
||||
}
|
||||
else
|
||||
{
|
||||
moveFolderRow(inventoryRow, folder);
|
||||
}
|
||||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
private void addItem(InventoryItemBase item)
|
||||
{
|
||||
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
|
||||
@@ -403,6 +421,15 @@ namespace OpenSim.Framework.Data.SQLite
|
||||
addFolder(folder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Moves a folder based on its ID with folder
|
||||
/// </summary>
|
||||
/// <param name="folder">The inventory folder</param>
|
||||
public void moveInventoryFolder(InventoryFolderBase folder)
|
||||
{
|
||||
moveFolder(folder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete a folder
|
||||
/// </summary>
|
||||
@@ -534,6 +561,11 @@ namespace OpenSim.Framework.Data.SQLite
|
||||
row["version"] = folder.version;
|
||||
}
|
||||
|
||||
private void moveFolderRow(DataRow row, InventoryFolderBase folder)
|
||||
{
|
||||
row["UUID"] = folder.folderID;
|
||||
row["parentID"] = folder.parentID;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
|
||||
@@ -330,6 +330,9 @@ namespace OpenSim.Framework
|
||||
public delegate void UpdateInventoryFolder(
|
||||
IClientAPI remoteClient, LLUUID folderID, ushort type, string name, LLUUID parentID);
|
||||
|
||||
public delegate void MoveInventoryFolder(
|
||||
IClientAPI remoteClient, LLUUID folderID, LLUUID parentID);
|
||||
|
||||
public delegate void CreateNewInventoryItem(
|
||||
IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID, uint callbackID, string description, string name,
|
||||
sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask);
|
||||
@@ -432,6 +435,7 @@ namespace OpenSim.Framework
|
||||
event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||
event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||
event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||
event MoveInventoryFolder OnMoveInventoryFolder;
|
||||
event FetchInventoryDescendents OnFetchInventoryDescendents;
|
||||
event PurgeInventoryDescendents OnPurgeInventoryDescendents;
|
||||
event FetchInventory OnFetchInventory;
|
||||
@@ -522,7 +526,7 @@ namespace OpenSim.Framework
|
||||
void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position,
|
||||
LLQuaternion rotation, LLVector3 velocity, LLVector3 rotationalvelocity);
|
||||
|
||||
void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List<InventoryItemBase> items, int subFoldersCount);
|
||||
void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List<InventoryItemBase> items, List<InventoryFolderBase> folders, int subFoldersCount);
|
||||
void SendInventoryItemDetails(LLUUID ownerID, InventoryItemBase item);
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -238,6 +238,12 @@ namespace OpenSim.Framework
|
||||
/// <param name="folder">The inventory folder</param>
|
||||
void updateInventoryFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Updates a folder based on its ID with folder
|
||||
/// </summary>
|
||||
/// <param name="folder">The inventory folder</param>
|
||||
void moveInventoryFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes a folder based on its ID with folder
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user