Add persistence of active gestures. This needs an UGAIM update to work.

Active gestures are sent as part of the login-response. Added
fetchActiveGestures to SQLite and MySQL; added an empty one for MSSQL and
NHibernate. Using the empty ones won't cause errors, but doesn't provide
persistence either, of course.
0.6.0-stable
Homer Horwitz 2008-09-24 21:12:21 +00:00
parent cffb975dd9
commit fe9aea258f
13 changed files with 198 additions and 4 deletions

View File

@ -798,6 +798,11 @@ namespace OpenSim.Data.MSSQL
m_log.Error("[INVENTORY DB] Error deleting folder :" + e.Message);
}
}
public List<InventoryItemBase> fetchActiveGestures (UUID avatarID)
{
return null;
}
#endregion
}
}

View File

@ -795,5 +795,41 @@ namespace OpenSim.Data.MySQL
deleteOneFolder(folderID);
deleteItemsInFolder(folderID);
}
public List<InventoryItemBase> fetchActiveGestures(UUID avatarID)
{
MySqlDataReader result = null;
MySqlCommand sqlCmd = null;
lock (database)
{
try
{
database.CheckConnection();
sqlCmd = new MySqlCommand(
"SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1",
database.Connection);
sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString());
sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture);
result = sqlCmd.ExecuteReader();
List<InventoryItemBase> list = new List<InventoryItemBase>();
while (result.Read())
list.Add(readInventoryItem(result));
return list;
}
catch (Exception e)
{
database.Reconnect();
m_log.Error(e.ToString());
return null;
}
finally
{
if(result != null) result.Close();
if(sqlCmd != null) sqlCmd.Dispose();
}
}
}
}
}

View File

@ -389,5 +389,10 @@ namespace OpenSim.Data.NHibernate
return folders;
}
public List<InventoryItemBase> fetchActiveGestures (UUID avatarID)
{
return null;
}
}
}

View File

@ -847,5 +847,24 @@ namespace OpenSim.Data.SQLite
row["UUID"] = Util.ToRawUuidString(folder.ID);
row["parentID"] = Util.ToRawUuidString(folder.ParentID);
}
public List<InventoryItemBase> fetchActiveGestures (UUID avatarID)
{
lock (ds)
{
List<InventoryItemBase> items = new List<InventoryItemBase>();
DataTable inventoryItemTable = ds.Tables["inventoryitems"];
string selectExp = "avatarID = '" + Util.ToRawUuidString(avatarID) + "' AND assetType = " +
(int)AssetType.Gesture + " AND flags = 1";
m_log.DebugFormat("[SQL]: sql = " + selectExp);
DataRow[] rows = inventoryItemTable.Select(selectExp);
foreach (DataRow row in rows)
{
items.Add(buildItem(row));
}
return items;
}
}
}
}

View File

@ -49,5 +49,16 @@ namespace OpenSim.Framework.Communications
/// <returns>A flat list of the user's inventory folder tree,
/// null if there is no inventory for this user</returns>
List<InventoryFolderBase> GetInventorySkeleton(UUID userId);
/// <summary>
/// Returns a list of all the active gestures in a user's inventory.
/// </summary>
/// <param name="userId">
/// The <see cref="UUID"/> of the user
/// </param>
/// <returns>
/// A flat list of the gesture items.
/// </returns>
List<InventoryItemBase> GetActiveGestures(UUID userId);
}
}

View File

@ -148,6 +148,15 @@ namespace OpenSim.Framework.Communications
// See IInventoryServices
public abstract void RequestInventoryForUser(UUID userID, InventoryReceiptCallback callback);
public List<InventoryItemBase> GetActiveGestures(UUID userId)
{
foreach (IInventoryDataPlugin plugin in m_plugins)
{
return plugin.fetchActiveGestures(userId);
}
return new List<InventoryItemBase>();
}
#endregion
#region Methods used by GridInventoryService

View File

@ -60,6 +60,7 @@ namespace OpenSim.Framework.Communications
private ArrayList inventoryLibraryOwner;
private ArrayList inventoryLibRoot;
private ArrayList inventoryLibrary;
private ArrayList activeGestures;
private UserInfo userProfile;
@ -124,6 +125,7 @@ namespace OpenSim.Framework.Communications
agentInventory = new ArrayList();
inventoryLibrary = new ArrayList();
inventoryLibraryOwner = new ArrayList();
activeGestures = new ArrayList();
xmlRpcResponse = new XmlRpcResponse();
// defaultXmlRpcResponse = new XmlRpcResponse();
@ -355,7 +357,7 @@ namespace OpenSim.Framework.Communications
responseData["inventory-skel-lib"] = inventoryLibrary;
responseData["inventory-root"] = inventoryRoot;
responseData["inventory-lib-root"] = inventoryLibRoot;
responseData["gestures"] = new ArrayList(); // todo
responseData["gestures"] = activeGestures;
responseData["inventory-lib-owner"] = inventoryLibraryOwner;
responseData["initial-outfit"] = initialOutfit;
responseData["start_location"] = startLocation;
@ -452,7 +454,7 @@ namespace OpenSim.Framework.Communications
#endregion Inventory
map["gestures"] = new LLSDArray(); // todo
map["gestures"] = ArrayListToLLSDArray(activeGestures);
map["initial-outfit"] = ArrayListToLLSDArray(initialOutfit);
map["start_location"] = LLSD.FromString(startLocation);
@ -699,6 +701,12 @@ namespace OpenSim.Framework.Communications
set { inventoryLibRoot = value; }
}
public ArrayList ActiveGestures
{
get { return activeGestures; }
set { activeGestures = value; }
}
public string Home
{
get { return home; }

View File

@ -131,6 +131,17 @@ namespace OpenSim.Framework
/// </summary>
/// <param name="folder">The id of the folder</param>
void deleteInventoryFolder(UUID folder);
/// <summary>
/// Returns all activated gesture-items in the inventory of the specified avatar.
/// </summary>
/// <param name="avatarID">
/// The <see cref="UUID"/> of the avatar
/// </param>
/// <returns>
/// The list of gestures (<see cref="InventoryItemBase"/>s)
/// </returns>
List<InventoryItemBase> fetchActiveGestures(UUID avatarID);
}
public class InventoryDataInitialiser : PluginInitialiserBase

View File

@ -67,5 +67,21 @@ namespace OpenSim.Grid.Communications.OGS1
return SynchronousRestObjectPoster.BeginPostObject<Guid, List<InventoryFolderBase>>(
"POST", m_inventoryServerUrl + "RootFolders/", userId.Guid);
}
/// <summary>
/// Returns a list of all the active gestures in a user's inventory.
/// </summary>
/// <param name="userId">
/// The <see cref="UUID"/> of the user
/// </param>
/// <returns>
/// A flat list of the gesture items.
/// </returns>
public List<InventoryItemBase> GetActiveGestures(UUID userId)
{
return SynchronousRestObjectPoster.BeginPostObject<Guid, List<InventoryItemBase>>(
"POST", m_inventoryServerUrl + "ActiveGestures/", userId.Guid);
}
}
}

View File

@ -233,5 +233,14 @@ namespace OpenSim.Grid.InventoryServer
return CreateNewUserInventory(userID);
}
public List<InventoryItemBase> GetActiveGestures(Guid rawUserID)
{
UUID userID = new UUID(rawUserID);
m_log.InfoFormat("[GRID AGENT INVENTORY]: fetching active gestures for user {0}", userID);
return GetActiveGestures(userID);
}
}
}

View File

@ -123,6 +123,11 @@ namespace OpenSim.Grid.InventoryServer
m_httpServer.AddStreamHandler(
new RestDeserialiseTrustedHandler<Guid, List<InventoryFolderBase>>
("POST", "/RootFolders/", m_inventoryService.GetInventorySkeleton, m_inventoryService.CheckTrustSource));
// for persistent active gestures
m_httpServer.AddStreamHandler(
new RestDeserialiseTrustedHandler<Guid, List<InventoryItemBase>>
("POST", "/ActiveGestures/", m_inventoryService.GetActiveGestures, m_inventoryService.CheckTrustSource));
}
private void Work()

View File

@ -131,6 +131,9 @@ namespace OpenSim.Grid.UserServer
/// <param name="startLocationRequest">The requested start location</param>
public override bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest)
{
// add active gestures to login-response
AddActiveGestures(response, theUser);
// HomeLocation
RegionProfileData homeInfo = null;
// use the homeRegionID if it is stored already. If not, use the regionHandle as before
@ -243,10 +246,37 @@ namespace OpenSim.Grid.UserServer
// theUser.HomeLookAt.X, theUser.HomeLookAt.Y, theUser.HomeLookAt.Z);
theUser.CurrentAgent.Position = new Vector3(128,128,0);
response.StartLocation = "safe";
return PrepareLoginToRegion(regionInfo, theUser, response);
}
/// <summary>
/// Add active gestures of the user to the login response.
/// </summary>
/// <param name="response">
/// A <see cref="LoginResponse"/>
/// </param>
/// <param name="theUser">
/// A <see cref="UserProfileData"/>
/// </param>
private void AddActiveGestures(LoginResponse response, UserProfileData theUser)
{
List<InventoryItemBase> gestures = m_inventoryService.GetActiveGestures(theUser.ID);
m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count);
ArrayList list = new ArrayList();
if (gestures != null)
{
foreach (InventoryItemBase gesture in gestures)
{
Hashtable item = new Hashtable();
item["item_id"] = gesture.ID.ToString();
item["asset_id"] = gesture.AssetID.ToString();
list.Add(item);
}
}
response.ActiveGestures = list;
}
/// <summary>
/// Prepare a login to the given region. This involves both telling the region to expect a connection
/// and appropriately customising the response to the user.

View File

@ -142,6 +142,9 @@ namespace OpenSim.Region.Communications.Local
/// <param name="startLocationRequest">The requested start location</param>
public override bool CustomiseResponse(LoginResponse response, UserProfileData theUser, string startLocationRequest)
{
// add active gestures to login-response
AddActiveGestures(response, theUser);
// HomeLocation
RegionInfo homeInfo = null;
@ -254,6 +257,33 @@ namespace OpenSim.Region.Communications.Local
return PrepareLoginToRegion(regionInfo, theUser, response);
}
/// <summary>
/// Add active gestures of the user to the login response.
/// </summary>
/// <param name="response">
/// A <see cref="LoginResponse"/>
/// </param>
/// <param name="theUser">
/// A <see cref="UserProfileData"/>
/// </param>
private void AddActiveGestures(LoginResponse response, UserProfileData theUser)
{
List<InventoryItemBase> gestures = m_interServiceInventoryService.GetActiveGestures(theUser.ID);
m_log.DebugFormat("[LOGIN]: AddActiveGestures, found {0}", gestures == null ? 0 : gestures.Count);
ArrayList list = new ArrayList();
if (gestures != null)
{
foreach (InventoryItemBase gesture in gestures)
{
Hashtable item = new Hashtable();
item["item_id"] = gesture.ID.ToString();
item["asset_id"] = gesture.AssetID.ToString();
list.Add(item);
}
}
response.ActiveGestures = list;
}
/// <summary>
/// Prepare a login to the given region. This involves both telling the region to expect a connection
/// and appropriately customising the response to the user.