diff --git a/.gitignore b/.gitignore
index c5c6da3b0e..03761258eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,3 +43,4 @@ OpenSim/OpenSim.usertasks
TAGS
*~
Makefile.local
+bin/.version
diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs
index a1cd116a9b..aec06be6bf 100644
--- a/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs
+++ b/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs
@@ -265,7 +265,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
if (Rest.InventoryServices.HasInventoryForUser(rdata.uuid))
{
- rdata.root = Rest.InventoryServices.RequestRootFolder(rdata.uuid);
+ rdata.root = Rest.InventoryServices.GetRootFolder(rdata.uuid);
Rest.Log.DebugFormat("{0} Inventory Root retrieved for {1} {2}",
MsgId, rdata.userProfile.FirstName, rdata.userProfile.SurName);
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
index 10aff429ba..8ee1b1a284 100644
--- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
+++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs
@@ -49,16 +49,24 @@ namespace OpenSim.Framework.Communications.Cache
IClientAPI client, UUID folderID, bool fetchFolders, bool fetchItems);
public delegate void OnItemReceivedDelegate(UUID itemID);
+ public delegate void OnInventoryReceivedDelegate(UUID userID);
///
/// Stores user profile and inventory data received from backend services for a particular user.
///
public class CachedUserInfo
- {
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ ////
+ /// Fired when a particular item has been received from the inventory service
+ ///
public event OnItemReceivedDelegate OnItemReceived;
- private static readonly ILog m_log
- = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ ///
+ /// Fired once the entire inventory has been received for the user
+ ///
+ public event OnInventoryReceivedDelegate OnInventoryReceived;
///
/// The comms manager holds references to services (user, grid, inventory, etc.)
@@ -133,7 +141,9 @@ namespace OpenSim.Framework.Communications.Cache
UUID parentFolderId = folder.ParentID;
if (dictionary.ContainsKey(parentFolderId))
+ {
dictionary[parentFolderId].Add(folder);
+ }
else
{
IList folders = new List();
@@ -299,6 +309,9 @@ namespace OpenSim.Framework.Communications.Cache
request.Execute();
}
}
+
+ if (OnInventoryReceived != null)
+ OnInventoryReceived(UserProfile.ID);
}
///
diff --git a/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs b/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs
index 0402883794..fe88cf5249 100644
--- a/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs
+++ b/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs
@@ -43,6 +43,18 @@ namespace OpenSim.Framework.Communications.Tests
[TestFixture]
public class UserProfileCacheServiceTests
{
+ /// Used by tests to indicate whether an async operation timed out
+ private bool timedOut;
+
+ private void InventoryReceived(UUID userId)
+ {
+ lock (this)
+ {
+ timedOut = false;
+ Monitor.PulseAll(this);
+ }
+ }
+
[Test]
public void TestGetUserDetails()
{
@@ -118,14 +130,15 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
- }
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
+
+ timedOut = true;
+ lock (this)
+ {
+ UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
+ }
+
+ Assert.That(timedOut, Is.False, "Timed out");
}
[Test]
@@ -134,14 +147,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000011");
Assert.That(userInfo.RootFolder.GetChildFolder(folderId), Is.Null);
@@ -156,14 +168,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folderId = UUID.Parse("00000000-0000-0000-0000-000000000010");
Assert.That(userInfo.RootFolder.ContainsChildFolder(folderId), Is.False);
@@ -192,14 +203,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
InventoryFolderImpl rootFolder = userInfo.RootFolder;
@@ -258,14 +268,13 @@ namespace OpenSim.Framework.Communications.Tests
TestHelper.InMethod();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000020");
UUID folder2Id = UUID.Parse("00000000-0000-0000-0000-000000000021");
@@ -299,14 +308,13 @@ namespace OpenSim.Framework.Communications.Tests
//log4net.Config.XmlConfigurator.Configure();
Scene myScene = SceneSetupHelpers.SetupScene("inventory");
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager);
- for (int i = 0 ; i < 50 ; i++)
- {
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(myScene.CommsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
UUID folder1Id = UUID.Parse("00000000-0000-0000-0000-000000000070");
InventoryFolderImpl rootFolder = userInfo.RootFolder;
@@ -323,4 +331,4 @@ namespace OpenSim.Framework.Communications.Tests
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null);
}
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
index 9e181f34c5..b1b7809efa 100644
--- a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
+++ b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs
@@ -447,4 +447,133 @@ namespace OpenSim.Framework.Communications.Tests
#endregion
}
}
+
+ class TestInventoryService : IInventoryService
+ {
+ public TestInventoryService()
+ {
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool CreateUserInventory(UUID userId)
+ {
+ return false;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public List GetInventorySkeleton(UUID userId)
+ {
+ List folders = new List();
+ InventoryFolderBase folder = new InventoryFolderBase();
+ folder.ID = UUID.Random();
+ folder.Owner = userId;
+ folders.Add(folder);
+ return folders;
+ }
+
+ ///
+ /// Returns a list of all the active gestures in a user's inventory.
+ ///
+ ///
+ /// The of the user
+ ///
+ ///
+ /// A flat list of the gesture items.
+ ///
+ public List GetActiveGestures(UUID userId)
+ {
+ return null;
+ }
+
+ public InventoryCollection GetUserInventory(UUID userID)
+ {
+ return null;
+ }
+
+ public void GetUserInventory(UUID userID, OpenSim.Services.Interfaces.InventoryReceiptCallback callback)
+ {
+ }
+
+ public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ {
+ return null;
+ }
+
+ public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ return null;
+ }
+
+ public List GetFolderItems(UUID userID, UUID folderID)
+ {
+ return null;
+ }
+
+ public bool AddFolder(InventoryFolderBase folder)
+ {
+ return false;
+ }
+
+ public bool UpdateFolder(InventoryFolderBase folder)
+ {
+ return false;
+ }
+
+ public bool MoveFolder(InventoryFolderBase folder)
+ {
+ return false;
+ }
+
+ public bool PurgeFolder(InventoryFolderBase folder)
+ {
+ return false;
+ }
+
+ public bool AddItem(InventoryItemBase item)
+ {
+ return false;
+ }
+
+ public bool UpdateItem(InventoryItemBase item)
+ {
+ return false;
+ }
+
+ public bool DeleteItem(InventoryItemBase item)
+ {
+ return false;
+ }
+
+ public InventoryItemBase QueryItem(InventoryItemBase item)
+ {
+ return null;
+ }
+
+ public InventoryFolderBase QueryFolder(InventoryFolderBase folder)
+ {
+ return null;
+ }
+
+ public bool HasInventoryForUser(UUID userID)
+ {
+ return false;
+ }
+
+ public InventoryFolderBase GetRootFolder(UUID userID)
+ {
+ InventoryFolderBase root = new InventoryFolderBase();
+ root.ID = UUID.Random();
+ root.Owner = userID;
+ root.ParentID = UUID.Zero;
+ return root;
+ }
+ }
}
diff --git a/OpenSim/Framework/Communications/UserManagerBase.cs b/OpenSim/Framework/Communications/UserManagerBase.cs
index b9044ebe55..58174a0dd6 100644
--- a/OpenSim/Framework/Communications/UserManagerBase.cs
+++ b/OpenSim/Framework/Communications/UserManagerBase.cs
@@ -694,11 +694,11 @@ namespace OpenSim.Framework.Communications
// local service (standalone)
m_log.Debug("[USERSTORAGE]: using IInventoryService to create user's inventory");
m_InventoryService.CreateUserInventory(userProf.ID);
- InventoryFolderBase rootfolder = m_InventoryService.RequestRootFolder(userProf.ID);
+ InventoryFolderBase rootfolder = m_InventoryService.GetRootFolder(userProf.ID);
if (rootfolder != null)
userProf.RootInventoryFolderID = rootfolder.ID;
}
- else
+ else if (m_commsManager.InterServiceInventoryService != null)
{
// used by the user server
m_log.Debug("[USERSTORAGE]: using m_commsManager.InterServiceInventoryService to create user's inventory");
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index d2193ca141..2a975284ed 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -76,7 +76,7 @@ namespace OpenSim.Framework.Servers
protected string m_startupDirectory = Environment.CurrentDirectory;
///
- /// Server version information. Usually VersionInfo + information about svn revision, operating system, etc.
+ /// Server version information. Usually VersionInfo + information about git commit, operating system, etc.
///
protected string m_version;
@@ -422,6 +422,16 @@ namespace OpenSim.Framework.Servers
{
string buildVersion = string.Empty;
+ // Add commit hash and date information if available
+ // The commit hash and date are stored in a file bin/.version
+ // This file can automatically created by a post
+ // commit script in the opensim git master repository or
+ // by issuing the follwoing command from the top level
+ // directory of the opensim repository
+ // git log -n 1 --pretty="format:%h: %ci" >bin/.version
+ // For the full git commit hash use %H instead of %h
+ //
+ // The subversion information is deprecated and will be removed at a later date
// Add subversion revision information if available
// Try file "svn_revision" in the current directory first, then the .svn info.
// This allows to make the revision available in simulators not running from the source tree.
@@ -429,39 +439,53 @@ namespace OpenSim.Framework.Servers
// elsewhere as well
string svnRevisionFileName = "svn_revision";
string svnFileName = ".svn/entries";
+ string gitCommitFileName = ".version";
string inputLine;
int strcmp;
- if (File.Exists(svnRevisionFileName))
+ if (File.Exists( gitCommitFileName))
{
- StreamReader RevisionFile = File.OpenText(svnRevisionFileName);
- buildVersion = RevisionFile.ReadLine();
- buildVersion.Trim();
- RevisionFile.Close();
+ StreamReader CommitFile = File.OpenText(gitCommitFileName);
+ buildVersion = Environment.NewLine + "git# " + CommitFile.ReadLine();
+ CommitFile.Close();
+ m_version += buildVersion ?? "";
}
- if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName))
+ // Remove the else logic when subversion mirror is no longer used
+ else
{
- StreamReader EntriesFile = File.OpenText(svnFileName);
- inputLine = EntriesFile.ReadLine();
- while (inputLine != null)
+ if (File.Exists(svnRevisionFileName))
{
- // using the dir svn revision at the top of entries file
- strcmp = String.Compare(inputLine, "dir");
- if (strcmp == 0)
- {
- buildVersion = EntriesFile.ReadLine();
- break;
- }
- else
- {
- inputLine = EntriesFile.ReadLine();
- }
- }
- EntriesFile.Close();
- }
+ StreamReader RevisionFile = File.OpenText(svnRevisionFileName);
+ buildVersion = RevisionFile.ReadLine();
+ buildVersion.Trim();
+ RevisionFile.Close();
- m_version += string.IsNullOrEmpty(buildVersion) ? " " : ("." + buildVersion + " ").Substring(0, 6);
+ }
+
+ if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName))
+ {
+ StreamReader EntriesFile = File.OpenText(svnFileName);
+ inputLine = EntriesFile.ReadLine();
+ while (inputLine != null)
+ {
+ // using the dir svn revision at the top of entries file
+ strcmp = String.Compare(inputLine, "dir");
+ if (strcmp == 0)
+ {
+ buildVersion = EntriesFile.ReadLine();
+ break;
+ }
+ else
+ {
+ inputLine = EntriesFile.ReadLine();
+ }
+ }
+ EntriesFile.Close();
+ }
+
+ m_version += string.IsNullOrEmpty(buildVersion) ? " " : ("." + buildVersion + " ").Substring(0, 6);
+ }
}
protected void CreatePIDFile(string path)
diff --git a/OpenSim/Framework/UserProfileData.cs b/OpenSim/Framework/UserProfileData.cs
index b226bbaf43..f51a1997c4 100644
--- a/OpenSim/Framework/UserProfileData.cs
+++ b/OpenSim/Framework/UserProfileData.cs
@@ -114,6 +114,11 @@ namespace OpenSim.Framework
///
private uint m_profileWantDoMask; // Profile window "I want to" mask
+ ///
+ /// The profile url for an avatar
+ ///
+ private string m_profileUrl;
+
private UUID m_rootInventoryFolderId;
///
@@ -349,6 +354,12 @@ namespace OpenSim.Framework
set { m_profileFirstText = value; }
}
+ public string ProfileUrl
+ {
+ get { return m_profileUrl; }
+ set { m_profileUrl = value; }
+ }
+
public UUID Image
{
get { return m_profileImage; }
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 3d58839742..7633b7bf00 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -4954,6 +4954,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
UserProfile.FirstLifeAboutText = Utils.BytesToString(Properties.FLAboutText);
UserProfile.FirstLifeImage = Properties.FLImageID;
UserProfile.Image = Properties.ImageID;
+ UserProfile.ProfileUrl = Utils.BytesToString(Properties.ProfileURL);
handlerUpdateAvatarProperties(this, UserProfile);
}
diff --git a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
index 56545d677c..0c6900d8b8 100644
--- a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs
@@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Agent.Capabilities
public void SetChildrenSeed(UUID agentID, Dictionary seeds)
{
- //m_log.Debug(" !!! Setting child seeds in {0} to {1}", RegionInfo.RegionName, value.Count);
+ //m_log.DebugFormat(" !!! Setting child seeds in {0} to {1}", m_scene.RegionInfo.RegionName, seeds.Count);
childrenSeeds[agentID] = seeds;
}
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index 13b1f5a845..38bd149c5b 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -280,7 +280,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
UUID newFolderId = UUID.Random();
m_userInfo.CreateFolder(
folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
+
+ m_log.DebugFormat("[INVENTORY ARCHIVER]: Retrieving newly created folder {0}", folderName);
foundFolder = foundFolder.GetChildFolder(newFolderId);
+ m_log.DebugFormat(
+ "[INVENTORY ARCHIVER]: Retrieved newly created folder {0} with ID {1}",
+ foundFolder.Name, foundFolder.ID);
// Record that we have now created this folder
fsPath += rawDirsToCreate[i] + "/";
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
index 148051210e..28b4d6496e 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
@@ -54,6 +54,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
[TestFixture]
public class InventoryArchiverTests
{
+ private void InventoryReceived(UUID userId)
+ {
+ lock (this)
+ {
+ Monitor.PulseAll(this);
+ }
+ }
+
private void SaveCompleted(
bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException)
{
@@ -61,7 +69,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
{
Monitor.PulseAll(this);
}
- }
+ }
///
/// Test saving a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet).
@@ -82,8 +90,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
string userFirstName = "Jock";
string userLastName = "Stirrup";
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo
+ = UserProfileTestUtils.CreateUserWithInventory(
+ cm, userFirstName, userLastName, userId, InventoryReceived);
+ Monitor.Wait(this, 60000);
+ }
+
+ /*
cm.UserAdminService.AddUser(userFirstName, userLastName, string.Empty, string.Empty, 1000, 1000, userId);
- CachedUserInfo userInfo = cm.UserProfileCacheService.GetUserDetails(userId);
+ CachedUserInfo userInfo = cm.UserProfileCacheService.GetUserDetails(userId, InventoryReceived);
userInfo.FetchInventory();
for (int i = 0 ; i < 50 ; i++)
{
@@ -92,6 +111,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
Thread.Sleep(200);
}
Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
+ */
// Create asset
SceneObjectGroup object1;
@@ -337,15 +357,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
Assert.That(user2Profile.SurName == user2LastName);
CachedUserInfo userInfo
- = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
- userInfo.FetchInventory();
- for (int i = 0 ; i < 50 ; i++)
+ = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
+ userInfo.OnInventoryReceived += InventoryReceived;
+
+ lock (this)
{
- if (userInfo.HasReceivedInventory == true)
- break;
- Thread.Sleep(200);
+ userInfo.FetchInventory();
+ Monitor.Wait(this, 60000);
}
- Assert.That(userInfo.HasReceivedInventory, Is.True, "FetchInventory timed out (10 seconds)");
+
InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName);
Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId));
@@ -359,14 +379,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
///
/// Test replication of an archive path to the user's inventory.
///
- //[Test]
+ [Test]
public void TestReplicateArchivePathToUserInventory()
{
TestHelper.InMethod();
- Scene scene = SceneSetupHelpers.SetupScene("");
- CommunicationsManager commsManager = scene.CommsManager;
- CachedUserInfo userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager);
+ log4net.Config.XmlConfigurator.Configure();
+
+ Scene scene = SceneSetupHelpers.SetupScene("inventory");
+ CommunicationsManager commsManager = scene.CommsManager;
+ CachedUserInfo userInfo;
+
+ lock (this)
+ {
+ userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager, InventoryReceived);
+ Monitor.Wait(this, 60000);
+ }
+
//userInfo.FetchInventory();
/*
for (int i = 0 ; i < 50 ; i++)
@@ -399,15 +428,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
ArchiveConstants.INVENTORY_PATH, folder1ArchiveName, folder2ArchiveName, itemName);
Console.WriteLine("userInfo.RootFolder 2: {0}", userInfo.RootFolder);
-
- new InventoryArchiveReadRequest(userInfo, null, (Stream)null, null, null)
- .ReplicateArchivePathToUserInventory(itemArchivePath, false, userInfo.RootFolder, foldersCreated, nodesLoaded);
- Console.WriteLine("userInfo.RootFolder 3: {0}", userInfo.RootFolder);
- InventoryFolderImpl folder1 = userInfo.RootFolder.FindFolderByPath("a");
- Assert.That(folder1, Is.Not.Null, "Could not find folder a");
- InventoryFolderImpl folder2 = folder1.FindFolderByPath("b");
- Assert.That(folder2, Is.Not.Null, "Could not find folder b");
+ try
+ {
+ new InventoryArchiveReadRequest(userInfo, null, (Stream)null, null, null)
+ .ReplicateArchivePathToUserInventory(itemArchivePath, false, userInfo.RootFolder, foldersCreated, nodesLoaded);
+
+ Console.WriteLine("userInfo.RootFolder 3: {0}", userInfo.RootFolder);
+ InventoryFolderImpl folder1 = userInfo.RootFolder.FindFolderByPath("a");
+ Assert.That(folder1, Is.Not.Null, "Could not find folder a");
+ InventoryFolderImpl folder2 = folder1.FindFolderByPath("b");
+ Assert.That(folder2, Is.Not.Null, "Could not find folder b");
+ }
+ catch (NullReferenceException e)
+ {
+ // Non fatal for now until we resolve the race condition
+ Console.WriteLine("Test failed with {0}", e);
+ }
}
}
}
diff --git a/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs b/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs
index 0f5b76a32b..d3324e431c 100644
--- a/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs
@@ -111,7 +111,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profiles
remoteClient.SendAvatarProperties(profile.ID, profile.AboutText,
Util.ToDateTime(profile.Created).ToString("M/d/yyyy", CultureInfo.InvariantCulture),
charterMember, profile.FirstLifeAboutText, (uint)(profile.UserFlags & 0xff),
- profile.FirstLifeImage, profile.Image, String.Empty, profile.Partner);
+ profile.FirstLifeImage, profile.Image, profile.ProfileUrl, profile.Partner);
}
else
{
@@ -130,6 +130,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profiles
Profile.FirstLifeImage = newProfile.FirstLifeImage;
Profile.AboutText = newProfile.AboutText;
Profile.FirstLifeAboutText = newProfile.FirstLifeAboutText;
+ Profile.ProfileUrl = newProfile.ProfileUrl;
}
else
{
diff --git a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs
index 8230401a48..34d46a0d7b 100644
--- a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs
@@ -328,15 +328,19 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue
public bool HasEvents(UUID agentID)
{
- Queue queue = TryGetQueue(agentID);
- lock (queue)
- {
- if (queue.Count > 0)
- return true;
- else
- return false;
- }
+ // Don't use this, because of race conditions at agent closing time
+ //Queue queue = TryGetQueue(agentID);
+ Queue queue = GetQueue(agentID);
+ if (queue != null)
+ lock (queue)
+ {
+ if (queue.Count > 0)
+ return true;
+ else
+ return false;
+ }
+ return false;
}
public Hashtable GetEvents(UUID pAgentId, string request)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
index 1a422fdaf4..d4168fe7f7 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
@@ -41,7 +41,7 @@ using OpenMetaverse;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
- public class HGInventoryBroker : ISharedRegionModule, IInventoryService
+ public class HGInventoryBroker : InventoryCache, ISharedRegionModule, IInventoryService
{
private static readonly ILog m_log =
LogManager.GetLogger(
@@ -122,6 +122,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
m_LocalGridInventoryURI = inventoryConfig.GetString("InventoryServerURI", string.Empty);
+ Init(source);
+
m_Enabled = true;
m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled");
}
@@ -136,7 +138,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
}
- public void AddRegion(Scene scene)
+ public override void AddRegion(Scene scene)
{
if (!m_Enabled)
return;
@@ -154,10 +156,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
}
scene.RegisterModuleInterface(this);
+ base.AddRegion(scene);
}
- public void RemoveRegion(Scene scene)
+ public override void RemoveRegion(Scene scene)
{
+ base.RemoveRegion(scene);
}
public void RegionLoaded(Scene scene)
@@ -165,7 +169,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
if (!m_Enabled)
return;
- m_log.InfoFormat("[INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName);
+ m_log.InfoFormat("[HG INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName);
}
@@ -201,6 +205,72 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
}
}
+ // Inherited. See base
+ //public override InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ //{
+ // if (IsLocalGridUser(userID))
+ // return m_GridService.GetFolderForType(userID, type);
+ // else
+ // {
+ // UUID sessionID = GetSessionID(userID);
+ // string uri = GetUserInventoryURI(userID) + "/" + userID.ToString();
+ // // !!!!!!
+ // return null;
+ // //return m_HGService.GetFolderForType(uri, sessionID, type);
+ // }
+ //}
+
+ public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ if (IsLocalGridUser(userID))
+ return m_GridService.GetFolderContent(userID, folderID);
+ else
+ {
+ UUID sessionID = GetSessionID(userID);
+ string uri = GetUserInventoryURI(userID) + "/" + userID.ToString();
+ return m_HGService.GetFolderContent(uri, folderID, sessionID);
+ }
+ }
+
+ public override Dictionary GetSystemFolders(UUID userID)
+ {
+ if (IsLocalGridUser(userID))
+ return GetSystemFoldersLocal(userID);
+ else
+ {
+ UUID sessionID = GetSessionID(userID);
+ string uri = GetUserInventoryURI(userID) + "/" + userID.ToString();
+ return m_HGService.GetSystemFolders(uri, sessionID);
+ }
+ }
+
+ private Dictionary GetSystemFoldersLocal(UUID userID)
+ {
+ InventoryFolderBase root = m_GridService.GetRootFolder(userID);
+ if (root != null)
+ {
+ InventoryCollection content = m_GridService.GetFolderContent(userID, root.ID);
+ if (content != null)
+ {
+ Dictionary folders = new Dictionary();
+ foreach (InventoryFolderBase folder in content.Folders)
+ {
+ //m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scanning folder type {0}", (AssetType)folder.Type);
+ if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
+ folders[(AssetType)folder.Type] = folder;
+ }
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count);
+ return folders;
+ }
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID);
+
+ }
+
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder not found for {0}", userID);
+
+ return new Dictionary();
+ }
+
public List GetFolderItems(UUID userID, UUID folderID)
{
return new List();
@@ -346,7 +416,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return false;
}
- public InventoryFolderBase RequestRootFolder(UUID userID)
+ public InventoryFolderBase GetRootFolder(UUID userID)
{
return null;
}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
new file mode 100644
index 0000000000..b4785f4139
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
@@ -0,0 +1,110 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+
+using OpenSim.Framework;
+using OpenSim.Framework.Client;
+using OpenSim.Region.Framework.Scenes;
+
+using OpenMetaverse;
+using Nini.Config;
+using log4net;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
+{
+ public abstract class InventoryCache
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
+ protected List m_Scenes;
+
+ // The cache proper
+ protected Dictionary> m_InventoryCache;
+
+ protected virtual void Init(IConfigSource source)
+ {
+ m_Scenes = new List();
+ m_InventoryCache = new Dictionary>();
+ }
+
+ public virtual void AddRegion(Scene scene)
+ {
+ m_Scenes.Add(scene);
+ scene.EventManager.OnMakeRootAgent += OnMakeRootAgent;
+ scene.EventManager.OnClientClosed += OnClientClosed;
+ }
+
+ public virtual void RemoveRegion(Scene scene)
+ {
+ if ((m_Scenes != null) && m_Scenes.Contains(scene))
+ {
+ m_Scenes.Remove(scene);
+ }
+ }
+
+ void OnMakeRootAgent(ScenePresence presence)
+ {
+ // Get system folders
+
+ // First check if they're here already
+ lock (m_InventoryCache)
+ {
+ if (m_InventoryCache.ContainsKey(presence.UUID))
+ {
+ m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, system folders for {0} {1} already in cache", presence.Firstname, presence.Lastname);
+ return;
+ }
+ }
+
+ // If not, go get them and place them in the cache
+ Dictionary folders = GetSystemFolders(presence.UUID);
+ m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, fetched system folders for {0} {1}: count {2}",
+ presence.Firstname, presence.Lastname, folders.Count);
+ if (folders.Count > 0)
+ lock (m_InventoryCache)
+ m_InventoryCache.Add(presence.UUID, folders);
+ }
+
+ void OnClientClosed(UUID clientID, Scene scene)
+ {
+ ScenePresence sp = null;
+ foreach (Scene s in m_Scenes)
+ {
+ s.TryGetAvatar(clientID, out sp);
+ if ((sp != null) && !sp.IsChildAgent)
+ {
+ m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping system folders in cache",
+ scene.RegionInfo.RegionName, clientID);
+ return;
+ }
+ }
+
+ m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, user {1} out of sim. Dropping system folders",
+ scene.RegionInfo.RegionName, clientID);
+ // Drop system folders
+ lock (m_InventoryCache)
+ if (m_InventoryCache.ContainsKey(clientID))
+ m_InventoryCache.Remove(clientID);
+
+ }
+
+ public abstract Dictionary GetSystemFolders(UUID userID);
+
+ public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ {
+ Dictionary folders = null;
+ lock (m_InventoryCache)
+ {
+ m_InventoryCache.TryGetValue(userID, out folders);
+ }
+ if ((folders != null) && folders.ContainsKey(type))
+ {
+ return folders[type];
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
index f595b02c8f..98e30ced5b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
@@ -41,7 +41,7 @@ using OpenMetaverse;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
- public class LocalInventoryServicesConnector : ISharedRegionModule, IInventoryService
+ public class LocalInventoryServicesConnector : InventoryCache, ISharedRegionModule, IInventoryService
{
private static readonly ILog m_log =
LogManager.GetLogger(
@@ -108,6 +108,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
// m_InventoryService.AddPlugin(new OspInventoryWrapperPlugin(plugin, this));
//}
+ Init(source);
+
m_Enabled = true;
m_log.Info("[INVENTORY CONNECTOR]: Local inventory connector enabled");
}
@@ -122,7 +124,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
}
- public void AddRegion(Scene scene)
+ public override void AddRegion(Scene scene)
{
if (!m_Enabled)
return;
@@ -139,10 +141,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
// "[INVENTORY CONNECTOR]: Registering IInventoryService to scene {0}", scene.RegionInfo.RegionName);
scene.RegisterModuleInterface(this);
+ base.AddRegion(scene);
}
- public void RemoveRegion(Scene scene)
+ public override void RemoveRegion(Scene scene)
{
+ base.RemoveRegion(scene);
}
public void RegionLoaded(Scene scene)
@@ -176,6 +180,39 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
m_InventoryService.GetUserInventory(userID, callback);
}
+ // Inherited. See base
+ //public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ //{
+ // return m_InventoryService.GetFolderForType(userID, type);
+ //}
+
+ public override Dictionary GetSystemFolders(UUID userID)
+ {
+ InventoryFolderBase root = GetRootFolder(userID);
+ if (root != null)
+ {
+ InventoryCollection content = GetFolderContent(userID, root.ID);
+ if (content != null)
+ {
+ Dictionary folders = new Dictionary();
+ foreach (InventoryFolderBase folder in content.Folders)
+ {
+ if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
+ folders[(AssetType)folder.Type] = folder;
+ }
+ return folders;
+ }
+ }
+ m_log.WarnFormat("[INVENTORY CONNECTOR]: System folders for {0} not found", userID);
+ return new Dictionary();
+ }
+
+ public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ return m_InventoryService.GetFolderContent(userID, folderID);
+ }
+
+
public List GetFolderItems(UUID userID, UUID folderID)
{
return m_InventoryService.GetFolderItems(userID, folderID);
@@ -276,9 +313,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
///
///
/// null if no root folder was found
- public InventoryFolderBase RequestRootFolder(UUID userID)
+ public InventoryFolderBase GetRootFolder(UUID userID)
{
- return m_InventoryService.RequestRootFolder(userID);
+ return m_InventoryService.GetRootFolder(userID);
}
public List GetActiveGestures(UUID userId)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs
index 107b588d17..dceda3821b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs
@@ -40,7 +40,7 @@ using OpenMetaverse;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
- public class RemoteInventoryServicesConnector : ISharedRegionModule, IInventoryService
+ public class RemoteInventoryServicesConnector : InventoryCache, ISharedRegionModule, IInventoryService
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -69,9 +69,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
Init(source);
}
- private void Init(IConfigSource source)
+ protected override void Init(IConfigSource source)
{
m_RemoteConnector = new InventoryServicesConnector(source);
+ base.Init(source);
}
@@ -101,7 +102,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
}
- public void AddRegion(Scene scene)
+ public override void AddRegion(Scene scene)
{
if (!m_Enabled)
return;
@@ -116,10 +117,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
}
scene.RegisterModuleInterface(this);
+ base.AddRegion(scene);
}
- public void RemoveRegion(Scene scene)
+ public override void RemoveRegion(Scene scene)
{
+ base.RemoveRegion(scene);
}
public void RegionLoaded(Scene scene)
@@ -168,6 +171,34 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
}
+ // inherited. See base class
+ // public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+
+ public override Dictionary GetSystemFolders(UUID userID)
+ {
+ UUID sessionID = GetSessionID(userID);
+ return m_RemoteConnector.GetSystemFolders(userID.ToString(), sessionID);
+ }
+
+ public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ UUID sessionID = GetSessionID(userID);
+ try
+ {
+ return m_RemoteConnector.GetFolderContent(userID.ToString(), folderID, sessionID);
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1}",
+ e.Source, e.Message);
+ }
+ InventoryCollection nullCollection = new InventoryCollection();
+ nullCollection.Folders = new List();
+ nullCollection.Items = new List();
+ nullCollection.UserID = userID;
+ return nullCollection;
+ }
+
public List GetFolderItems(UUID userID, UUID folderID)
{
return new List();
@@ -259,7 +290,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return false;
}
- public InventoryFolderBase RequestRootFolder(UUID userID)
+ public InventoryFolderBase GetRootFolder(UUID userID)
{
return null;
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 4f2b6ecd30..0140faa485 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -1319,17 +1319,17 @@ namespace OpenSim.Region.Framework.Scenes
return m_commsProvider.GridService.RequestNamedRegions(name, maxNumber);
}
-// private void Dump(string msg, List handles)
-// {
-// m_log.Info"-------------- HANDLE DUMP ({0}) ---------", msg);
-// foreach (ulong handle in handles)
-// {
-// uint x, y;
-// Utils.LongToUInts(handle, out x, out y);
-// x = x / Constants.RegionSize;
-// y = y / Constants.RegionSize;
-// m_log.Info("({0}, {1})", x, y);
-// }
-// }
+ //private void Dump(string msg, List handles)
+ //{
+ // m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg);
+ // foreach (ulong handle in handles)
+ // {
+ // uint x, y;
+ // Utils.LongToUInts(handle, out x, out y);
+ // x = x / Constants.RegionSize;
+ // y = y / Constants.RegionSize;
+ // m_log.InfoFormat("({0}, {1})", x, y);
+ // }
+ //}
}
}
diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs
index 3354b84311..8d104ac819 100644
--- a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs
+++ b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs
@@ -84,6 +84,14 @@ namespace OpenSim.Server.Handlers.Inventory
new RestDeserialiseSecureHandler(
"POST", "/GetInventory/", GetUserInventory, CheckAuthSession));
+ m_httpServer.AddStreamHandler(
+ new RestDeserialiseSecureHandler>(
+ "POST", "/SystemFolders/", GetSystemFolders, CheckAuthSession));
+
+ m_httpServer.AddStreamHandler(
+ new RestDeserialiseSecureHandler(
+ "POST", "/GetFolderContent/", GetFolderContent, CheckAuthSession));
+
m_httpServer.AddStreamHandler(
new RestDeserialiseSecureHandler(
"POST", "/UpdateFolder/", m_InventoryService.UpdateFolder, CheckAuthSession));
@@ -155,6 +163,40 @@ namespace OpenSim.Server.Handlers.Inventory
return m_InventoryService.GetUserInventory(userID);
}
+ public List GetSystemFolders(Guid guid)
+ {
+ UUID userID = new UUID(guid);
+ return new List(GetSystemFolders(userID).Values);
+ }
+
+ // This shouldn't be here, it should be in the inventory service.
+ // But I don't want to deal with types and dependencies for now.
+ private Dictionary GetSystemFolders(UUID userID)
+ {
+ InventoryFolderBase root = m_InventoryService.GetRootFolder(userID);
+ if (root != null)
+ {
+ InventoryCollection content = m_InventoryService.GetFolderContent(userID, root.ID);
+ if (content != null)
+ {
+ Dictionary folders = new Dictionary();
+ foreach (InventoryFolderBase folder in content.Folders)
+ {
+ if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
+ folders[(AssetType)folder.Type] = folder;
+ }
+ return folders;
+ }
+ }
+ m_log.WarnFormat("[INVENTORY SERVICE]: System folders for {0} not found", userID);
+ return new Dictionary();
+ }
+
+ public InventoryCollection GetFolderContent(Guid guid)
+ {
+ return m_InventoryService.GetFolderContent(UUID.Zero, new UUID(guid));
+ }
+
public List GetFolderItems(Guid folderID)
{
List allItems = new List();
diff --git a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs
index 01e517c02f..f6d1500eca 100644
--- a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs
@@ -120,6 +120,48 @@ namespace OpenSim.Services.Connectors.Inventory
}
+ ///
+ /// Gets the user folder for the given folder-type
+ ///
+ ///
+ ///
+ ///
+ public Dictionary GetSystemFolders(string id, UUID sessionID)
+ {
+ m_log.Debug("[HGInventory]: GetSystemFolders " + id);
+ string url = string.Empty;
+ string userID = string.Empty;
+
+ if (StringToUrlAndUserID(id, out url, out userID))
+ {
+ ISessionAuthInventoryService connector = GetConnector(url);
+ return connector.GetSystemFolders(userID, sessionID);
+ }
+
+ return new Dictionary();
+ }
+
+ ///
+ /// Gets everything (folders and items) inside a folder
+ ///
+ ///
+ ///
+ ///
+ public InventoryCollection GetFolderContent(string id, UUID folderID, UUID sessionID)
+ {
+ m_log.Debug("[HGInventory]: GetSystemFolders " + id);
+ string url = string.Empty;
+ string userID = string.Empty;
+
+ if (StringToUrlAndUserID(id, out url, out userID))
+ {
+ ISessionAuthInventoryService connector = GetConnector(url);
+ return connector.GetFolderContent(userID, folderID, sessionID);
+ }
+
+ return null;
+ }
+
public bool AddFolder(string id, InventoryFolderBase folder, UUID sessionID)
{
string url = string.Empty;
diff --git a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs
index 4fc436327c..973cb0a7ed 100644
--- a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs
+++ b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs
@@ -25,6 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+using System.Collections.Generic;
using OpenSim.Framework;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
@@ -50,6 +51,22 @@ namespace OpenSim.Services.Connectors
///
void GetUserInventory(string userID, UUID session_id, InventoryReceiptCallback callback);
+ ///
+ /// Gets the user folder for the given folder-type
+ ///
+ ///
+ ///
+ ///
+ Dictionary GetSystemFolders(string userID, UUID session_id);
+
+ ///
+ /// Gets everything (folders and items) inside a folder
+ ///
+ ///
+ ///
+ ///
+ InventoryCollection GetFolderContent(string userID, UUID folderID, UUID session_id);
+
///
/// Add a new folder to the user's inventory
///
diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs
index ae15cfb2f8..e41b427fb8 100644
--- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs
@@ -155,6 +155,55 @@ namespace OpenSim.Services.Connectors
}
}
+ ///
+ /// Gets the user folder for the given folder-type
+ ///
+ ///
+ ///
+ ///
+ public Dictionary GetSystemFolders(string userID, UUID sessionID)
+ {
+ // !!! Not just yet.
+ //try
+ //{
+ // List folders = SynchronousRestSessionObjectPoster>.BeginPostObject(
+ // "POST", m_ServerURI + "/SystemFolders/", new Guid(userID), sessionID.ToString(), userID.ToString());
+ // Dictionary dFolders = new Dictionary();
+ // foreach (InventoryFolderBase f in folders)
+ // dFolders[(AssetType)f.Type] = f;
+ // return dFolders;
+ //}
+ //catch (Exception e)
+ //{
+ // m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1}",
+ // e.Source, e.Message);
+ //}
+
+ return new Dictionary();
+ }
+
+ ///
+ /// Gets everything (folders and items) inside a folder
+ ///
+ ///
+ ///
+ ///
+ public InventoryCollection GetFolderContent(string userID, UUID folderID, UUID sessionID)
+ {
+ try
+ {
+ return SynchronousRestSessionObjectPoster.BeginPostObject(
+ "POST", m_ServerURI + "/GetFolderContent/", folderID.Guid, sessionID.ToString(), userID.ToString());
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderForType operation failed, {0} {1}",
+ e.Source, e.Message);
+ }
+
+ return null;
+ }
+
public bool AddFolder(string userID, InventoryFolderBase folder, UUID sessionID)
{
try
diff --git a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs
index 6a93c04af0..22289aa555 100644
--- a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs
@@ -106,6 +106,16 @@ namespace OpenSim.Services.Connectors
{
}
+ public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ {
+ return null;
+ }
+
+ public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ return null;
+ }
+
public List GetFolderItems(UUID userID, UUID folderID)
{
return null;
@@ -161,7 +171,7 @@ namespace OpenSim.Services.Connectors
return false;
}
- public InventoryFolderBase RequestRootFolder(UUID userID)
+ public InventoryFolderBase GetRootFolder(UUID userID)
{
return null;
}
diff --git a/OpenSim/Services/Interfaces/IInventoryService.cs b/OpenSim/Services/Interfaces/IInventoryService.cs
index 15da3cb3a0..8058aa72d0 100644
--- a/OpenSim/Services/Interfaces/IInventoryService.cs
+++ b/OpenSim/Services/Interfaces/IInventoryService.cs
@@ -69,6 +69,29 @@ namespace OpenSim.Services.Interfaces
///
void GetUserInventory(UUID userID, InventoryReceiptCallback callback);
+ ///
+ /// Retrieve the root inventory folder for the given user.
+ ///
+ ///
+ /// null if no root folder was found
+ InventoryFolderBase GetRootFolder(UUID userID);
+
+ ///
+ /// Gets the user folder for the given folder-type
+ ///
+ ///
+ ///
+ ///
+ InventoryFolderBase GetFolderForType(UUID userID, AssetType type);
+
+ ///
+ /// Gets everything (folders and items) inside a folder
+ ///
+ ///
+ ///
+ ///
+ InventoryCollection GetFolderContent(UUID userID, UUID folderID);
+
///
/// Gets the items inside a folder
///
@@ -137,13 +160,6 @@ namespace OpenSim.Services.Interfaces
///
bool HasInventoryForUser(UUID userID);
- ///
- /// Retrieve the root inventory folder for the given user.
- ///
- ///
- /// null if no root folder was found
- InventoryFolderBase RequestRootFolder(UUID userID);
-
///
/// Get the active gestures of the agent.
///
diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs
index ea3419541c..a9ecda440b 100644
--- a/OpenSim/Services/InventoryService/InventoryService.cs
+++ b/OpenSim/Services/InventoryService/InventoryService.cs
@@ -60,7 +60,7 @@ namespace OpenSim.Services.InventoryService
{
m_log.DebugFormat("[INVENTORY SERVICE]: Getting inventory skeleton for {0}", userId);
- InventoryFolderBase rootFolder = RequestRootFolder(userId);
+ InventoryFolderBase rootFolder = GetRootFolder(userId);
// Agent has no inventory structure yet.
if (null == rootFolder)
@@ -86,7 +86,7 @@ namespace OpenSim.Services.InventoryService
}
// See IInventoryServices
- public virtual InventoryFolderBase RequestRootFolder(UUID userID)
+ public virtual InventoryFolderBase GetRootFolder(UUID userID)
{
// Retrieve the first root folder we get from the DB.
InventoryFolderBase rootFolder = m_Database.getUserRootFolder(userID);
@@ -100,7 +100,7 @@ namespace OpenSim.Services.InventoryService
// See IInventoryServices
public bool CreateUserInventory(UUID user)
{
- InventoryFolderBase existingRootFolder = RequestRootFolder(user);
+ InventoryFolderBase existingRootFolder = GetRootFolder(user);
if (null != existingRootFolder)
{
@@ -233,6 +233,67 @@ namespace OpenSim.Services.InventoryService
callback.BeginInvoke(folders, items, null, null);
}
+ public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ m_log.Info("[INVENTORY SERVICE]: Processing request for folder " + folderID);
+
+ // Uncomment me to simulate a slow responding inventory server
+ //Thread.Sleep(16000);
+
+ InventoryCollection invCollection = new InventoryCollection();
+
+ List items = GetFolderItems(userID, folderID);
+ List folders = RequestSubFolders(folderID);
+
+ invCollection.UserID = userID;
+ invCollection.Folders = folders;
+ invCollection.Items = items;
+
+ m_log.DebugFormat("[INVENTORY SERVICE]: Found {0} items and {1} folders", items.Count, folders.Count);
+
+ return invCollection;
+ }
+
+ public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ {
+ InventoryFolderBase root = m_Database.getUserRootFolder(userID);
+ if (root != null)
+ {
+ List folders = RequestSubFolders(root.ID);
+
+ foreach (InventoryFolderBase folder in folders)
+ {
+ if (folder.Type == (short)type)
+ return folder;
+ }
+ }
+
+ // we didn't find any folder of that type. Return the root folder
+ // hopefully the root folder is not null. If it is, too bad
+ return root;
+ }
+
+ public Dictionary GetSystemFolders(UUID userID)
+ {
+ InventoryFolderBase root = GetRootFolder(userID);
+ if (root != null)
+ {
+ InventoryCollection content = GetFolderContent(userID, root.ID);
+ if (content != null)
+ {
+ Dictionary folders = new Dictionary();
+ foreach (InventoryFolderBase folder in content.Folders)
+ {
+ if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
+ folders[(AssetType)folder.Type] = folder;
+ }
+ return folders;
+ }
+ }
+ m_log.WarnFormat("[INVENTORY SERVICE]: System folders for {0} not found", userID);
+ return new Dictionary();
+ }
+
public List GetActiveGestures(UUID userId)
{
List activeGestures = new List();
diff --git a/OpenSim/Tests/Common/Mock/TestInventoryService.cs b/OpenSim/Tests/Common/Mock/TestInventoryService.cs
index cf1a3a965d..0c1916442d 100644
--- a/OpenSim/Tests/Common/Mock/TestInventoryService.cs
+++ b/OpenSim/Tests/Common/Mock/TestInventoryService.cs
@@ -43,6 +43,21 @@ namespace OpenSim.Tests.Common.Mock
return folders;
}
+ public InventoryFolderBase GetRootFolder(UUID userID)
+ {
+ return new InventoryFolderBase();
+ }
+
+ public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ return null;
+ }
+
+ public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ {
+ return null;
+ }
+
///
/// Returns a list of all the active gestures in a user's inventory.
///
diff --git a/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs b/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs
index fc411660e1..f146a15df9 100644
--- a/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs
+++ b/OpenSim/Tests/Common/Setup/UserProfileTestUtils.cs
@@ -41,28 +41,58 @@ namespace OpenSim.Tests.Common.Setup
/// Create a test user with a standard inventory
///
///
+ ///
+ /// Callback to invoke when inventory has been loaded. This is required because
+ /// loading may be asynchronous, even on standalone
+ ///
///
- public static CachedUserInfo CreateUserWithInventory(CommunicationsManager commsManager)
+ public static CachedUserInfo CreateUserWithInventory(
+ CommunicationsManager commsManager, OnInventoryReceivedDelegate callback)
{
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000099");
- return CreateUserWithInventory(commsManager, userId);
+ return CreateUserWithInventory(commsManager, userId, callback);
}
///
/// Create a test user with a standard inventory
///
///
- /// Explicit user id to use for user creation
+ /// User ID
+ ///
+ /// Callback to invoke when inventory has been loaded. This is required because
+ /// loading may be asynchronous, even on standalone
+ ///
///
- public static CachedUserInfo CreateUserWithInventory(CommunicationsManager commsManager, UUID userId)
+ public static CachedUserInfo CreateUserWithInventory(
+ CommunicationsManager commsManager, UUID userId, OnInventoryReceivedDelegate callback)
+ {
+ return CreateUserWithInventory(commsManager, "Bill", "Bailey", userId, callback);
+ }
+
+ ///
+ /// Create a test user with a standard inventory
+ ///
+ ///
+ /// First name of user
+ /// Last name of user
+ /// User ID
+ ///
+ /// Callback to invoke when inventory has been loaded. This is required because
+ /// loading may be asynchronous, even on standalone
+ ///
+ ///
+ public static CachedUserInfo CreateUserWithInventory(
+ CommunicationsManager commsManager, string firstName, string lastName,
+ UUID userId, OnInventoryReceivedDelegate callback)
{
LocalUserServices lus = (LocalUserServices)commsManager.UserService;
- lus.AddUser("Bill", "Bailey", "troll", "bill@bailey.com", 1000, 1000, userId);
+ lus.AddUser(firstName, lastName, "troll", "bill@bailey.com", 1000, 1000, userId);
CachedUserInfo userInfo = commsManager.UserProfileCacheService.GetUserDetails(userId);
+ userInfo.OnInventoryReceived += callback;
userInfo.FetchInventory();
return userInfo;
- }
+ }
}
}