Merge branch 'master' of git://opensimulator.org/git/opensim
commit
031bc35c06
|
@ -88,6 +88,7 @@ what it is today.
|
||||||
* Kitto Flora
|
* Kitto Flora
|
||||||
* KittyLiu
|
* KittyLiu
|
||||||
* Kurt Taylor (IBM)
|
* Kurt Taylor (IBM)
|
||||||
|
* lkalif
|
||||||
* lulurun
|
* lulurun
|
||||||
* M.Igarashi
|
* M.Igarashi
|
||||||
* maimedleech
|
* maimedleech
|
||||||
|
|
|
@ -1012,7 +1012,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
throw new Exception(String.Format("Account {0} {1} already exists", firstname, lastname));
|
throw new Exception(String.Format("Account {0} {1} already exists", firstname, lastname));
|
||||||
|
|
||||||
account = new UserAccount(scopeID, firstname, lastname, email);
|
account = new UserAccount(scopeID, firstname, lastname, email);
|
||||||
// REFACTORING PROBLEM: no method to set the password!
|
|
||||||
|
|
||||||
bool success = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.StoreUserAccount(account);
|
bool success = m_app.SceneManager.CurrentOrFirstScene.UserAccountService.StoreUserAccount(account);
|
||||||
|
|
||||||
|
@ -1020,6 +1019,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
throw new Exception(String.Format("failed to create new user {0} {1}",
|
throw new Exception(String.Format("failed to create new user {0} {1}",
|
||||||
firstname, lastname));
|
firstname, lastname));
|
||||||
|
|
||||||
|
// Store the password
|
||||||
|
m_app.SceneManager.CurrentOrFirstScene.AuthenticationService.SetPassword(account.PrincipalID, passwd);
|
||||||
|
|
||||||
GridRegion home = m_app.SceneManager.CurrentOrFirstScene.GridService.GetRegionByPosition(scopeID,
|
GridRegion home = m_app.SceneManager.CurrentOrFirstScene.GridService.GetRegionByPosition(scopeID,
|
||||||
(int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize));
|
(int)(regX * Constants.RegionSize), (int)(regY * Constants.RegionSize));
|
||||||
if (home == null)
|
if (home == null)
|
||||||
|
|
|
@ -642,6 +642,7 @@ namespace OpenSim.Client.MXP.ClientStack
|
||||||
public event Action<UUID> OnRemoveAvatar;
|
public event Action<UUID> OnRemoveAvatar;
|
||||||
public event ObjectPermissions OnObjectPermissions;
|
public event ObjectPermissions OnObjectPermissions;
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem;
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder;
|
public event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
|
|
@ -288,6 +288,7 @@ namespace OpenSim.Client.Sirikata.ClientStack
|
||||||
public event Action<UUID> OnRemoveAvatar;
|
public event Action<UUID> OnRemoveAvatar;
|
||||||
public event ObjectPermissions OnObjectPermissions;
|
public event ObjectPermissions OnObjectPermissions;
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem;
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder;
|
public event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
|
|
@ -291,6 +291,7 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
|
||||||
public event Action<UUID> OnRemoveAvatar = delegate { };
|
public event Action<UUID> OnRemoveAvatar = delegate { };
|
||||||
public event ObjectPermissions OnObjectPermissions = delegate { };
|
public event ObjectPermissions OnObjectPermissions = delegate { };
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem = delegate { };
|
public event CreateNewInventoryItem OnCreateNewInventoryItem = delegate { };
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem = delegate { };
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder = delegate { };
|
public event CreateInventoryFolder OnCreateNewInventoryFolder = delegate { };
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder = delegate { };
|
public event UpdateInventoryFolder OnUpdateInventoryFolder = delegate { };
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder = delegate { };
|
public event MoveInventoryFolder OnMoveInventoryFolder = delegate { };
|
||||||
|
|
|
@ -48,6 +48,7 @@ namespace OpenSim.Data
|
||||||
{
|
{
|
||||||
UserAccountData[] Get(string[] fields, string[] values);
|
UserAccountData[] Get(string[] fields, string[] values);
|
||||||
bool Store(UserAccountData data);
|
bool Store(UserAccountData data);
|
||||||
|
bool Delete(string field, string val);
|
||||||
UserAccountData[] GetUsers(UUID scopeID, string query);
|
UserAccountData[] GetUsers(UUID scopeID, string query);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,193 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
|
||||||
|
namespace OpenSim.Data.Null
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This class is completely null.
|
||||||
|
/// </summary>
|
||||||
|
public class NullInventoryData : IInventoryDataPlugin
|
||||||
|
{
|
||||||
|
public string Version { get { return "1.0.0.0"; } }
|
||||||
|
|
||||||
|
public void Initialise()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get { return "Null Inventory Data Interface"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialise(string connect)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns all descendent folders of this folder. Does not return the parent folder itself.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parentID">The folder to get subfolders for</param>
|
||||||
|
/// <returns>A list of inventory folders</returns>
|
||||||
|
public List<InventoryFolderBase> getFolderHierarchy(UUID parentID)
|
||||||
|
{
|
||||||
|
return new List<InventoryFolderBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a list of inventory items contained within the specified folder
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="folderID">The UUID of the target folder</param>
|
||||||
|
/// <returns>A List of InventoryItemBase items</returns>
|
||||||
|
public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
|
||||||
|
{
|
||||||
|
return new List<InventoryItemBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a list of the root folders within a users inventory
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user">The user whos inventory is to be searched</param>
|
||||||
|
/// <returns>A list of folder objects</returns>
|
||||||
|
public List<InventoryFolderBase> getUserRootFolders(UUID user)
|
||||||
|
{
|
||||||
|
return new List<InventoryFolderBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the users inventory root folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user">The UUID of the user who is having inventory being returned</param>
|
||||||
|
/// <returns>Root inventory folder, null if no root inventory folder was found</returns>
|
||||||
|
public InventoryFolderBase getUserRootFolder(UUID user)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a list of inventory folders contained in the folder 'parentID'
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parentID">The folder to get subfolders for</param>
|
||||||
|
/// <returns>A list of inventory folders</returns>
|
||||||
|
public List<InventoryFolderBase> getInventoryFolders(UUID parentID)
|
||||||
|
{
|
||||||
|
return new List<InventoryFolderBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns an inventory item by its UUID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The UUID of the item to be returned</param>
|
||||||
|
/// <returns>A class containing item information</returns>
|
||||||
|
public InventoryItemBase getInventoryItem(UUID item)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a specified inventory folder by its UUID
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="folder">The UUID of the folder to be returned</param>
|
||||||
|
/// <returns>A class containing folder information</returns>
|
||||||
|
public InventoryFolderBase getInventoryFolder(UUID folder)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new inventory item based on item
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The item to be created</param>
|
||||||
|
public void addInventoryItem(InventoryItemBase item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates an inventory item with item (updates based on ID)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The updated item</param>
|
||||||
|
public void updateInventoryItem(InventoryItemBase item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item"></param>
|
||||||
|
public void deleteInventoryItem(UUID item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item"></param>
|
||||||
|
public InventoryItemBase queryInventoryItem(UUID item)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item"></param>
|
||||||
|
public InventoryFolderBase queryInventoryFolder(UUID folder)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a new folder specified by folder
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="folder">The inventory folder</param>
|
||||||
|
public void addInventoryFolder(InventoryFolderBase folder)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates a folder based on its ID with folder
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="folder">The inventory folder</param>
|
||||||
|
public void updateInventoryFolder(InventoryFolderBase folder)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates a folder based on its ID with folder
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="folder">The inventory folder</param>
|
||||||
|
public void moveInventoryFolder(InventoryFolderBase folder)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes a folder. Thie will delete both the folder itself and its contents (items and descendent folders)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="folder">The id of the folder</param>
|
||||||
|
public 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>
|
||||||
|
public List<InventoryItemBase> fetchActiveGestures(UUID avatarID)
|
||||||
|
{
|
||||||
|
return new List<InventoryItemBase>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -135,5 +135,26 @@ namespace OpenSim.Data.Null
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool Delete(string field, string val)
|
||||||
|
{
|
||||||
|
// Only delete by PrincipalID
|
||||||
|
if (field.Equals("PrincipalID"))
|
||||||
|
{
|
||||||
|
UUID uuid = UUID.Zero;
|
||||||
|
if (UUID.TryParse(val, out uuid) && m_DataByUUID.ContainsKey(uuid))
|
||||||
|
{
|
||||||
|
UserAccountData account = m_DataByUUID[uuid];
|
||||||
|
m_DataByUUID.Remove(uuid);
|
||||||
|
if (m_DataByName.ContainsKey(account.FirstName + " " + account.LastName))
|
||||||
|
m_DataByName.Remove(account.FirstName + " " + account.LastName);
|
||||||
|
if (account.Data.ContainsKey("Email") && account.Data["Email"] != string.Empty && m_DataByEmail.ContainsKey(account.Data["Email"]))
|
||||||
|
m_DataByEmail.Remove(account.Data["Email"]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
-- useraccounts table
|
-- useraccounts table
|
||||||
CREATE TABLE UserAccounts (
|
CREATE TABLE UserAccounts (
|
||||||
PrincipalID CHAR(36) NOT NULL,
|
PrincipalID CHAR(36) primary key,
|
||||||
ScopeID CHAR(36) NOT NULL,
|
ScopeID CHAR(36) NOT NULL,
|
||||||
FirstName VARCHAR(64) NOT NULL,
|
FirstName VARCHAR(64) NOT NULL,
|
||||||
LastName VARCHAR(64) NOT NULL,
|
LastName VARCHAR(64) NOT NULL,
|
||||||
|
|
|
@ -235,7 +235,7 @@ namespace OpenSim.Data.SQLite
|
||||||
if (System.Environment.TickCount - m_LastExpire > 30000)
|
if (System.Environment.TickCount - m_LastExpire > 30000)
|
||||||
DoExpire();
|
DoExpire();
|
||||||
|
|
||||||
SqliteCommand cmd = new SqliteCommand("update tokens set validity = datetime('now, 'localtime', '+" + lifetime.ToString() +
|
SqliteCommand cmd = new SqliteCommand("update tokens set validity = datetime('now', 'localtime', '+" + lifetime.ToString() +
|
||||||
" minutes') where UUID = '" + principalID.ToString() + "' and token = '" + token + "' and validity > datetime('now', 'localtime')");
|
" minutes') where UUID = '" + principalID.ToString() + "' and token = '" + token + "' and validity > datetime('now', 'localtime')");
|
||||||
|
|
||||||
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
if (ExecuteNonQuery(cmd, m_Connection) > 0)
|
||||||
|
|
|
@ -66,7 +66,7 @@ namespace OpenSim.Data.SQLite
|
||||||
|
|
||||||
if (words.Length == 1)
|
if (words.Length == 1)
|
||||||
{
|
{
|
||||||
cmd.CommandText = String.Format("select * from {0} where ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')",
|
cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')",
|
||||||
m_Realm, scopeID.ToString(), words[0]);
|
m_Realm, scopeID.ToString(), words[0]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -139,6 +139,9 @@ namespace OpenSim.Framework.Communications.Osp
|
||||||
/// </returns>
|
/// </returns>
|
||||||
protected static UUID ResolveOspaName(string name, IUserAccountService userService)
|
protected static UUID ResolveOspaName(string name, IUserAccountService userService)
|
||||||
{
|
{
|
||||||
|
if (userService == null)
|
||||||
|
return UUID.Zero;
|
||||||
|
|
||||||
int nameSeparatorIndex = name.IndexOf(OSPA_NAME_VALUE_SEPARATOR);
|
int nameSeparatorIndex = name.IndexOf(OSPA_NAME_VALUE_SEPARATOR);
|
||||||
|
|
||||||
if (nameSeparatorIndex < 0)
|
if (nameSeparatorIndex < 0)
|
||||||
|
|
|
@ -105,14 +105,30 @@ namespace OpenSim.Framework.Console
|
||||||
int left = System.Console.CursorLeft;
|
int left = System.Console.CursorLeft;
|
||||||
|
|
||||||
if (left < 0)
|
if (left < 0)
|
||||||
|
{
|
||||||
System.Console.CursorLeft = 0;
|
System.Console.CursorLeft = 0;
|
||||||
else if (left >= System.Console.BufferWidth)
|
}
|
||||||
System.Console.CursorLeft = System.Console.BufferWidth - 1;
|
else
|
||||||
|
{
|
||||||
|
int bw = System.Console.BufferWidth;
|
||||||
|
|
||||||
|
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||||
|
if (bw > 0 && left >= bw)
|
||||||
|
System.Console.CursorLeft = bw - 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (top < 0)
|
if (top < 0)
|
||||||
|
{
|
||||||
top = 0;
|
top = 0;
|
||||||
if (top >= System.Console.BufferHeight)
|
}
|
||||||
top = System.Console.BufferHeight - 1;
|
else
|
||||||
|
{
|
||||||
|
int bh = System.Console.BufferHeight;
|
||||||
|
|
||||||
|
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||||
|
if (bh > 0 && top >= bh)
|
||||||
|
top = bh - 1;
|
||||||
|
}
|
||||||
|
|
||||||
System.Console.CursorTop = top;
|
System.Console.CursorTop = top;
|
||||||
|
|
||||||
|
@ -138,14 +154,29 @@ namespace OpenSim.Framework.Console
|
||||||
int top = System.Console.CursorTop;
|
int top = System.Console.CursorTop;
|
||||||
|
|
||||||
if (top < 0)
|
if (top < 0)
|
||||||
|
{
|
||||||
System.Console.CursorTop = 0;
|
System.Console.CursorTop = 0;
|
||||||
else if (top >= System.Console.BufferHeight)
|
}
|
||||||
System.Console.CursorTop = System.Console.BufferHeight - 1;
|
else
|
||||||
|
{
|
||||||
|
int bh = System.Console.BufferHeight;
|
||||||
|
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||||
|
if (bh > 0 && top >= bh)
|
||||||
|
System.Console.CursorTop = bh - 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (left < 0)
|
if (left < 0)
|
||||||
|
{
|
||||||
left = 0;
|
left = 0;
|
||||||
if (left >= System.Console.BufferWidth)
|
}
|
||||||
left = System.Console.BufferWidth - 1;
|
else
|
||||||
|
{
|
||||||
|
int bw = System.Console.BufferWidth;
|
||||||
|
|
||||||
|
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
|
||||||
|
if (bw > 0 && left >= bw)
|
||||||
|
left = bw - 1;
|
||||||
|
}
|
||||||
|
|
||||||
System.Console.CursorLeft = left;
|
System.Console.CursorLeft = left;
|
||||||
|
|
||||||
|
|
|
@ -236,6 +236,10 @@ namespace OpenSim.Framework
|
||||||
IClientAPI remoteClient, UUID transActionID, UUID folderID, uint callbackID, string description, string name,
|
IClientAPI remoteClient, UUID transActionID, UUID folderID, uint callbackID, string description, string name,
|
||||||
sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask, int creationDate);
|
sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask, int creationDate);
|
||||||
|
|
||||||
|
public delegate void LinkInventoryItem(
|
||||||
|
IClientAPI remoteClient, UUID transActionID, UUID folderID, uint callbackID, string description, string name,
|
||||||
|
sbyte invType, sbyte type, UUID olditemID);
|
||||||
|
|
||||||
public delegate void FetchInventoryDescendents(
|
public delegate void FetchInventoryDescendents(
|
||||||
IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
|
IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
|
||||||
|
|
||||||
|
@ -930,6 +934,7 @@ namespace OpenSim.Framework
|
||||||
event ObjectPermissions OnObjectPermissions;
|
event ObjectPermissions OnObjectPermissions;
|
||||||
|
|
||||||
event CreateNewInventoryItem OnCreateNewInventoryItem;
|
event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
event LinkInventoryItem OnLinkInventoryItem;
|
||||||
event CreateInventoryFolder OnCreateNewInventoryFolder;
|
event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
event UpdateInventoryFolder OnUpdateInventoryFolder;
|
event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
event MoveInventoryFolder OnMoveInventoryFolder;
|
event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
|
|
@ -188,6 +188,10 @@ namespace OpenSim.Framework
|
||||||
m_textureEntry = DEFAULT_TEXTURE;
|
m_textureEntry = DEFAULT_TEXTURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Construct a PrimitiveBaseShape object from a OpenMetaverse.Primitive object
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="prim"></param>
|
||||||
public PrimitiveBaseShape(Primitive prim)
|
public PrimitiveBaseShape(Primitive prim)
|
||||||
{
|
{
|
||||||
PCode = (byte)prim.PrimData.PCode;
|
PCode = (byte)prim.PrimData.PCode;
|
||||||
|
|
|
@ -106,6 +106,39 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string SLInvTypeToContentType(int invType)
|
||||||
|
{
|
||||||
|
switch ((InventoryType)invType)
|
||||||
|
{
|
||||||
|
case InventoryType.Animation:
|
||||||
|
return "application/vnd.ll.animation";
|
||||||
|
case InventoryType.CallingCard:
|
||||||
|
return "application/vnd.ll.callingcard";
|
||||||
|
case InventoryType.Folder:
|
||||||
|
return "application/vnd.ll.folder";
|
||||||
|
case InventoryType.Gesture:
|
||||||
|
return "application/vnd.ll.gesture";
|
||||||
|
case InventoryType.Landmark:
|
||||||
|
return "application/vnd.ll.landmark";
|
||||||
|
case InventoryType.LSL:
|
||||||
|
return "application/vnd.ll.lsltext";
|
||||||
|
case InventoryType.Notecard:
|
||||||
|
return "application/vnd.ll.notecard";
|
||||||
|
case InventoryType.Attachment:
|
||||||
|
case InventoryType.Object:
|
||||||
|
return "application/vnd.ll.primitive";
|
||||||
|
case InventoryType.Sound:
|
||||||
|
return "application/ogg";
|
||||||
|
case InventoryType.Snapshot:
|
||||||
|
case InventoryType.Texture:
|
||||||
|
return "image/x-j2c";
|
||||||
|
case InventoryType.Wearable:
|
||||||
|
return "application/vnd.ll.clothing";
|
||||||
|
default:
|
||||||
|
return "application/octet-stream";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static sbyte ContentTypeToSLAssetType(string contentType)
|
public static sbyte ContentTypeToSLAssetType(string contentType)
|
||||||
{
|
{
|
||||||
switch (contentType)
|
switch (contentType)
|
||||||
|
|
|
@ -208,6 +208,8 @@ namespace OpenSim.Framework.Serialization
|
||||||
m_bw.Write(header);
|
m_bw.Write(header);
|
||||||
|
|
||||||
// Write out data
|
// Write out data
|
||||||
|
// An IOException occurs if we try to write out an empty array in Mono 2.6
|
||||||
|
if (data.Length > 0)
|
||||||
m_bw.Write(data);
|
m_bw.Write(data);
|
||||||
|
|
||||||
if (data.Length % 512 != 0)
|
if (data.Length % 512 != 0)
|
||||||
|
|
|
@ -251,8 +251,9 @@ namespace OpenSim
|
||||||
"Save named prim to XML2", SavePrimsXml2);
|
"Save named prim to XML2", SavePrimsXml2);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "load oar",
|
m_console.Commands.AddCommand("region", false, "load oar",
|
||||||
"load oar [--merge] <oar name>",
|
"load oar [--merge] [--skip-assets] <oar name>",
|
||||||
"Load a region's data from OAR archive", LoadOar);
|
"Load a region's data from OAR archive. --merge will merge the oar with the existing scene. --skip-assets will load the oar but ignore the assets it contains",
|
||||||
|
LoadOar);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("region", false, "save oar",
|
m_console.Commands.AddCommand("region", false, "save oar",
|
||||||
"save oar <oar name>",
|
"save oar <oar name>",
|
||||||
|
|
|
@ -182,6 +182,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
public event TeleportLocationRequest OnSetStartLocationRequest;
|
public event TeleportLocationRequest OnSetStartLocationRequest;
|
||||||
public event UpdateAvatarProperties OnUpdateAvatarProperties;
|
public event UpdateAvatarProperties OnUpdateAvatarProperties;
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem;
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder;
|
public event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
@ -641,7 +642,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
if (pprocessor.Async)
|
if (pprocessor.Async)
|
||||||
{
|
{
|
||||||
object obj = new AsyncPacketProcess(this, pprocessor.method, packet);
|
object obj = new AsyncPacketProcess(this, pprocessor.method, packet);
|
||||||
Util.FireAndForget(ProcessSpecificPacketAsync,obj);
|
Util.FireAndForget(ProcessSpecificPacketAsync, obj);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -669,8 +670,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
public void ProcessSpecificPacketAsync(object state)
|
public void ProcessSpecificPacketAsync(object state)
|
||||||
{
|
{
|
||||||
AsyncPacketProcess packetObject = (AsyncPacketProcess)state;
|
AsyncPacketProcess packetObject = (AsyncPacketProcess)state;
|
||||||
packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack);
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
// Make sure that we see any exception caused by the asynchronous operation.
|
||||||
|
m_log.Error(
|
||||||
|
string.Format("[LLCLIENTVIEW]: Caught exception while processing {0}", packetObject.Pack), e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Packet Handling
|
#endregion Packet Handling
|
||||||
|
@ -4740,6 +4750,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
AddLocalPacketHandler(PacketType.UpdateInventoryFolder, HandleUpdateInventoryFolder);
|
AddLocalPacketHandler(PacketType.UpdateInventoryFolder, HandleUpdateInventoryFolder);
|
||||||
AddLocalPacketHandler(PacketType.MoveInventoryFolder, HandleMoveInventoryFolder);
|
AddLocalPacketHandler(PacketType.MoveInventoryFolder, HandleMoveInventoryFolder);
|
||||||
AddLocalPacketHandler(PacketType.CreateInventoryItem, HandleCreateInventoryItem);
|
AddLocalPacketHandler(PacketType.CreateInventoryItem, HandleCreateInventoryItem);
|
||||||
|
AddLocalPacketHandler(PacketType.LinkInventoryItem, HandleLinkInventoryItem);
|
||||||
AddLocalPacketHandler(PacketType.FetchInventory, HandleFetchInventory);
|
AddLocalPacketHandler(PacketType.FetchInventory, HandleFetchInventory);
|
||||||
AddLocalPacketHandler(PacketType.FetchInventoryDescendents, HandleFetchInventoryDescendents);
|
AddLocalPacketHandler(PacketType.FetchInventoryDescendents, HandleFetchInventoryDescendents);
|
||||||
AddLocalPacketHandler(PacketType.PurgeInventoryDescendents, HandlePurgeInventoryDescendents);
|
AddLocalPacketHandler(PacketType.PurgeInventoryDescendents, HandlePurgeInventoryDescendents);
|
||||||
|
@ -7058,6 +7069,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is the entry point for the UDP route by which the client can retrieve asset data. If the request
|
||||||
|
/// is successful then a TransferInfo packet will be sent back, followed by one or more TransferPackets
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="Pack"></param>
|
||||||
|
/// <returns>This parameter may be ignored since we appear to return true whatever happens</returns>
|
||||||
private bool HandleTransferRequest(IClientAPI sender, Packet Pack)
|
private bool HandleTransferRequest(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
//m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
|
//m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
|
||||||
|
@ -7068,38 +7086,96 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// Has to be done here, because AssetCache can't do it
|
// Has to be done here, because AssetCache can't do it
|
||||||
//
|
//
|
||||||
UUID taskID = UUID.Zero;
|
UUID taskID = UUID.Zero;
|
||||||
if (transfer.TransferInfo.SourceType == 3)
|
if (transfer.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
|
||||||
{
|
{
|
||||||
taskID = new UUID(transfer.TransferInfo.Params, 48);
|
taskID = new UUID(transfer.TransferInfo.Params, 48);
|
||||||
UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
|
UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
|
||||||
UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
|
UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
|
||||||
|
// requestID, itemID, taskID, Name);
|
||||||
|
|
||||||
if (!(((Scene)m_scene).Permissions.BypassPermissions()))
|
if (!(((Scene)m_scene).Permissions.BypassPermissions()))
|
||||||
{
|
{
|
||||||
if (taskID != UUID.Zero) // Prim
|
if (taskID != UUID.Zero) // Prim
|
||||||
{
|
{
|
||||||
SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
|
SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
|
||||||
if (part == null)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (part.OwnerID != AgentId)
|
if (part == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID);
|
||||||
|
if (tii == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tii.Type == (int)AssetType.LSLText)
|
||||||
|
{
|
||||||
|
if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (tii.Type == (int)AssetType.Notecard)
|
||||||
|
{
|
||||||
|
if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: Change this code to allow items other than notecards and scripts to be successfully
|
||||||
|
// shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule
|
||||||
|
if (part.OwnerID != AgentId)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
|
||||||
|
Name, requestID, itemID, taskID, part.OwnerID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID);
|
if (tii.OwnerID != AgentId)
|
||||||
if (ti == null)
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}",
|
||||||
|
Name, requestID, itemID, taskID, tii.OwnerID);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (ti.OwnerID != AgentId)
|
if ((
|
||||||
|
tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
|
||||||
|
!= ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
|
if (tii.AssetID != requestID)
|
||||||
return true;
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
if (ti.AssetID != requestID)
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}",
|
||||||
|
Name, requestID, itemID, taskID, tii.AssetID);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else // Agent
|
else // Agent
|
||||||
{
|
{
|
||||||
IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
|
IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
|
||||||
|
@ -7118,7 +7194,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// only to notecards and scripts. All
|
// only to notecards and scripts. All
|
||||||
// other asset types are always available
|
// other asset types are always available
|
||||||
//
|
//
|
||||||
if (assetRequestItem.AssetType == 10)
|
if (assetRequestItem.AssetType == (int)AssetType.LSLText)
|
||||||
{
|
{
|
||||||
if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId))
|
if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId))
|
||||||
{
|
{
|
||||||
|
@ -7126,7 +7202,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (assetRequestItem.AssetType == 7)
|
else if (assetRequestItem.AssetType == (int)AssetType.Notecard)
|
||||||
{
|
{
|
||||||
if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId))
|
if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId))
|
||||||
{
|
{
|
||||||
|
@ -7136,10 +7212,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
|
|
||||||
if (assetRequestItem.AssetID != requestID)
|
if (assetRequestItem.AssetID != requestID)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}",
|
||||||
|
Name, requestID, itemID, assetRequestItem.AssetID);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//m_assetCache.AddAssetRequest(this, transfer);
|
//m_assetCache.AddAssetRequest(this, transfer);
|
||||||
|
|
||||||
|
@ -7339,6 +7420,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool HandleLinkInventoryItem(IClientAPI sender, Packet Pack)
|
||||||
|
{
|
||||||
|
LinkInventoryItemPacket createLink = (LinkInventoryItemPacket)Pack;
|
||||||
|
|
||||||
|
#region Packet Session and User Check
|
||||||
|
if (m_checkPackets)
|
||||||
|
{
|
||||||
|
if (createLink.AgentData.SessionID != SessionId ||
|
||||||
|
createLink.AgentData.AgentID != AgentId)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
LinkInventoryItem linkInventoryItem = OnLinkInventoryItem;
|
||||||
|
|
||||||
|
if (linkInventoryItem != null)
|
||||||
|
{
|
||||||
|
linkInventoryItem(
|
||||||
|
this,
|
||||||
|
createLink.InventoryBlock.TransactionID,
|
||||||
|
createLink.InventoryBlock.FolderID,
|
||||||
|
createLink.InventoryBlock.CallbackID,
|
||||||
|
Util.FieldToString(createLink.InventoryBlock.Description),
|
||||||
|
Util.FieldToString(createLink.InventoryBlock.Name),
|
||||||
|
createLink.InventoryBlock.InvType,
|
||||||
|
createLink.InventoryBlock.Type,
|
||||||
|
createLink.InventoryBlock.OldItemID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private bool HandleFetchInventory(IClientAPI sender, Packet Pack)
|
private bool HandleFetchInventory(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
if (OnFetchInventory != null)
|
if (OnFetchInventory != null)
|
||||||
|
@ -7683,12 +7796,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask;
|
newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask;
|
||||||
newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask;
|
newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask;
|
||||||
newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask;
|
newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask;
|
||||||
|
|
||||||
|
// Unused? Clicking share with group sets GroupPermissions instead, so perhaps this is something
|
||||||
|
// different
|
||||||
//newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
|
//newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
|
||||||
newTaskItem.Type = updatetask.InventoryData.Type;
|
newTaskItem.Type = updatetask.InventoryData.Type;
|
||||||
newTaskItem.InvType = updatetask.InventoryData.InvType;
|
newTaskItem.InvType = updatetask.InventoryData.InvType;
|
||||||
newTaskItem.Flags = updatetask.InventoryData.Flags;
|
newTaskItem.Flags = updatetask.InventoryData.Flags;
|
||||||
//newTaskItem.SaleType=updatetask.InventoryData.SaleType;
|
//newTaskItem.SaleType=updatetask.InventoryData.SaleType;
|
||||||
//newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;;
|
//newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;
|
||||||
newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name);
|
newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name);
|
||||||
newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description);
|
newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description);
|
||||||
newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate;
|
newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate;
|
||||||
|
@ -11290,12 +11406,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
m_groupPowers.Clear();
|
m_groupPowers.Clear();
|
||||||
|
|
||||||
|
if (GroupMembership != null)
|
||||||
|
{
|
||||||
for (int i = 0; i < GroupMembership.Length; i++)
|
for (int i = 0; i < GroupMembership.Length; i++)
|
||||||
{
|
{
|
||||||
m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
|
m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public string Report()
|
public string Report()
|
||||||
{
|
{
|
||||||
|
@ -11307,17 +11426,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return String.Empty;
|
return String.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID)
|
/// <summary>
|
||||||
|
/// Make an asset request to the asset service in response to a client request.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="transferRequest"></param>
|
||||||
|
/// <param name="taskID"></param>
|
||||||
|
protected void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID)
|
||||||
{
|
{
|
||||||
UUID requestID = UUID.Zero;
|
UUID requestID = UUID.Zero;
|
||||||
if (transferRequest.TransferInfo.SourceType == 2)
|
if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset)
|
||||||
{
|
{
|
||||||
//direct asset request
|
|
||||||
requestID = new UUID(transferRequest.TransferInfo.Params, 0);
|
requestID = new UUID(transferRequest.TransferInfo.Params, 0);
|
||||||
}
|
}
|
||||||
else if (transferRequest.TransferInfo.SourceType == 3)
|
else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
|
||||||
{
|
{
|
||||||
//inventory asset request
|
|
||||||
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
||||||
//m_log.Debug("[XXX] inventory asset request " + requestID);
|
//m_log.Debug("[XXX] inventory asset request " + requestID);
|
||||||
//if (taskID == UUID.Zero) // Agent
|
//if (taskID == UUID.Zero) // Agent
|
||||||
|
@ -11330,29 +11452,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
//check to see if asset is in local cache, if not we need to request it from asset server.
|
// m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID);
|
||||||
//m_log.Debug("asset request " + requestID);
|
|
||||||
|
|
||||||
m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived);
|
m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When we get a reply back from the asset service in response to a client request, send back the data.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="asset"></param>
|
||||||
protected void AssetReceived(string id, Object sender, AssetBase asset)
|
protected void AssetReceived(string id, Object sender, AssetBase asset)
|
||||||
{
|
{
|
||||||
TransferRequestPacket transferRequest = (TransferRequestPacket)sender;
|
TransferRequestPacket transferRequest = (TransferRequestPacket)sender;
|
||||||
|
|
||||||
UUID requestID = UUID.Zero;
|
UUID requestID = UUID.Zero;
|
||||||
byte source = 2;
|
byte source = (byte)SourceType.Asset;
|
||||||
if ((transferRequest.TransferInfo.SourceType == 2) || (transferRequest.TransferInfo.SourceType == 2222))
|
|
||||||
|
if ((transferRequest.TransferInfo.SourceType == (int)SourceType.Asset)
|
||||||
|
|| (transferRequest.TransferInfo.SourceType == 2222))
|
||||||
{
|
{
|
||||||
//direct asset request
|
|
||||||
requestID = new UUID(transferRequest.TransferInfo.Params, 0);
|
requestID = new UUID(transferRequest.TransferInfo.Params, 0);
|
||||||
}
|
}
|
||||||
else if ((transferRequest.TransferInfo.SourceType == 3) || (transferRequest.TransferInfo.SourceType == 3333))
|
else if ((transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
|
||||||
|
|| (transferRequest.TransferInfo.SourceType == 3333))
|
||||||
{
|
{
|
||||||
//inventory asset request
|
|
||||||
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
||||||
source = 3;
|
source = (byte)SourceType.SimInventoryItem;
|
||||||
//m_log.Debug("asset request " + requestID);
|
//m_log.Debug("asset request " + requestID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11365,9 +11492,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
if ((userAssets != string.Empty) && (userAssets != m_hyperAssets.GetSimAssetServer()))
|
if ((userAssets != string.Empty) && (userAssets != m_hyperAssets.GetSimAssetServer()))
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[CLIENT]: asset {0} not found in local asset storage. Trying user's storage.", id);
|
m_log.DebugFormat("[CLIENT]: asset {0} not found in local asset storage. Trying user's storage.", id);
|
||||||
if (transferRequest.TransferInfo.SourceType == 2)
|
if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset)
|
||||||
transferRequest.TransferInfo.SourceType = 2222; // marker
|
transferRequest.TransferInfo.SourceType = 2222; // marker
|
||||||
else if (transferRequest.TransferInfo.SourceType == 3)
|
else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
|
||||||
transferRequest.TransferInfo.SourceType = 3333; // marker
|
transferRequest.TransferInfo.SourceType = 3333; // marker
|
||||||
|
|
||||||
m_assetService.Get(userAssets + "/" + id, transferRequest, AssetReceived);
|
m_assetService.Get(userAssets + "/" + id, transferRequest, AssetReceived);
|
||||||
|
@ -11382,7 +11509,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scripts cannot be retrieved by direct request
|
// Scripts cannot be retrieved by direct request
|
||||||
if (transferRequest.TransferInfo.SourceType == 2 && asset.Type == 10)
|
if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset && asset.Type == 10)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// The asset is known to exist and is in our cache, so add it to the AssetRequests list
|
// The asset is known to exist and is in our cache, so add it to the AssetRequests list
|
||||||
|
@ -11615,6 +11742,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
public PacketMethod method;
|
public PacketMethod method;
|
||||||
public bool Async;
|
public bool Async;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AsyncPacketProcess
|
public class AsyncPacketProcess
|
||||||
{
|
{
|
||||||
public bool result = false;
|
public bool result = false;
|
||||||
|
|
|
@ -513,6 +513,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
byte flags = buffer.Data[0];
|
byte flags = buffer.Data[0];
|
||||||
bool isResend = (flags & Helpers.MSG_RESENT) != 0;
|
bool isResend = (flags & Helpers.MSG_RESENT) != 0;
|
||||||
bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0;
|
bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0;
|
||||||
|
bool isZerocoded = (flags & Helpers.MSG_ZEROCODED) != 0;
|
||||||
LLUDPClient udpClient = outgoingPacket.Client;
|
LLUDPClient udpClient = outgoingPacket.Client;
|
||||||
|
|
||||||
if (!udpClient.IsConnected)
|
if (!udpClient.IsConnected)
|
||||||
|
@ -522,6 +523,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
int dataLength = buffer.DataLength;
|
int dataLength = buffer.DataLength;
|
||||||
|
|
||||||
|
// NOTE: I'm seeing problems with some viewers when ACKs are appended to zerocoded packets so I've disabled that here
|
||||||
|
if (!isZerocoded)
|
||||||
|
{
|
||||||
// Keep appending ACKs until there is no room left in the buffer or there are
|
// Keep appending ACKs until there is no room left in the buffer or there are
|
||||||
// no more ACKs to append
|
// no more ACKs to append
|
||||||
uint ackCount = 0;
|
uint ackCount = 0;
|
||||||
|
@ -540,6 +544,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// Set the appended ACKs flag on this packet
|
// Set the appended ACKs flag on this packet
|
||||||
buffer.Data[0] = (byte)(buffer.Data[0] | Helpers.MSG_APPENDED_ACKS);
|
buffer.Data[0] = (byte)(buffer.Data[0] | Helpers.MSG_APPENDED_ACKS);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buffer.DataLength = dataLength;
|
buffer.DataLength = dataLength;
|
||||||
|
|
||||||
|
|
|
@ -181,10 +181,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||||
Manager.MyScene.AssetService.Store(asset);
|
Manager.MyScene.AssetService.Store(asset);
|
||||||
|
|
||||||
if (part.Inventory.UpdateInventoryItem(item))
|
if (part.Inventory.UpdateInventoryItem(item))
|
||||||
|
{
|
||||||
|
remoteClient.SendAgentAlertMessage("Notecard saved", false);
|
||||||
part.GetProperties(remoteClient);
|
part.GetProperties(remoteClient);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID,
|
public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID,
|
||||||
|
|
|
@ -406,6 +406,11 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBase GetCached(string id)
|
||||||
|
{
|
||||||
|
return Get(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void Expire(string id)
|
public void Expire(string id)
|
||||||
{
|
{
|
||||||
if (m_LogLevel >= 2)
|
if (m_LogLevel >= 2)
|
||||||
|
|
|
@ -0,0 +1,220 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.IO;
|
||||||
|
using System.Web;
|
||||||
|
using log4net;
|
||||||
|
using Nini.Config;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.StructuredData;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Servers;
|
||||||
|
using OpenSim.Framework.Servers.HttpServer;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
|
||||||
|
{
|
||||||
|
#region Stream Handler
|
||||||
|
|
||||||
|
public delegate byte[] StreamHandlerCallback(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse);
|
||||||
|
|
||||||
|
public class StreamHandler : BaseStreamHandler
|
||||||
|
{
|
||||||
|
StreamHandlerCallback m_callback;
|
||||||
|
|
||||||
|
public StreamHandler(string httpMethod, string path, StreamHandlerCallback callback)
|
||||||
|
: base(httpMethod, path)
|
||||||
|
{
|
||||||
|
m_callback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
return m_callback(path, request, httpRequest, httpResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Stream Handler
|
||||||
|
|
||||||
|
public class GetTextureModule : IRegionModule
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log =
|
||||||
|
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
private Scene m_scene;
|
||||||
|
private IAssetService m_assetService;
|
||||||
|
|
||||||
|
#region IRegionModule Members
|
||||||
|
|
||||||
|
public void Initialise(Scene pScene, IConfigSource pSource)
|
||||||
|
{
|
||||||
|
m_scene = pScene;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PostInitialise()
|
||||||
|
{
|
||||||
|
m_assetService = m_scene.RequestModuleInterface<IAssetService>();
|
||||||
|
m_scene.EventManager.OnRegisterCaps += RegisterCaps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close() { }
|
||||||
|
|
||||||
|
public string Name { get { return "GetTextureModule"; } }
|
||||||
|
public bool IsSharedModule { get { return false; } }
|
||||||
|
|
||||||
|
public void RegisterCaps(UUID agentID, Caps caps)
|
||||||
|
{
|
||||||
|
UUID capID = UUID.Random();
|
||||||
|
|
||||||
|
m_log.Info("[GETTEXTURE]: /CAPS/" + capID);
|
||||||
|
caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private byte[] ProcessGetTexture(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse)
|
||||||
|
{
|
||||||
|
// TODO: Change this to a config option
|
||||||
|
const string REDIRECT_URL = null;
|
||||||
|
|
||||||
|
// Try to parse the texture ID from the request URL
|
||||||
|
NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query);
|
||||||
|
string textureStr = query.GetOne("texture_id");
|
||||||
|
|
||||||
|
if (m_assetService == null)
|
||||||
|
{
|
||||||
|
m_log.Error("[GETTEXTURE]: Cannot fetch texture " + textureStr + " without an asset service");
|
||||||
|
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
UUID textureID;
|
||||||
|
if (!String.IsNullOrEmpty(textureStr) && UUID.TryParse(textureStr, out textureID))
|
||||||
|
{
|
||||||
|
AssetBase texture;
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(REDIRECT_URL))
|
||||||
|
{
|
||||||
|
// Only try to fetch locally cached textures. Misses are redirected
|
||||||
|
texture = m_assetService.GetCached(textureID.ToString());
|
||||||
|
|
||||||
|
if (texture != null)
|
||||||
|
{
|
||||||
|
SendTexture(httpRequest, httpResponse, texture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string textureUrl = REDIRECT_URL + textureID.ToString();
|
||||||
|
m_log.Debug("[GETTEXTURE]: Redirecting texture request to " + textureUrl);
|
||||||
|
httpResponse.RedirectLocation = textureUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fetch locally or remotely. Misses return a 404
|
||||||
|
texture = m_assetService.Get(textureID.ToString());
|
||||||
|
|
||||||
|
if (texture != null)
|
||||||
|
{
|
||||||
|
SendTexture(httpRequest, httpResponse, texture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found");
|
||||||
|
httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Warn("[GETTEXTURE]: Failed to parse a texture_id from GetTexture request: " + httpRequest.Url);
|
||||||
|
}
|
||||||
|
|
||||||
|
httpResponse.Send();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendTexture(OSHttpRequest request, OSHttpResponse response, AssetBase texture)
|
||||||
|
{
|
||||||
|
string range = request.Headers.GetOne("Range");
|
||||||
|
if (!String.IsNullOrEmpty(range))
|
||||||
|
{
|
||||||
|
// Range request
|
||||||
|
int start, end;
|
||||||
|
if (TryParseRange(range, out start, out end))
|
||||||
|
{
|
||||||
|
end = Utils.Clamp(end, 1, texture.Data.Length);
|
||||||
|
start = Utils.Clamp(start, 0, end - 1);
|
||||||
|
|
||||||
|
m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID);
|
||||||
|
|
||||||
|
if (end - start < texture.Data.Length)
|
||||||
|
response.StatusCode = (int)System.Net.HttpStatusCode.PartialContent;
|
||||||
|
|
||||||
|
response.ContentLength = end - start;
|
||||||
|
response.ContentType = texture.Metadata.ContentType;
|
||||||
|
|
||||||
|
response.Body.Write(texture.Data, start, end - start);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Warn("Malformed Range header: " + range);
|
||||||
|
response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Full content request
|
||||||
|
response.ContentLength = texture.Data.Length;
|
||||||
|
response.ContentType = texture.Metadata.ContentType;
|
||||||
|
response.Body.Write(texture.Data, 0, texture.Data.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TryParseRange(string header, out int start, out int end)
|
||||||
|
{
|
||||||
|
if (header.StartsWith("bytes="))
|
||||||
|
{
|
||||||
|
string[] rangeValues = header.Substring(6).Split('-');
|
||||||
|
if (rangeValues.Length == 2)
|
||||||
|
{
|
||||||
|
if (Int32.TryParse(rangeValues[0], out start) && Int32.TryParse(rangeValues[1], out end))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
start = end = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,7 @@ using System.Reflection;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.Packets;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework;
|
using OpenSim.Region.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
@ -169,6 +170,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RezMultipleAttachmentsFromInventory(
|
||||||
|
IClientAPI remoteClient,
|
||||||
|
RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
|
||||||
|
RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
|
||||||
|
{
|
||||||
|
foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
|
||||||
|
{
|
||||||
|
RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UUID RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
|
public UUID RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name);
|
m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name);
|
||||||
|
@ -227,6 +239,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
// Fire after attach, so we don't get messy perms dialogs
|
// Fire after attach, so we don't get messy perms dialogs
|
||||||
// 3 == AttachedRez
|
// 3 == AttachedRez
|
||||||
objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3);
|
objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3);
|
||||||
|
objatt.ResumeScripts();
|
||||||
|
|
||||||
// Do this last so that event listeners have access to all the effects of the attachment
|
// Do this last so that event listeners have access to all the effects of the attachment
|
||||||
m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
|
m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
|
||||||
|
@ -311,6 +324,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DetachObject(uint objectLocalID, IClientAPI remoteClient)
|
||||||
|
{
|
||||||
|
SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID);
|
||||||
|
if (group != null)
|
||||||
|
{
|
||||||
|
//group.DetachToGround();
|
||||||
|
ShowDetachInUserInventory(group.GetFromItemID(), remoteClient);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient)
|
public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient)
|
||||||
{
|
{
|
||||||
ScenePresence presence;
|
ScenePresence presence;
|
||||||
|
@ -329,6 +352,38 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
DetachSingleAttachmentToInv(itemID, remoteClient);
|
DetachSingleAttachmentToInv(itemID, remoteClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient)
|
||||||
|
{
|
||||||
|
SceneObjectPart part = m_scene.GetSceneObjectPart(itemID);
|
||||||
|
if (part == null || part.ParentGroup == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
UUID inventoryID = part.ParentGroup.GetFromItemID();
|
||||||
|
|
||||||
|
ScenePresence presence;
|
||||||
|
if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
|
||||||
|
{
|
||||||
|
if (!m_scene.Permissions.CanRezObject(
|
||||||
|
part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition))
|
||||||
|
return;
|
||||||
|
|
||||||
|
presence.Appearance.DetachAttachment(itemID);
|
||||||
|
|
||||||
|
if (m_scene.AvatarFactory != null)
|
||||||
|
{
|
||||||
|
m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
|
||||||
|
}
|
||||||
|
part.ParentGroup.DetachToGround();
|
||||||
|
|
||||||
|
List<UUID> uuids = new List<UUID>();
|
||||||
|
uuids.Add(inventoryID);
|
||||||
|
m_scene.InventoryService.DeleteItems(remoteClient.AgentId, uuids);
|
||||||
|
remoteClient.SendRemoveInventoryItem(inventoryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_scene.EventManager.TriggerOnAttach(part.ParentGroup.LocalId, itemID, UUID.Zero);
|
||||||
|
}
|
||||||
|
|
||||||
// What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
|
// What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
|
||||||
// To LocalId or UUID, *THAT* is the question. How now Brown UUID??
|
// To LocalId or UUID, *THAT* is the question. How now Brown UUID??
|
||||||
protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
|
protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
|
||||||
|
|
|
@ -601,6 +601,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
|
|
||||||
// Fire on_rez
|
// Fire on_rez
|
||||||
group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0);
|
group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0);
|
||||||
|
rootPart.ParentGroup.ResumeScripts();
|
||||||
|
|
||||||
rootPart.ScheduleFullUpdate();
|
rootPart.ScheduleFullUpdate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,11 +173,11 @@ namespace OpenSim.Region.CoreModules.Framework.Library
|
||||||
m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
|
m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
|
||||||
simpleName = GetInventoryPathFromName(simpleName);
|
simpleName = GetInventoryPathFromName(simpleName);
|
||||||
|
|
||||||
|
InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName);
|
|
||||||
List<InventoryNodeBase> nodes = archread.Execute();
|
List<InventoryNodeBase> nodes = archread.Execute();
|
||||||
if (nodes.Count == 0)
|
if (nodes != null && nodes.Count == 0)
|
||||||
{
|
{
|
||||||
// didn't find the subfolder with the given name; place it on the top
|
// didn't find the subfolder with the given name; place it on the top
|
||||||
m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
|
m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
|
||||||
|
@ -185,16 +185,33 @@ namespace OpenSim.Region.CoreModules.Framework.Library
|
||||||
archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName);
|
archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName);
|
||||||
archread.Execute();
|
archread.Execute();
|
||||||
}
|
}
|
||||||
archread.Close();
|
foreach (InventoryNodeBase node in nodes)
|
||||||
|
FixPerms(node);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.Message);
|
m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.StackTrace);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
archread.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void FixPerms(InventoryNodeBase node)
|
||||||
|
{
|
||||||
|
if (node is InventoryItemBase)
|
||||||
|
{
|
||||||
|
InventoryItemBase item = (InventoryItemBase)node;
|
||||||
|
item.BasePermissions = 0x7FFFFFFF;
|
||||||
|
item.EveryOnePermissions = 0x7FFFFFFF;
|
||||||
|
item.CurrentPermissions = 0x7FFFFFFF;
|
||||||
|
item.NextPermissions = 0x7FFFFFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void DumpLibrary()
|
private void DumpLibrary()
|
||||||
{
|
{
|
||||||
InventoryFolderImpl lib = m_Library.LibraryRootFolder;
|
InventoryFolderImpl lib = m_Library.LibraryRootFolder;
|
||||||
|
|
|
@ -229,6 +229,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBase GetCached(string id)
|
||||||
|
{
|
||||||
|
if (m_Cache != null)
|
||||||
|
return m_Cache.Get(id);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public AssetMetadata GetMetadata(string id)
|
public AssetMetadata GetMetadata(string id)
|
||||||
{
|
{
|
||||||
AssetBase asset = null;
|
AssetBase asset = null;
|
||||||
|
|
|
@ -165,6 +165,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBase GetCached(string id)
|
||||||
|
{
|
||||||
|
if (m_Cache != null)
|
||||||
|
return m_Cache.Get(id);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public AssetMetadata GetMetadata(string id)
|
public AssetMetadata GetMetadata(string id)
|
||||||
{
|
{
|
||||||
AssetBase asset = null;
|
AssetBase asset = null;
|
||||||
|
|
|
@ -311,10 +311,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID);
|
// m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID);
|
||||||
|
|
||||||
|
UUID requestedItemId = item.ID;
|
||||||
|
|
||||||
item = m_InventoryService.GetItem(item);
|
item = m_InventoryService.GetItem(item);
|
||||||
|
|
||||||
if (null == item)
|
if (null == item)
|
||||||
m_log.ErrorFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", item.ID);
|
m_log.ErrorFormat(
|
||||||
|
"[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", requestedItemId);
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,6 +144,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
|
||||||
return account;
|
return account;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override bool StoreUserAccount(UserAccount data)
|
||||||
|
{
|
||||||
|
// This remote connector refuses to serve this method
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,25 +53,27 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding();
|
protected Scene m_scene;
|
||||||
private static UTF8Encoding m_utf8Encoding = new UTF8Encoding();
|
protected Stream m_loadStream;
|
||||||
|
protected Guid m_requestId;
|
||||||
private Scene m_scene;
|
protected string m_errorMessage;
|
||||||
private Stream m_loadStream;
|
|
||||||
private Guid m_requestId;
|
|
||||||
private string m_errorMessage;
|
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Should the archive being loaded be merged with what is already on the region?
|
/// Should the archive being loaded be merged with what is already on the region?
|
||||||
/// </value>
|
/// </value>
|
||||||
private bool m_merge;
|
protected bool m_merge;
|
||||||
|
|
||||||
|
/// <value>
|
||||||
|
/// Should we ignore any assets when reloading the archive?
|
||||||
|
/// </value>
|
||||||
|
protected bool m_skipAssets;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used to cache lookups for valid uuids.
|
/// Used to cache lookups for valid uuids.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private IDictionary<UUID, bool> m_validUserUuids = new Dictionary<UUID, bool>();
|
private IDictionary<UUID, bool> m_validUserUuids = new Dictionary<UUID, bool>();
|
||||||
|
|
||||||
public ArchiveReadRequest(Scene scene, string loadPath, bool merge, Guid requestId)
|
public ArchiveReadRequest(Scene scene, string loadPath, bool merge, bool skipAssets, Guid requestId)
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
|
@ -89,14 +91,16 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
|
|
||||||
m_errorMessage = String.Empty;
|
m_errorMessage = String.Empty;
|
||||||
m_merge = merge;
|
m_merge = merge;
|
||||||
|
m_skipAssets = skipAssets;
|
||||||
m_requestId = requestId;
|
m_requestId = requestId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArchiveReadRequest(Scene scene, Stream loadStream, bool merge, Guid requestId)
|
public ArchiveReadRequest(Scene scene, Stream loadStream, bool merge, bool skipAssets, Guid requestId)
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
m_loadStream = loadStream;
|
m_loadStream = loadStream;
|
||||||
m_merge = merge;
|
m_merge = merge;
|
||||||
|
m_skipAssets = skipAssets;
|
||||||
m_requestId = requestId;
|
m_requestId = requestId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,9 +137,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
|
|
||||||
if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH))
|
if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH))
|
||||||
{
|
{
|
||||||
serialisedSceneObjects.Add(m_utf8Encoding.GetString(data));
|
serialisedSceneObjects.Add(Encoding.UTF8.GetString(data));
|
||||||
}
|
}
|
||||||
else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH))
|
else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH) && !m_skipAssets)
|
||||||
{
|
{
|
||||||
if (LoadAsset(filePath, data))
|
if (LoadAsset(filePath, data))
|
||||||
successfulAssetRestores++;
|
successfulAssetRestores++;
|
||||||
|
@ -155,7 +159,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
}
|
}
|
||||||
else if (!m_merge && filePath.StartsWith(ArchiveConstants.LANDDATA_PATH))
|
else if (!m_merge && filePath.StartsWith(ArchiveConstants.LANDDATA_PATH))
|
||||||
{
|
{
|
||||||
serialisedParcels.Add(m_utf8Encoding.GetString(data));
|
serialisedParcels.Add(Encoding.UTF8.GetString(data));
|
||||||
}
|
}
|
||||||
else if (filePath == ArchiveConstants.CONTROL_FILE_PATH)
|
else if (filePath == ArchiveConstants.CONTROL_FILE_PATH)
|
||||||
{
|
{
|
||||||
|
@ -178,6 +182,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
archive.Close();
|
archive.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!m_skipAssets)
|
||||||
|
{
|
||||||
m_log.InfoFormat("[ARCHIVER]: Restored {0} assets", successfulAssetRestores);
|
m_log.InfoFormat("[ARCHIVER]: Restored {0} assets", successfulAssetRestores);
|
||||||
|
|
||||||
if (failedAssetRestores > 0)
|
if (failedAssetRestores > 0)
|
||||||
|
@ -185,6 +191,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores);
|
m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores);
|
||||||
m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores);
|
m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!m_merge)
|
if (!m_merge)
|
||||||
{
|
{
|
||||||
|
@ -277,6 +284,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
{
|
{
|
||||||
sceneObjectsLoadedCount++;
|
sceneObjectsLoadedCount++;
|
||||||
sceneObject.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, 0);
|
sceneObject.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, 0);
|
||||||
|
sceneObject.ResumeScripts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -541,7 +549,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
|
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
|
||||||
|
|
||||||
XmlTextReader xtr
|
XmlTextReader xtr
|
||||||
= new XmlTextReader(m_asciiEncoding.GetString(data), XmlNodeType.Document, context);
|
= new XmlTextReader(Encoding.ASCII.GetString(data), XmlNodeType.Document, context);
|
||||||
|
|
||||||
RegionSettings currentRegionSettings = m_scene.RegionInfo.RegionSettings;
|
RegionSettings currentRegionSettings = m_scene.RegionInfo.RegionSettings;
|
||||||
|
|
||||||
|
|
|
@ -94,8 +94,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
public void HandleLoadOarConsoleCommand(string module, string[] cmdparams)
|
public void HandleLoadOarConsoleCommand(string module, string[] cmdparams)
|
||||||
{
|
{
|
||||||
bool mergeOar = false;
|
bool mergeOar = false;
|
||||||
|
bool skipAssets = false;
|
||||||
|
|
||||||
OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; });
|
OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; });
|
||||||
|
options.Add("s|skip-assets", delegate (string v) { skipAssets = v != null; });
|
||||||
|
|
||||||
List<string> mainParams = options.Parse(cmdparams);
|
List<string> mainParams = options.Parse(cmdparams);
|
||||||
|
|
||||||
// m_log.DebugFormat("MERGE OAR IS [{0}]", mergeOar);
|
// m_log.DebugFormat("MERGE OAR IS [{0}]", mergeOar);
|
||||||
|
@ -105,11 +108,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
|
|
||||||
if (mainParams.Count > 2)
|
if (mainParams.Count > 2)
|
||||||
{
|
{
|
||||||
DearchiveRegion(mainParams[2], mergeOar, Guid.Empty);
|
DearchiveRegion(mainParams[2], mergeOar, skipAssets, Guid.Empty);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, Guid.Empty);
|
DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, skipAssets, Guid.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,25 +157,25 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
|
|
||||||
public void DearchiveRegion(string loadPath)
|
public void DearchiveRegion(string loadPath)
|
||||||
{
|
{
|
||||||
DearchiveRegion(loadPath, false, Guid.Empty);
|
DearchiveRegion(loadPath, false, false, Guid.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DearchiveRegion(string loadPath, bool merge, Guid requestId)
|
public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat(
|
m_log.InfoFormat(
|
||||||
"[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath);
|
"[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath);
|
||||||
|
|
||||||
new ArchiveReadRequest(m_scene, loadPath, merge, requestId).DearchiveRegion();
|
new ArchiveReadRequest(m_scene, loadPath, merge, skipAssets, requestId).DearchiveRegion();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DearchiveRegion(Stream loadStream)
|
public void DearchiveRegion(Stream loadStream)
|
||||||
{
|
{
|
||||||
DearchiveRegion(loadStream, false, Guid.Empty);
|
DearchiveRegion(loadStream, false, false, Guid.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DearchiveRegion(Stream loadStream, bool merge, Guid requestId)
|
public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId)
|
||||||
{
|
{
|
||||||
new ArchiveReadRequest(m_scene, loadStream, merge, requestId).DearchiveRegion();
|
new ArchiveReadRequest(m_scene, loadStream, merge, skipAssets, requestId).DearchiveRegion();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -442,7 +442,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
|
||||||
byte[] archive = archiveWriteStream.ToArray();
|
byte[] archive = archiveWriteStream.ToArray();
|
||||||
MemoryStream archiveReadStream = new MemoryStream(archive);
|
MemoryStream archiveReadStream = new MemoryStream(archive);
|
||||||
|
|
||||||
m_archiverModule.DearchiveRegion(archiveReadStream, true, Guid.Empty);
|
m_archiverModule.DearchiveRegion(archiveReadStream, true, false, Guid.Empty);
|
||||||
|
|
||||||
SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name);
|
SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name);
|
||||||
Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge");
|
Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge");
|
||||||
|
|
|
@ -162,7 +162,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
private Dictionary<string, bool> GrantVB = new Dictionary<string, bool>();
|
private Dictionary<string, bool> GrantVB = new Dictionary<string, bool>();
|
||||||
private Dictionary<string, bool> GrantJS = new Dictionary<string, bool>();
|
private Dictionary<string, bool> GrantJS = new Dictionary<string, bool>();
|
||||||
private Dictionary<string, bool> GrantYP = new Dictionary<string, bool>();
|
private Dictionary<string, bool> GrantYP = new Dictionary<string, bool>();
|
||||||
private IFriendsModule m_friendsModule = null;
|
private IFriendsModule m_friendsModule;
|
||||||
|
private IGroupsModule m_groupsModule;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -386,9 +387,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
m_friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
|
m_friendsModule = m_scene.RequestModuleInterface<IFriendsModule>();
|
||||||
|
|
||||||
if (m_friendsModule == null)
|
if (m_friendsModule == null)
|
||||||
m_log.Error("[PERMISSIONS]: Friends module not found, friend permissions will not work");
|
m_log.Warn("[PERMISSIONS]: Friends module not found, friend permissions will not work");
|
||||||
else
|
|
||||||
m_log.Info("[PERMISSIONS]: Friends module found, friend permissions enabled");
|
m_groupsModule = m_scene.RequestModuleInterface<IGroupsModule>();
|
||||||
|
|
||||||
|
if (m_groupsModule == null)
|
||||||
|
m_log.Warn("[PERMISSIONS]: Groups module not found, group permissions will not work");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
|
@ -423,14 +427,17 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
// with the powers requested (powers = 0 for no powers check)
|
// with the powers requested (powers = 0 for no powers check)
|
||||||
protected bool IsGroupMember(UUID groupID, UUID userID, ulong powers)
|
protected bool IsGroupMember(UUID groupID, UUID userID, ulong powers)
|
||||||
{
|
{
|
||||||
ScenePresence sp = m_scene.GetScenePresence(userID);
|
if (null == m_groupsModule)
|
||||||
if (sp != null)
|
return false;
|
||||||
{
|
|
||||||
IClientAPI client = sp.ControllingClient;
|
|
||||||
|
|
||||||
return ((groupID == client.ActiveGroupId) && (client.ActiveGroupPowers != 0) &&
|
GroupMembershipData gmd = m_groupsModule.GetMembershipData(groupID, userID);
|
||||||
((powers == 0) || ((client.ActiveGroupPowers & powers) == powers)));
|
|
||||||
|
if (gmd != null)
|
||||||
|
{
|
||||||
|
if (((gmd.GroupPowers != 0) && powers == 0) || (gmd.GroupPowers & powers) == powers)
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -721,8 +728,17 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
permission = false;
|
permission = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[PERMISSIONS]: group.GroupID = {0}, part.GroupMask = {1}, isGroupMember = {2} for {3}",
|
||||||
|
// group.GroupID,
|
||||||
|
// m_scene.GetSceneObjectPart(objId).GroupMask,
|
||||||
|
// IsGroupMember(group.GroupID, currentUser, 0),
|
||||||
|
// currentUser);
|
||||||
|
|
||||||
// Group members should be able to edit group objects
|
// Group members should be able to edit group objects
|
||||||
if ((group.GroupID != UUID.Zero) && ((m_scene.GetSceneObjectPart(objId).GroupMask & (uint)PermissionMask.Modify) != 0) && IsGroupMember(group.GroupID, currentUser, 0))
|
if ((group.GroupID != UUID.Zero)
|
||||||
|
&& ((m_scene.GetSceneObjectPart(objId).GroupMask & (uint)PermissionMask.Modify) != 0)
|
||||||
|
&& IsGroupMember(group.GroupID, currentUser, 0))
|
||||||
{
|
{
|
||||||
// Return immediately, so that the administrator can shares group objects
|
// Return immediately, so that the administrator can shares group objects
|
||||||
return true;
|
return true;
|
||||||
|
@ -957,7 +973,6 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
||||||
if (m_bypassPermissions) return m_bypassPermissionsValue;
|
if (m_bypassPermissions) return m_bypassPermissionsValue;
|
||||||
|
|
||||||
|
|
||||||
return GenericObjectPermission(editorID, objectID, false);
|
return GenericObjectPermission(editorID, objectID, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,7 +1079,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
|
|
||||||
if ((part.GroupMask & (uint)PermissionMask.Modify) == 0)
|
if ((part.GroupMask & (uint)PermissionMask.Modify) == 0)
|
||||||
return false;
|
return false;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1585,7 +1602,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
|
|
||||||
if ((part.GroupMask & (uint)PermissionMask.Modify) == 0)
|
if ((part.GroupMask & (uint)PermissionMask.Modify) == 0)
|
||||||
return false;
|
return false;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1840,7 +1859,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
return GenericObjectPermission(agentID, prim, false);
|
return GenericObjectPermission(agentID, prim, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CanCompileScript(UUID ownerUUID, int scriptType, Scene scene) {
|
private bool CanCompileScript(UUID ownerUUID, int scriptType, Scene scene)
|
||||||
|
{
|
||||||
//m_log.DebugFormat("check if {0} is allowed to compile {1}", ownerUUID, scriptType);
|
//m_log.DebugFormat("check if {0} is allowed to compile {1}", ownerUUID, scriptType);
|
||||||
switch (scriptType) {
|
switch (scriptType) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -94,7 +94,7 @@ namespace OpenSim.Region.DataSnapshot
|
||||||
if (!m_configLoaded)
|
if (!m_configLoaded)
|
||||||
{
|
{
|
||||||
m_configLoaded = true;
|
m_configLoaded = true;
|
||||||
m_log.Info("[DATASNAPSHOT]: Loading configuration");
|
//m_log.Debug("[DATASNAPSHOT]: Loading configuration");
|
||||||
//Read from the config for options
|
//Read from the config for options
|
||||||
lock (m_syncInit)
|
lock (m_syncInit)
|
||||||
{
|
{
|
||||||
|
@ -123,7 +123,7 @@ namespace OpenSim.Region.DataSnapshot
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
m_log.Info("[DATASNAPSHOT]: Could not load configuration. DataSnapshot will be disabled.");
|
m_log.Warn("[DATASNAPSHOT]: Could not load configuration. DataSnapshot will be disabled.");
|
||||||
m_enabled = false;
|
m_enabled = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,7 @@ namespace OpenSim.Region.DataSnapshot
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.Warn("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else).");
|
//m_log.Debug("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else).");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,7 @@ namespace OpenSim.Region.Examples.SimpleModule
|
||||||
public event Action<UUID> OnRemoveAvatar;
|
public event Action<UUID> OnRemoveAvatar;
|
||||||
|
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem;
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder;
|
public event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.Packets;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
|
@ -81,6 +82,34 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
UUID RezSingleAttachmentFromInventory(
|
UUID RezSingleAttachmentFromInventory(
|
||||||
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus);
|
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rez multiple attachments from a user's inventory
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
/// <param name="header"></param>
|
||||||
|
/// <param name="objects"></param>
|
||||||
|
void RezMultipleAttachmentsFromInventory(
|
||||||
|
IClientAPI remoteClient,
|
||||||
|
RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
|
||||||
|
RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Detach an object from the avatar.
|
||||||
|
/// </summary>
|
||||||
|
///
|
||||||
|
/// This method is called in response to a client's detach request, so we only update the information in
|
||||||
|
/// inventory
|
||||||
|
/// <param name="objectLocalID"></param>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
void DetachObject(uint objectLocalID, IClientAPI remoteClient);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Detach the given item to the ground.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="itemID"></param>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the user inventory to the attachment of an item
|
/// Update the user inventory to the attachment of an item
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -74,6 +74,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource);
|
void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource);
|
||||||
|
|
||||||
ArrayList GetScriptErrors(UUID itemID);
|
ArrayList GetScriptErrors(UUID itemID);
|
||||||
|
void ResumeScripts();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Stop all the scripts in this entity.
|
/// Stop all the scripts in this entity.
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* 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 OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Framework.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provide mechanisms for messaging groups.
|
||||||
|
/// </summary>
|
||||||
|
///
|
||||||
|
/// TODO: Provide a mechanism for receiving group messages as well as sending them
|
||||||
|
///
|
||||||
|
public interface IGroupsMessagingModule
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Start a group chat session.
|
||||||
|
/// </summary>
|
||||||
|
/// You must call this before calling SendMessageToGroup(). If a chat session for this group is already taking
|
||||||
|
/// place then the agent will added to that session.
|
||||||
|
/// <param name="agentID">
|
||||||
|
/// A UUID that represents the agent being added. If you are agentless (e.g. you are
|
||||||
|
/// a region module), then you can use any random ID.
|
||||||
|
/// </param>
|
||||||
|
/// <param name="groupID">
|
||||||
|
/// The ID for the group to join. Currently, the session ID used is identical to the
|
||||||
|
/// group ID.
|
||||||
|
/// </param>
|
||||||
|
/// <returns>
|
||||||
|
/// True if the chat session was started successfully, false otherwise.
|
||||||
|
/// </returns>
|
||||||
|
bool StartGroupChatSession(UUID agentID, UUID groupID);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send a message to an entire group.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="im">
|
||||||
|
/// The message itself. The fields that must be populated are
|
||||||
|
///
|
||||||
|
/// imSessionID - Populate this with the group ID (session ID and group ID are currently identical)
|
||||||
|
/// fromAgentName - Populate this with whatever arbitrary name you want to show up in the chat dialog
|
||||||
|
/// message - The message itself
|
||||||
|
/// dialog - This must be (byte)InstantMessageDialog.SessionSend
|
||||||
|
/// </param>
|
||||||
|
/// <param name="groupID"></param>
|
||||||
|
void SendMessageToGroup(GridInstantMessage im, UUID groupID);
|
||||||
|
}
|
||||||
|
}
|
|
@ -90,8 +90,12 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
/// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region
|
/// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region
|
||||||
/// settings in the archive will be ignored.
|
/// settings in the archive will be ignored.
|
||||||
/// </param>
|
/// </param>
|
||||||
|
/// <param name="skipAssets">
|
||||||
|
/// If true, the archive is loaded without loading any assets contained within it. This is useful if the
|
||||||
|
/// assets are already known to be present in the grid's asset service.
|
||||||
|
/// </param>
|
||||||
/// <param name="requestId">If supplied, this request Id is later returned in the saved event</param>
|
/// <param name="requestId">If supplied, this request Id is later returned in the saved event</param>
|
||||||
void DearchiveRegion(string loadPath, bool merge, Guid requestId);
|
void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Dearchive a region from a stream. This replaces the existing scene.
|
/// Dearchive a region from a stream. This replaces the existing scene.
|
||||||
|
@ -113,7 +117,11 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
/// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region
|
/// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region
|
||||||
/// settings in the archive will be ignored.
|
/// settings in the archive will be ignored.
|
||||||
/// </param>
|
/// </param>
|
||||||
|
/// <param name="skipAssets">
|
||||||
|
/// If true, the archive is loaded without loading any assets contained within it. This is useful if the
|
||||||
|
/// assets are already known to be present in the grid's asset service.
|
||||||
|
/// </param
|
||||||
/// <param name="requestId">If supplied, this request Id is later returned in the saved event</param>
|
/// <param name="requestId">If supplied, this request Id is later returned in the saved event</param>
|
||||||
void DearchiveRegion(Stream loadStream, bool merge, Guid requestId);
|
void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,14 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
bool PostScriptEvent(UUID itemID, string name, Object[] args);
|
bool PostScriptEvent(UUID itemID, string name, Object[] args);
|
||||||
bool PostObjectEvent(UUID itemID, string name, Object[] args);
|
bool PostObjectEvent(UUID itemID, string name, Object[] args);
|
||||||
|
|
||||||
|
// Suspend ALL scripts in a given scene object. The item ID
|
||||||
|
// is the UUID of a SOG, and the method acts on all contained
|
||||||
|
// scripts. This is different from the suspend/resume that
|
||||||
|
// can be issued by a client.
|
||||||
|
//
|
||||||
|
void SuspendScript(UUID itemID);
|
||||||
|
void ResumeScript(UUID itemID);
|
||||||
|
|
||||||
ArrayList GetScriptErrors(UUID itemID);
|
ArrayList GetScriptErrors(UUID itemID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -419,11 +419,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||||
if (m_scenePresence.IsChildAgent)
|
if (m_scenePresence.IsChildAgent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_scenePresence.Scene.ForEachScenePresence(
|
UUID[] animIDs;
|
||||||
delegate(ScenePresence SP)
|
int[] sequenceNums;
|
||||||
{
|
UUID[] objectIDs;
|
||||||
SP.Animator.SendAnimPack();
|
|
||||||
});
|
m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
|
||||||
|
client.SendAnimations(animIDs, sequenceNums, m_scenePresence.ControllingClient.AgentId, objectIDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -35,7 +35,6 @@ using OpenMetaverse;
|
||||||
using OpenMetaverse.Packets;
|
using OpenMetaverse.Packets;
|
||||||
using log4net;
|
using log4net;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
|
||||||
using OpenSim.Region.Framework;
|
using OpenSim.Region.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
|
@ -64,6 +63,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (group is SceneObjectGroup)
|
if (group is SceneObjectGroup)
|
||||||
{
|
{
|
||||||
((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
|
((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
|
||||||
|
((SceneObjectGroup) group).ResumeScripts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
// Update item with new asset
|
// Update item with new asset
|
||||||
item.AssetID = asset.FullID;
|
item.AssetID = asset.FullID;
|
||||||
group.UpdateInventoryItem(item);
|
if (group.UpdateInventoryItem(item))
|
||||||
|
remoteClient.SendAgentAlertMessage("Notecard saved", false);
|
||||||
|
|
||||||
part.GetProperties(remoteClient);
|
part.GetProperties(remoteClient);
|
||||||
|
|
||||||
// Trigger rerunning of script (use TriggerRezScript event, see RezScript)
|
// Trigger rerunning of script (use TriggerRezScript event, see RezScript)
|
||||||
|
@ -219,6 +221,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
remoteClient.SendAgentAlertMessage("Script saved", false);
|
remoteClient.SendAgentAlertMessage("Script saved", false);
|
||||||
}
|
}
|
||||||
|
part.ParentGroup.ResumeScripts();
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -472,7 +475,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (recipientParentFolderId == UUID.Zero)
|
if (recipientParentFolderId == UUID.Zero)
|
||||||
{
|
{
|
||||||
InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId);
|
InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId);
|
||||||
|
@ -722,6 +724,37 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HandleLinkInventoryItem(IClientAPI remoteClient, UUID transActionID, UUID folderID,
|
||||||
|
uint callbackID, string description, string name,
|
||||||
|
sbyte invType, sbyte type, UUID olditemID)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item link {0} in folder {1} pointing to {2}", name, folderID, olditemID);
|
||||||
|
|
||||||
|
if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ScenePresence presence;
|
||||||
|
if (TryGetScenePresence(remoteClient.AgentId, out presence))
|
||||||
|
{
|
||||||
|
byte[] data = null;
|
||||||
|
|
||||||
|
AssetBase asset = new AssetBase();
|
||||||
|
asset.FullID = olditemID;
|
||||||
|
asset.Type = type;
|
||||||
|
asset.Name = name;
|
||||||
|
asset.Description = description;
|
||||||
|
|
||||||
|
CreateNewInventoryItem(remoteClient, remoteClient.AgentId.ToString(), folderID, name, 0, callbackID, asset, invType, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch());
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"ScenePresence for agent uuid {0} unexpectedly not found in HandleLinkInventoryItem",
|
||||||
|
remoteClient.AgentId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Remove an inventory item for the client's inventory
|
/// Remove an inventory item for the client's inventory
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1160,6 +1193,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
item = LibraryService.LibraryRootFolder.FindItem(itemID);
|
item = LibraryService.LibraryRootFolder.FindItem(itemID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we've found the item in the user's inventory or in the library
|
||||||
if (item != null)
|
if (item != null)
|
||||||
{
|
{
|
||||||
part.ParentGroup.AddInventoryItem(remoteClient, primLocalID, item, copyID);
|
part.ParentGroup.AddInventoryItem(remoteClient, primLocalID, item, copyID);
|
||||||
|
@ -1194,9 +1228,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
remoteClient, part, transactionID, currentItem);
|
remoteClient, part, transactionID, currentItem);
|
||||||
}
|
}
|
||||||
if (part.Inventory.UpdateInventoryItem(itemInfo))
|
if (part.Inventory.UpdateInventoryItem(itemInfo))
|
||||||
|
{
|
||||||
|
remoteClient.SendAgentAlertMessage("Notecard saved", false);
|
||||||
part.GetProperties(remoteClient);
|
part.GetProperties(remoteClient);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.WarnFormat(
|
m_log.WarnFormat(
|
||||||
|
@ -1246,6 +1283,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// "Rezzed script {0} into prim local ID {1} for user {2}",
|
// "Rezzed script {0} into prim local ID {1} for user {2}",
|
||||||
// item.inventoryName, localID, remoteClient.Name);
|
// item.inventoryName, localID, remoteClient.Name);
|
||||||
part.GetProperties(remoteClient);
|
part.GetProperties(remoteClient);
|
||||||
|
part.ParentGroup.ResumeScripts();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1315,6 +1353,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
part.GetProperties(remoteClient);
|
part.GetProperties(remoteClient);
|
||||||
|
|
||||||
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
|
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
|
||||||
|
part.ParentGroup.ResumeScripts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1418,6 +1457,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
destPart.Inventory.CreateScriptInstance(destTaskItem, start_param, false, DefaultScriptEngine, 0);
|
destPart.Inventory.CreateScriptInstance(destTaskItem, start_param, false, DefaultScriptEngine, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
destPart.ParentGroup.ResumeScripts();
|
||||||
|
|
||||||
ScenePresence avatar;
|
ScenePresence avatar;
|
||||||
|
|
||||||
if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar))
|
if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar))
|
||||||
|
@ -1838,50 +1879,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
EventManager.TriggerStopScript(part.LocalId, itemID);
|
EventManager.TriggerStopScript(part.LocalId, itemID);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void SendAttachEvent(uint localID, UUID itemID, UUID avatarID)
|
|
||||||
{
|
|
||||||
EventManager.TriggerOnAttach(localID, itemID, avatarID);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
|
|
||||||
RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
|
|
||||||
{
|
|
||||||
foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
|
|
||||||
{
|
|
||||||
AttachmentsModule.RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient)
|
|
||||||
{
|
|
||||||
SceneObjectPart part = GetSceneObjectPart(itemID);
|
|
||||||
if (part == null || part.ParentGroup == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
UUID inventoryID = part.ParentGroup.GetFromItemID();
|
|
||||||
|
|
||||||
ScenePresence presence;
|
|
||||||
if (TryGetScenePresence(remoteClient.AgentId, out presence))
|
|
||||||
{
|
|
||||||
if (!Permissions.CanRezObject(part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition))
|
|
||||||
return;
|
|
||||||
|
|
||||||
presence.Appearance.DetachAttachment(itemID);
|
|
||||||
IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>();
|
|
||||||
if (ava != null)
|
|
||||||
{
|
|
||||||
ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
|
|
||||||
}
|
|
||||||
part.ParentGroup.DetachToGround();
|
|
||||||
|
|
||||||
List<UUID> uuids = new List<UUID>();
|
|
||||||
uuids.Add(inventoryID);
|
|
||||||
InventoryService.DeleteItems(remoteClient.AgentId, uuids);
|
|
||||||
remoteClient.SendRemoveInventoryItem(inventoryID);
|
|
||||||
}
|
|
||||||
SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
|
public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
|
||||||
{
|
{
|
||||||
EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID);
|
EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID);
|
||||||
|
|
|
@ -1131,7 +1131,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (m_scripts_enabled != !ScriptEngine)
|
if (m_scripts_enabled != !ScriptEngine)
|
||||||
{
|
{
|
||||||
// Tedd! Here's the method to disable the scripting engine!
|
|
||||||
if (ScriptEngine)
|
if (ScriptEngine)
|
||||||
{
|
{
|
||||||
m_log.Info("Stopping all Scripts in Scene");
|
m_log.Info("Stopping all Scripts in Scene");
|
||||||
|
@ -1153,6 +1152,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (ent is SceneObjectGroup)
|
if (ent is SceneObjectGroup)
|
||||||
{
|
{
|
||||||
((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
|
((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
|
||||||
|
((SceneObjectGroup)ent).ResumeScripts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2749,6 +2749,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public virtual void SubscribeToClientInventoryEvents(IClientAPI client)
|
public virtual void SubscribeToClientInventoryEvents(IClientAPI client)
|
||||||
{
|
{
|
||||||
client.OnCreateNewInventoryItem += CreateNewInventoryItem;
|
client.OnCreateNewInventoryItem += CreateNewInventoryItem;
|
||||||
|
client.OnLinkInventoryItem += HandleLinkInventoryItem;
|
||||||
client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder;
|
client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder;
|
||||||
client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder;
|
client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder;
|
||||||
client.OnMoveInventoryFolder += HandleMoveInventoryFolder; // 2; //!!
|
client.OnMoveInventoryFolder += HandleMoveInventoryFolder; // 2; //!!
|
||||||
|
@ -2769,13 +2770,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public virtual void SubscribeToClientAttachmentEvents(IClientAPI client)
|
public virtual void SubscribeToClientAttachmentEvents(IClientAPI client)
|
||||||
{
|
{
|
||||||
client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;
|
|
||||||
client.OnObjectDetach += m_sceneGraph.DetachObject;
|
|
||||||
|
|
||||||
if (AttachmentsModule != null)
|
if (AttachmentsModule != null)
|
||||||
{
|
{
|
||||||
client.OnRezSingleAttachmentFromInv += AttachmentsModule.RezSingleAttachmentFromInventory;
|
client.OnRezSingleAttachmentFromInv += AttachmentsModule.RezSingleAttachmentFromInventory;
|
||||||
|
client.OnRezMultipleAttachmentsFromInv += AttachmentsModule.RezMultipleAttachmentsFromInventory;
|
||||||
client.OnObjectAttach += AttachmentsModule.AttachObject;
|
client.OnObjectAttach += AttachmentsModule.AttachObject;
|
||||||
|
client.OnObjectDetach += AttachmentsModule.DetachObject;
|
||||||
client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory;
|
client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2925,13 +2925,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client)
|
public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client)
|
||||||
{
|
{
|
||||||
client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments;
|
|
||||||
client.OnObjectDetach -= m_sceneGraph.DetachObject;
|
|
||||||
|
|
||||||
if (AttachmentsModule != null)
|
if (AttachmentsModule != null)
|
||||||
{
|
{
|
||||||
client.OnRezSingleAttachmentFromInv -= AttachmentsModule.RezSingleAttachmentFromInventory;
|
client.OnRezSingleAttachmentFromInv -= AttachmentsModule.RezSingleAttachmentFromInventory;
|
||||||
|
client.OnRezMultipleAttachmentsFromInv -= AttachmentsModule.RezMultipleAttachmentsFromInventory;
|
||||||
client.OnObjectAttach -= AttachmentsModule.AttachObject;
|
client.OnObjectAttach -= AttachmentsModule.AttachObject;
|
||||||
|
client.OnObjectDetach -= AttachmentsModule.DetachObject;
|
||||||
client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory;
|
client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -443,9 +443,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
SceneObjectGroup group = GetGroupByPrim(objectLocalID);
|
SceneObjectGroup group = GetGroupByPrim(objectLocalID);
|
||||||
if (group != null)
|
if (group != null)
|
||||||
{
|
m_parentScene.AttachmentsModule.DetachSingleAttachmentToGround(group.UUID, remoteClient);
|
||||||
m_parentScene.DetachSingleAttachmentToGround(group.UUID, remoteClient);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal void DetachObject(uint objectLocalID, IClientAPI remoteClient)
|
protected internal void DetachObject(uint objectLocalID, IClientAPI remoteClient)
|
||||||
|
@ -1757,6 +1755,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0);
|
copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0);
|
||||||
copy.HasGroupChanged = true;
|
copy.HasGroupChanged = true;
|
||||||
copy.ScheduleGroupForFullUpdate();
|
copy.ScheduleGroupForFullUpdate();
|
||||||
|
copy.ResumeScripts();
|
||||||
|
|
||||||
// required for physics to update it's position
|
// required for physics to update it's position
|
||||||
copy.AbsolutePosition = copy.AbsolutePosition;
|
copy.AbsolutePosition = copy.AbsolutePosition;
|
||||||
|
|
|
@ -173,7 +173,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
item.NextPermissions;
|
item.NextPermissions;
|
||||||
taskItem.NextPermissions = item.NextPermissions;
|
taskItem.NextPermissions = item.NextPermissions;
|
||||||
taskItem.CurrentPermissions |= 8;
|
taskItem.CurrentPermissions |= 8;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
taskItem.BasePermissions = item.BasePermissions;
|
taskItem.BasePermissions = item.BasePermissions;
|
||||||
taskItem.CurrentPermissions = item.CurrentPermissions;
|
taskItem.CurrentPermissions = item.CurrentPermissions;
|
||||||
taskItem.CurrentPermissions |= 8;
|
taskItem.CurrentPermissions |= 8;
|
||||||
|
@ -414,5 +416,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
scriptModule.SetXMLState(itemID, n.OuterXml);
|
scriptModule.SetXMLState(itemID, n.OuterXml);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ResumeScripts()
|
||||||
|
{
|
||||||
|
foreach (SceneObjectPart part in m_parts.Values)
|
||||||
|
{
|
||||||
|
part.Inventory.ResumeScripts();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -282,9 +282,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_part.ParentGroup.Scene.AssetService.Get(
|
AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString());
|
||||||
item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset)
|
|
||||||
{
|
|
||||||
if (null == asset)
|
if (null == asset)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
|
@ -311,8 +309,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_part.ScheduleFullUpdate();
|
m_part.ScheduleFullUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RestoreSavedScriptState(UUID oldID, UUID newID)
|
private void RestoreSavedScriptState(UUID oldID, UUID newID)
|
||||||
|
@ -527,6 +523,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
item.ParentID = m_part.UUID;
|
item.ParentID = m_part.UUID;
|
||||||
item.ParentPartID = m_part.UUID;
|
item.ParentPartID = m_part.UUID;
|
||||||
item.Name = name;
|
item.Name = name;
|
||||||
|
item.GroupID = m_part.GroupID;
|
||||||
|
|
||||||
lock (m_items)
|
lock (m_items)
|
||||||
{
|
{
|
||||||
|
@ -619,20 +616,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
item.ParentID = m_part.UUID;
|
item.ParentID = m_part.UUID;
|
||||||
item.ParentPartID = m_part.UUID;
|
item.ParentPartID = m_part.UUID;
|
||||||
item.Flags = m_items[item.ItemID].Flags;
|
item.Flags = m_items[item.ItemID].Flags;
|
||||||
|
|
||||||
|
// If group permissions have been set on, check that the groupID is up to date in case it has
|
||||||
|
// changed since permissions were last set.
|
||||||
|
if (item.GroupPermissions != (uint)PermissionMask.None)
|
||||||
|
item.GroupID = m_part.GroupID;
|
||||||
|
|
||||||
if (item.AssetID == UUID.Zero)
|
if (item.AssetID == UUID.Zero)
|
||||||
{
|
{
|
||||||
item.AssetID = m_items[item.ItemID].AssetID;
|
item.AssetID = m_items[item.ItemID].AssetID;
|
||||||
}
|
}
|
||||||
else if ((InventoryType)item.Type == InventoryType.Notecard)
|
|
||||||
{
|
|
||||||
ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID);
|
|
||||||
|
|
||||||
if (presence != null)
|
|
||||||
{
|
|
||||||
presence.ControllingClient.SendAgentAlertMessage(
|
|
||||||
"Notecard saved", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_items[item.ItemID] = item;
|
m_items[item.ItemID] = item;
|
||||||
m_inventorySerial++;
|
m_inventorySerial++;
|
||||||
|
@ -770,6 +763,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
uint everyoneMask = 0;
|
uint everyoneMask = 0;
|
||||||
uint baseMask = item.BasePermissions;
|
uint baseMask = item.BasePermissions;
|
||||||
uint ownerMask = item.CurrentPermissions;
|
uint ownerMask = item.CurrentPermissions;
|
||||||
|
uint groupMask = item.GroupPermissions;
|
||||||
|
|
||||||
invString.AddItemStart();
|
invString.AddItemStart();
|
||||||
invString.AddNameValueLine("item_id", item.ItemID.ToString());
|
invString.AddNameValueLine("item_id", item.ItemID.ToString());
|
||||||
|
@ -779,7 +773,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
|
invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
|
||||||
invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
|
invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
|
||||||
invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0));
|
invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask));
|
||||||
invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
|
invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
|
||||||
invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
|
invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
|
||||||
|
|
||||||
|
@ -1034,5 +1028,28 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ResumeScripts()
|
||||||
|
{
|
||||||
|
IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
|
||||||
|
if (engines == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
lock (m_items)
|
||||||
|
{
|
||||||
|
foreach (TaskInventoryItem item in m_items.Values)
|
||||||
|
{
|
||||||
|
if (item.InvType == (int)InventoryType.LSL)
|
||||||
|
{
|
||||||
|
foreach (IScriptModule engine in engines)
|
||||||
|
{
|
||||||
|
if (engine != null)
|
||||||
|
engine.ResumeScript(item.ItemID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -912,6 +912,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
m_isChildAgent = false;
|
m_isChildAgent = false;
|
||||||
|
|
||||||
|
// send the animations of the other presences to me
|
||||||
m_scene.ForEachScenePresence(delegate(ScenePresence presence)
|
m_scene.ForEachScenePresence(delegate(ScenePresence presence)
|
||||||
{
|
{
|
||||||
if (presence != this)
|
if (presence != this)
|
||||||
|
|
|
@ -182,6 +182,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
foreach (SceneObjectGroup sceneObject in sceneObjects)
|
foreach (SceneObjectGroup sceneObject in sceneObjects)
|
||||||
{
|
{
|
||||||
sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine, 0);
|
sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine, 0);
|
||||||
|
sceneObject.ResumeScripts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -724,6 +724,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
||||||
public event Action<UUID> OnRemoveAvatar;
|
public event Action<UUID> OnRemoveAvatar;
|
||||||
public event ObjectPermissions OnObjectPermissions;
|
public event ObjectPermissions OnObjectPermissions;
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem;
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder;
|
public event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
|
|
@ -109,7 +109,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[IRC-Bridge] Not enabled. Connect for region {0} ignored", scene.RegionInfo.RegionName);
|
//m_log.DebugFormat("[IRC-Bridge] Not enabled. Connect for region {0} ignored", scene.RegionInfo.RegionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,41 +28,30 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
|
|
||||||
using log4net;
|
using log4net;
|
||||||
using Mono.Addins;
|
using Mono.Addins;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
|
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.CoreModules.Framework.EventQueue;
|
using OpenSim.Region.CoreModules.Framework.EventQueue;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
|
|
||||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||||
|
|
||||||
namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||||
public class GroupsMessagingModule : ISharedRegionModule
|
public class GroupsMessagingModule : ISharedRegionModule, IGroupsMessagingModule
|
||||||
{
|
{
|
||||||
|
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private List<Scene> m_sceneList = new List<Scene>();
|
private List<Scene> m_sceneList = new List<Scene>();
|
||||||
|
|
||||||
private IMessageTransferModule m_msgTransferModule = null;
|
private IMessageTransferModule m_msgTransferModule = null;
|
||||||
|
|
||||||
private IGroupsModule m_groupsModule = null;
|
private IGroupsServicesConnector m_groupData = null;
|
||||||
|
|
||||||
// TODO: Move this off to the Groups Server
|
|
||||||
public Dictionary<Guid, List<Guid>> m_agentsInGroupSession = new Dictionary<Guid, List<Guid>>();
|
|
||||||
public Dictionary<Guid, List<Guid>> m_agentsDroppedSession = new Dictionary<Guid, List<Guid>>();
|
|
||||||
|
|
||||||
|
|
||||||
// Config Options
|
// Config Options
|
||||||
private bool m_groupMessagingEnabled = false;
|
private bool m_groupMessagingEnabled = false;
|
||||||
|
@ -108,8 +97,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
public void AddRegion(Scene scene)
|
public void AddRegion(Scene scene)
|
||||||
{
|
{
|
||||||
// NoOp
|
if (!m_groupMessagingEnabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
scene.RegisterModuleInterface<IGroupsMessagingModule>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
{
|
{
|
||||||
if (!m_groupMessagingEnabled)
|
if (!m_groupMessagingEnabled)
|
||||||
|
@ -117,12 +110,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
m_groupsModule = scene.RequestModuleInterface<IGroupsModule>();
|
m_groupData = scene.RequestModuleInterface<IGroupsServicesConnector>();
|
||||||
|
|
||||||
// No groups module, no groups messaging
|
// No groups module, no groups messaging
|
||||||
if (m_groupsModule == null)
|
if (m_groupData == null)
|
||||||
{
|
{
|
||||||
m_log.Error("[GROUPS-MESSAGING]: Could not get IGroupsModule, GroupsMessagingModule is now disabled.");
|
m_log.Error("[GROUPS-MESSAGING]: Could not get IGroupsServicesConnector, GroupsMessagingModule is now disabled.");
|
||||||
Close();
|
Close();
|
||||||
m_groupMessagingEnabled = false;
|
m_groupMessagingEnabled = false;
|
||||||
return;
|
return;
|
||||||
|
@ -144,7 +137,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
scene.EventManager.OnNewClient += OnNewClient;
|
scene.EventManager.OnNewClient += OnNewClient;
|
||||||
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
|
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
|
||||||
|
scene.EventManager.OnClientLogin += OnClientLogin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
|
@ -172,7 +165,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
m_sceneList.Clear();
|
m_sceneList.Clear();
|
||||||
|
|
||||||
m_groupsModule = null;
|
m_groupData = null;
|
||||||
m_msgTransferModule = null;
|
m_msgTransferModule = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,8 +190,84 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Not really needed, but does confirm that the group exists.
|
||||||
|
/// </summary>
|
||||||
|
public bool StartGroupChatSession(UUID agentID, UUID groupID)
|
||||||
|
{
|
||||||
|
if (m_debugEnabled)
|
||||||
|
m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
|
GroupRecord groupInfo = m_groupData.GetGroupRecord(agentID, groupID, null);
|
||||||
|
|
||||||
|
if (groupInfo != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendMessageToGroup(GridInstantMessage im, UUID groupID)
|
||||||
|
{
|
||||||
|
if (m_debugEnabled)
|
||||||
|
m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
|
|
||||||
|
foreach (GroupMembersData member in m_groupData.GetGroupMembers(UUID.Zero, groupID))
|
||||||
|
{
|
||||||
|
if (m_groupData.hasAgentDroppedGroupChatSession(member.AgentID, groupID))
|
||||||
|
{
|
||||||
|
// Don't deliver messages to people who have dropped this session
|
||||||
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy Message
|
||||||
|
GridInstantMessage msg = new GridInstantMessage();
|
||||||
|
msg.imSessionID = groupID.Guid;
|
||||||
|
msg.fromAgentName = im.fromAgentName;
|
||||||
|
msg.message = im.message;
|
||||||
|
msg.dialog = im.dialog;
|
||||||
|
msg.offline = im.offline;
|
||||||
|
msg.ParentEstateID = im.ParentEstateID;
|
||||||
|
msg.Position = im.Position;
|
||||||
|
msg.RegionID = im.RegionID;
|
||||||
|
msg.binaryBucket = im.binaryBucket;
|
||||||
|
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
||||||
|
|
||||||
|
msg.fromAgentID = im.fromAgentID;
|
||||||
|
msg.fromGroup = true;
|
||||||
|
|
||||||
|
msg.toAgentID = member.AgentID.Guid;
|
||||||
|
|
||||||
|
IClientAPI client = GetActiveClient(member.AgentID);
|
||||||
|
if (client == null)
|
||||||
|
{
|
||||||
|
// If they're not local, forward across the grid
|
||||||
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Delivering to {0} via Grid", member.AgentID);
|
||||||
|
m_msgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Deliver locally, directly
|
||||||
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Passing to ProcessMessageFromGroupSession to deliver to {0} locally", client.Name);
|
||||||
|
ProcessMessageFromGroupSession(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#region SimGridEventHandlers
|
#region SimGridEventHandlers
|
||||||
|
|
||||||
|
void OnClientLogin(IClientAPI client)
|
||||||
|
{
|
||||||
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: OnInstantMessage registered for {0}", client.Name);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void OnNewClient(IClientAPI client)
|
private void OnNewClient(IClientAPI client)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: OnInstantMessage registered for {0}", client.Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: OnInstantMessage registered for {0}", client.Name);
|
||||||
|
@ -236,42 +305,46 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Session message from {0} going to agent {1}", msg.fromAgentName, msg.toAgentID);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Session message from {0} going to agent {1}", msg.fromAgentName, msg.toAgentID);
|
||||||
|
|
||||||
|
UUID AgentID = new UUID(msg.fromAgentID);
|
||||||
|
UUID GroupID = new UUID(msg.imSessionID);
|
||||||
|
|
||||||
switch (msg.dialog)
|
switch (msg.dialog)
|
||||||
{
|
{
|
||||||
case (byte)InstantMessageDialog.SessionAdd:
|
case (byte)InstantMessageDialog.SessionAdd:
|
||||||
AddAgentToGroupSession(msg.fromAgentID, msg.imSessionID);
|
m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (byte)InstantMessageDialog.SessionDrop:
|
case (byte)InstantMessageDialog.SessionDrop:
|
||||||
RemoveAgentFromGroupSession(msg.fromAgentID, msg.imSessionID);
|
m_groupData.AgentDroppedFromGroupChatSession(AgentID, GroupID);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (byte)InstantMessageDialog.SessionSend:
|
case (byte)InstantMessageDialog.SessionSend:
|
||||||
if (!m_agentsInGroupSession.ContainsKey(msg.toAgentID)
|
if (!m_groupData.hasAgentDroppedGroupChatSession(AgentID, GroupID)
|
||||||
&& !m_agentsDroppedSession.ContainsKey(msg.toAgentID))
|
&& !m_groupData.hasAgentBeenInvitedToGroupChatSession(AgentID, GroupID)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
// Agent not in session and hasn't dropped from session
|
// Agent not in session and hasn't dropped from session
|
||||||
// Add them to the session for now, and Invite them
|
// Add them to the session for now, and Invite them
|
||||||
AddAgentToGroupSession(msg.toAgentID, msg.imSessionID);
|
m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
|
||||||
|
|
||||||
UUID toAgentID = new UUID(msg.toAgentID);
|
UUID toAgentID = new UUID(msg.toAgentID);
|
||||||
IClientAPI activeClient = GetActiveClient(toAgentID);
|
IClientAPI activeClient = GetActiveClient(toAgentID);
|
||||||
if (activeClient != null)
|
if (activeClient != null)
|
||||||
{
|
{
|
||||||
UUID groupID = new UUID(msg.fromAgentID);
|
GroupRecord groupInfo = m_groupData.GetGroupRecord(UUID.Zero, GroupID, null);
|
||||||
|
|
||||||
GroupRecord groupInfo = m_groupsModule.GetGroupRecord(groupID);
|
|
||||||
if (groupInfo != null)
|
if (groupInfo != null)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Sending chatterbox invite instant message");
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Sending chatterbox invite instant message");
|
||||||
|
|
||||||
// Force? open the group session dialog???
|
// Force? open the group session dialog???
|
||||||
|
// and simultanously deliver the message, so we don't need to do a seperate client.SendInstantMessage(msg);
|
||||||
IEventQueue eq = activeClient.Scene.RequestModuleInterface<IEventQueue>();
|
IEventQueue eq = activeClient.Scene.RequestModuleInterface<IEventQueue>();
|
||||||
eq.ChatterboxInvitation(
|
eq.ChatterboxInvitation(
|
||||||
groupID
|
GroupID
|
||||||
, groupInfo.GroupName
|
, groupInfo.GroupName
|
||||||
, new UUID(msg.fromAgentID)
|
, new UUID(msg.fromAgentID)
|
||||||
, msg.message, new UUID(msg.toAgentID)
|
, msg.message
|
||||||
|
, new UUID(msg.toAgentID)
|
||||||
, msg.fromAgentName
|
, msg.fromAgentName
|
||||||
, msg.dialog
|
, msg.dialog
|
||||||
, msg.timestamp
|
, msg.timestamp
|
||||||
|
@ -285,7 +358,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
);
|
);
|
||||||
|
|
||||||
eq.ChatterBoxSessionAgentListUpdates(
|
eq.ChatterBoxSessionAgentListUpdates(
|
||||||
new UUID(groupID)
|
new UUID(GroupID)
|
||||||
, new UUID(msg.fromAgentID)
|
, new UUID(msg.fromAgentID)
|
||||||
, new UUID(msg.toAgentID)
|
, new UUID(msg.toAgentID)
|
||||||
, false //canVoiceChat
|
, false //canVoiceChat
|
||||||
|
@ -295,7 +368,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!m_agentsDroppedSession.ContainsKey(msg.toAgentID))
|
else if (!m_groupData.hasAgentDroppedGroupChatSession(AgentID, GroupID))
|
||||||
{
|
{
|
||||||
// User hasn't dropped, so they're in the session,
|
// User hasn't dropped, so they're in the session,
|
||||||
// maybe we should deliver it.
|
// maybe we should deliver it.
|
||||||
|
@ -321,56 +394,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
#region ClientEvents
|
#region ClientEvents
|
||||||
|
|
||||||
private void RemoveAgentFromGroupSession(Guid agentID, Guid sessionID)
|
|
||||||
{
|
|
||||||
if (m_agentsInGroupSession.ContainsKey(sessionID))
|
|
||||||
{
|
|
||||||
// If in session remove
|
|
||||||
if (m_agentsInGroupSession[sessionID].Contains(agentID))
|
|
||||||
{
|
|
||||||
m_agentsInGroupSession[sessionID].Remove(agentID);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not in dropped list, add
|
|
||||||
if (!m_agentsDroppedSession[sessionID].Contains(agentID))
|
|
||||||
{
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Dropped {1} from session {0}", sessionID, agentID);
|
|
||||||
m_agentsDroppedSession[sessionID].Add(agentID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddAgentToGroupSession(Guid agentID, Guid sessionID)
|
|
||||||
{
|
|
||||||
// Add Session Status if it doesn't exist for this session
|
|
||||||
CreateGroupSessionTracking(sessionID);
|
|
||||||
|
|
||||||
// If nessesary, remove from dropped list
|
|
||||||
if (m_agentsDroppedSession[sessionID].Contains(agentID))
|
|
||||||
{
|
|
||||||
m_agentsDroppedSession[sessionID].Remove(agentID);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If nessesary, add to in session list
|
|
||||||
if (!m_agentsInGroupSession[sessionID].Contains(agentID))
|
|
||||||
{
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Added {1} to session {0}", sessionID, agentID);
|
|
||||||
m_agentsInGroupSession[sessionID].Add(agentID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CreateGroupSessionTracking(Guid sessionID)
|
|
||||||
{
|
|
||||||
if (!m_agentsInGroupSession.ContainsKey(sessionID))
|
|
||||||
{
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Creating session tracking for : {0}", sessionID);
|
|
||||||
m_agentsInGroupSession.Add(sessionID, new List<Guid>());
|
|
||||||
m_agentsDroppedSession.Add(sessionID, new List<Guid>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
|
private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled)
|
if (m_debugEnabled)
|
||||||
|
@ -383,21 +408,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
// Start group IM session
|
// Start group IM session
|
||||||
if ((im.dialog == (byte)InstantMessageDialog.SessionGroupStart))
|
if ((im.dialog == (byte)InstantMessageDialog.SessionGroupStart))
|
||||||
{
|
{
|
||||||
UUID groupID = new UUID(im.toAgentID);
|
if (m_debugEnabled) m_log.InfoFormat("[GROUPS-MESSAGING]: imSessionID({0}) toAgentID({1})", im.imSessionID, im.toAgentID);
|
||||||
|
|
||||||
|
UUID GroupID = new UUID(im.imSessionID);
|
||||||
|
UUID AgentID = new UUID(im.fromAgentID);
|
||||||
|
|
||||||
|
GroupRecord groupInfo = m_groupData.GetGroupRecord(UUID.Zero, GroupID, null);
|
||||||
|
|
||||||
GroupRecord groupInfo = m_groupsModule.GetGroupRecord(groupID);
|
|
||||||
if (groupInfo != null)
|
if (groupInfo != null)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Start Group Session for {0}", groupInfo.GroupName);
|
m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
|
||||||
|
|
||||||
AddAgentToGroupSession(im.fromAgentID, im.imSessionID);
|
ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, GroupID);
|
||||||
|
|
||||||
ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, groupID);
|
|
||||||
|
|
||||||
IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
|
IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
|
||||||
queue.ChatterBoxSessionAgentListUpdates(
|
queue.ChatterBoxSessionAgentListUpdates(
|
||||||
new UUID(groupID)
|
GroupID
|
||||||
, new UUID(im.fromAgentID)
|
, AgentID
|
||||||
, new UUID(im.toAgentID)
|
, new UUID(im.toAgentID)
|
||||||
, false //canVoiceChat
|
, false //canVoiceChat
|
||||||
, false //isModerator
|
, false //isModerator
|
||||||
|
@ -409,64 +436,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
// Send a message from locally connected client to a group
|
// Send a message from locally connected client to a group
|
||||||
if ((im.dialog == (byte)InstantMessageDialog.SessionSend))
|
if ((im.dialog == (byte)InstantMessageDialog.SessionSend))
|
||||||
{
|
{
|
||||||
UUID groupID = new UUID(im.toAgentID);
|
UUID GroupID = new UUID(im.imSessionID);
|
||||||
|
UUID AgentID = new UUID(im.fromAgentID);
|
||||||
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Send message to session for group {0} with session ID {1}", groupID, im.imSessionID.ToString());
|
if (m_debugEnabled)
|
||||||
|
m_log.DebugFormat("[GROUPS-MESSAGING]: Send message to session for group {0} with session ID {1}", GroupID, im.imSessionID.ToString());
|
||||||
|
|
||||||
SendMessageToGroup(im, groupID);
|
//If this agent is sending a message, then they want to be in the session
|
||||||
|
m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
|
||||||
|
|
||||||
|
SendMessageToGroup(im, GroupID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private void SendMessageToGroup(GridInstantMessage im, UUID groupID)
|
|
||||||
{
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
|
||||||
|
|
||||||
foreach (GroupMembersData member in m_groupsModule.GroupMembersRequest(null, groupID))
|
|
||||||
{
|
|
||||||
if (!m_agentsDroppedSession.ContainsKey(im.imSessionID) || m_agentsDroppedSession[im.imSessionID].Contains(member.AgentID.Guid))
|
|
||||||
{
|
|
||||||
// Don't deliver messages to people who have dropped this session
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy Message
|
|
||||||
GridInstantMessage msg = new GridInstantMessage();
|
|
||||||
msg.imSessionID = im.imSessionID;
|
|
||||||
msg.fromAgentName = im.fromAgentName;
|
|
||||||
msg.message = im.message;
|
|
||||||
msg.dialog = im.dialog;
|
|
||||||
msg.offline = im.offline;
|
|
||||||
msg.ParentEstateID = im.ParentEstateID;
|
|
||||||
msg.Position = im.Position;
|
|
||||||
msg.RegionID = im.RegionID;
|
|
||||||
msg.binaryBucket = im.binaryBucket;
|
|
||||||
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
|
||||||
|
|
||||||
// Updat Pertinate fields to make it a "group message"
|
|
||||||
msg.fromAgentID = groupID.Guid;
|
|
||||||
msg.fromGroup = true;
|
|
||||||
|
|
||||||
msg.toAgentID = member.AgentID.Guid;
|
|
||||||
|
|
||||||
IClientAPI client = GetActiveClient(member.AgentID);
|
|
||||||
if (client == null)
|
|
||||||
{
|
|
||||||
// If they're not local, forward across the grid
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Delivering to {0} via Grid", member.AgentID);
|
|
||||||
m_msgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Deliver locally, directly
|
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Passing to ProcessMessageFromGroupSession to deliver to {0} locally", client.Name);
|
|
||||||
ProcessMessageFromGroupSession(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChatterBoxSessionStartReplyViaCaps(IClientAPI remoteClient, string groupName, UUID groupID)
|
void ChatterBoxSessionStartReplyViaCaps(IClientAPI remoteClient, string groupName, UUID groupID)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
@ -518,6 +502,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private IClientAPI GetActiveClient(UUID agentID)
|
private IClientAPI GetActiveClient(UUID agentID)
|
||||||
{
|
{
|
||||||
|
if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Looking for local client {0}", agentID);
|
||||||
|
|
||||||
IClientAPI child = null;
|
IClientAPI child = null;
|
||||||
|
|
||||||
// Try root avatar first
|
// Try root avatar first
|
||||||
|
@ -529,16 +515,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
ScenePresence user = (ScenePresence)scene.Entities[agentID];
|
ScenePresence user = (ScenePresence)scene.Entities[agentID];
|
||||||
if (!user.IsChildAgent)
|
if (!user.IsChildAgent)
|
||||||
{
|
{
|
||||||
|
if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Found root agent for client : {0}", user.ControllingClient.Name);
|
||||||
return user.ControllingClient;
|
return user.ControllingClient;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Found child agent for client : {0}", user.ControllingClient.Name);
|
||||||
child = user.ControllingClient;
|
child = user.ControllingClient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we didn't find a root, then just return whichever child we found, or null if none
|
// If we didn't find a root, then just return whichever child we found, or null if none
|
||||||
|
if (child == null)
|
||||||
|
{
|
||||||
|
if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Could not find local client for agent : {0}", agentID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Returning child agent for client : {0}", child.Name);
|
||||||
|
}
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,16 +89,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
private IGroupsServicesConnector m_groupData = null;
|
private IGroupsServicesConnector m_groupData = null;
|
||||||
|
|
||||||
class GroupRequestIDInfo
|
|
||||||
{
|
|
||||||
public GroupRequestID RequestID = new GroupRequestID();
|
|
||||||
public DateTime LastUsedTMStamp = DateTime.MinValue;
|
|
||||||
}
|
|
||||||
private Dictionary<UUID, GroupRequestIDInfo> m_clientRequestIDInfo = new Dictionary<UUID, GroupRequestIDInfo>();
|
|
||||||
private const int m_clientRequestIDFlushTimeOut = 300000; // Every 5 minutes
|
|
||||||
private Timer m_clientRequestIDFlushTimer;
|
|
||||||
|
|
||||||
|
|
||||||
// Configuration settings
|
// Configuration settings
|
||||||
private bool m_groupsEnabled = false;
|
private bool m_groupsEnabled = false;
|
||||||
private bool m_groupNoticesEnabled = true;
|
private bool m_groupNoticesEnabled = true;
|
||||||
|
@ -135,30 +125,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true);
|
m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true);
|
||||||
m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true);
|
m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true);
|
||||||
|
|
||||||
m_clientRequestIDFlushTimer = new Timer();
|
|
||||||
m_clientRequestIDFlushTimer.Interval = m_clientRequestIDFlushTimeOut;
|
|
||||||
m_clientRequestIDFlushTimer.Elapsed += FlushClientRequestIDInfoCache;
|
|
||||||
m_clientRequestIDFlushTimer.AutoReset = true;
|
|
||||||
m_clientRequestIDFlushTimer.Start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FlushClientRequestIDInfoCache(object sender, ElapsedEventArgs e)
|
|
||||||
{
|
|
||||||
lock (m_clientRequestIDInfo)
|
|
||||||
{
|
|
||||||
TimeSpan cacheTimeout = new TimeSpan(0,0, m_clientRequestIDFlushTimeOut / 1000);
|
|
||||||
UUID[] CurrentKeys = new UUID[m_clientRequestIDInfo.Count];
|
|
||||||
foreach (UUID key in CurrentKeys)
|
|
||||||
{
|
|
||||||
if (m_clientRequestIDInfo.ContainsKey(key))
|
|
||||||
{
|
|
||||||
if (DateTime.Now - m_clientRequestIDInfo[key].LastUsedTMStamp > cacheTimeout)
|
|
||||||
{
|
|
||||||
m_clientRequestIDInfo.Remove(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +176,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
scene.EventManager.OnNewClient += OnNewClient;
|
scene.EventManager.OnNewClient += OnNewClient;
|
||||||
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
|
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
|
||||||
|
|
||||||
// The InstantMessageModule itself doesn't do this,
|
// The InstantMessageModule itself doesn't do this,
|
||||||
// so lets see if things explode if we don't do it
|
// so lets see if things explode if we don't do it
|
||||||
// scene.EventManager.OnClientClosed += OnClientClosed;
|
// scene.EventManager.OnClientClosed += OnClientClosed;
|
||||||
|
@ -236,8 +201,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down Groups module.");
|
if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down Groups module.");
|
||||||
|
|
||||||
m_clientRequestIDFlushTimer.Stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type ReplaceableInterface
|
public Type ReplaceableInterface
|
||||||
|
@ -274,14 +237,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
// Used for Notices and Group Invites/Accept/Reject
|
// Used for Notices and Group Invites/Accept/Reject
|
||||||
client.OnInstantMessage += OnInstantMessage;
|
client.OnInstantMessage += OnInstantMessage;
|
||||||
|
|
||||||
lock (m_clientRequestIDInfo)
|
// Send client thier groups information.
|
||||||
{
|
|
||||||
if (m_clientRequestIDInfo.ContainsKey(client.AgentId))
|
|
||||||
{
|
|
||||||
// flush any old RequestID information
|
|
||||||
m_clientRequestIDInfo.Remove(client.AgentId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SendAgentGroupDataUpdate(client, client.AgentId);
|
SendAgentGroupDataUpdate(client, client.AgentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +245,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
//GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(remoteClient), avatarID).ToArray();
|
//GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(GetRequestingAgentID(remoteClient), avatarID).ToArray();
|
||||||
GroupMembershipData[] avatarGroups = GetProfileListedGroupMemberships(remoteClient, avatarID);
|
GroupMembershipData[] avatarGroups = GetProfileListedGroupMemberships(remoteClient, avatarID);
|
||||||
remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups);
|
remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups);
|
||||||
}
|
}
|
||||||
|
@ -338,9 +294,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart);
|
System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart);
|
||||||
|
|
||||||
// TODO: This currently ignores pretty much all the query flags including Mature and sort order
|
// TODO: This currently ignores pretty much all the query flags including Mature and sort order
|
||||||
remoteClient.SendDirGroupsReply(
|
remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(GetRequestingAgentID(remoteClient), queryText).ToArray());
|
||||||
queryID, m_groupData.FindGroups(GetClientGroupRequestID(remoteClient), queryText).ToArray());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnAgentDataUpdateRequest(IClientAPI remoteClient, UUID dataForAgentID, UUID sessionID)
|
private void OnAgentDataUpdateRequest(IClientAPI remoteClient, UUID dataForAgentID, UUID sessionID)
|
||||||
|
@ -352,7 +308,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
string activeGroupName = string.Empty;
|
string activeGroupName = string.Empty;
|
||||||
ulong activeGroupPowers = (ulong)GroupPowers.None;
|
ulong activeGroupPowers = (ulong)GroupPowers.None;
|
||||||
|
|
||||||
GroupMembershipData membership = m_groupData.GetAgentActiveMembership(GetClientGroupRequestID(remoteClient), dataForAgentID);
|
GroupMembershipData membership = m_groupData.GetAgentActiveMembership(GetRequestingAgentID(remoteClient), dataForAgentID);
|
||||||
if (membership != null)
|
if (membership != null)
|
||||||
{
|
{
|
||||||
activeGroupID = membership.GroupID;
|
activeGroupID = membership.GroupID;
|
||||||
|
@ -371,7 +327,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
string GroupName;
|
string GroupName;
|
||||||
|
|
||||||
GroupRecord group = m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), GroupID, null);
|
GroupRecord group = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), GroupID, null);
|
||||||
if (group != null)
|
if (group != null)
|
||||||
{
|
{
|
||||||
GroupName = group.GroupName;
|
GroupName = group.GroupName;
|
||||||
|
@ -392,7 +348,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline))
|
if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline))
|
||||||
{
|
{
|
||||||
UUID inviteID = new UUID(im.imSessionID);
|
UUID inviteID = new UUID(im.imSessionID);
|
||||||
GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID);
|
GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
|
||||||
|
|
||||||
if (inviteInfo == null)
|
if (inviteInfo == null)
|
||||||
{
|
{
|
||||||
|
@ -411,7 +367,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice.");
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice.");
|
||||||
|
|
||||||
// and the sessionid is the role
|
// and the sessionid is the role
|
||||||
m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID);
|
m_groupData.AddAgentToGroup(GetRequestingAgentID(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID);
|
||||||
|
|
||||||
GridInstantMessage msg = new GridInstantMessage();
|
GridInstantMessage msg = new GridInstantMessage();
|
||||||
msg.imSessionID = UUID.Zero.Guid;
|
msg.imSessionID = UUID.Zero.Guid;
|
||||||
|
@ -435,14 +391,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
// TODO: If the inviter is still online, they need an agent dataupdate
|
// TODO: If the inviter is still online, they need an agent dataupdate
|
||||||
// and maybe group membership updates for the invitee
|
// and maybe group membership updates for the invitee
|
||||||
|
|
||||||
m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID);
|
m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reject
|
// Reject
|
||||||
if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)
|
if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice.");
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice.");
|
||||||
m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID);
|
m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -456,7 +412,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
}
|
}
|
||||||
|
|
||||||
UUID GroupID = new UUID(im.toAgentID);
|
UUID GroupID = new UUID(im.toAgentID);
|
||||||
if (m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), GroupID, null) != null)
|
if (m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), GroupID, null) != null)
|
||||||
{
|
{
|
||||||
UUID NoticeID = UUID.Random();
|
UUID NoticeID = UUID.Random();
|
||||||
string Subject = im.message.Substring(0, im.message.IndexOf('|'));
|
string Subject = im.message.Substring(0, im.message.IndexOf('|'));
|
||||||
|
@ -500,14 +456,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
m_groupData.AddGroupNotice(GetClientGroupRequestID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket);
|
m_groupData.AddGroupNotice(GetRequestingAgentID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket);
|
||||||
if (OnNewGroupNotice != null)
|
if (OnNewGroupNotice != null)
|
||||||
{
|
{
|
||||||
OnNewGroupNotice(GroupID, NoticeID);
|
OnNewGroupNotice(GroupID, NoticeID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send notice out to everyone that wants notices
|
// Send notice out to everyone that wants notices
|
||||||
foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), GroupID))
|
foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), GroupID))
|
||||||
{
|
{
|
||||||
if (m_debugEnabled)
|
if (m_debugEnabled)
|
||||||
{
|
{
|
||||||
|
@ -553,7 +509,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
IClientAPI ejectee = GetActiveClient(ejecteeID);
|
IClientAPI ejectee = GetActiveClient(ejecteeID);
|
||||||
if (ejectee != null)
|
if (ejectee != null)
|
||||||
{
|
{
|
||||||
UUID groupID = new UUID(im.fromAgentID);
|
UUID groupID = new UUID(im.imSessionID);
|
||||||
ejectee.SendAgentDropGroup(groupID);
|
ejectee.SendAgentDropGroup(groupID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -592,25 +548,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
public GroupRecord GetGroupRecord(UUID GroupID)
|
public GroupRecord GetGroupRecord(UUID GroupID)
|
||||||
{
|
{
|
||||||
return m_groupData.GetGroupRecord(null, GroupID, null);
|
return m_groupData.GetGroupRecord(UUID.Zero, GroupID, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupRecord GetGroupRecord(string name)
|
public GroupRecord GetGroupRecord(string name)
|
||||||
{
|
{
|
||||||
return m_groupData.GetGroupRecord(null, UUID.Zero, name);
|
return m_groupData.GetGroupRecord(UUID.Zero, UUID.Zero, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ActivateGroup(IClientAPI remoteClient, UUID groupID)
|
public void ActivateGroup(IClientAPI remoteClient, UUID groupID)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
m_groupData.SetAgentActiveGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID);
|
m_groupData.SetAgentActiveGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
|
||||||
|
|
||||||
// Changing active group changes title, active powers, all kinds of things
|
// Changing active group changes title, active powers, all kinds of things
|
||||||
// anyone who is in any region that can see this client, should probably be
|
// anyone who is in any region that can see this client, should probably be
|
||||||
// updated with new group info. At a minimum, they should get ScenePresence
|
// updated with new group info. At a minimum, they should get ScenePresence
|
||||||
// updated with new title.
|
// updated with new title.
|
||||||
UpdateAllClientsWithGroupInfo(remoteClient.AgentId);
|
UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -620,10 +576,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
GroupRequestID grID = GetClientGroupRequestID(remoteClient);
|
|
||||||
|
|
||||||
List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(grID, remoteClient.AgentId, groupID);
|
List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
|
||||||
GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID);
|
GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
|
||||||
|
|
||||||
List<GroupTitlesData> titles = new List<GroupTitlesData>();
|
List<GroupTitlesData> titles = new List<GroupTitlesData>();
|
||||||
foreach (GroupRolesData role in agentRoles)
|
foreach (GroupRolesData role in agentRoles)
|
||||||
|
@ -645,8 +600,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID)
|
public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
List<GroupMembersData> data = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID);
|
||||||
|
|
||||||
List<GroupMembersData> data = m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), groupID);
|
if (m_debugEnabled)
|
||||||
|
{
|
||||||
|
foreach (GroupMembersData member in data)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[GROUPS]: Member({0}) - IsOwner({1})", member.AgentID, member.IsOwner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
|
||||||
|
@ -656,7 +618,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
List<GroupRolesData> data = m_groupData.GetGroupRoles(GetClientGroupRequestID(remoteClient), groupID);
|
List<GroupRolesData> data = m_groupData.GetGroupRoles(GetRequestingAgentID(remoteClient), groupID);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
@ -665,8 +627,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetClientGroupRequestID(remoteClient), groupID);
|
List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetRequestingAgentID(remoteClient), groupID);
|
||||||
|
|
||||||
|
if (m_debugEnabled)
|
||||||
|
{
|
||||||
|
foreach (GroupRoleMembersData member in data)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[GROUPS]: Member({0}) - Role({1})", member.MemberID, member.RoleID);
|
||||||
|
}
|
||||||
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -676,17 +645,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
GroupProfileData profile = new GroupProfileData();
|
GroupProfileData profile = new GroupProfileData();
|
||||||
|
|
||||||
GroupRequestID grID = GetClientGroupRequestID(remoteClient);
|
|
||||||
|
|
||||||
GroupRecord groupInfo = m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), groupID, null);
|
GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null);
|
||||||
if (groupInfo != null)
|
if (groupInfo != null)
|
||||||
{
|
{
|
||||||
profile.AllowPublish = groupInfo.AllowPublish;
|
profile.AllowPublish = groupInfo.AllowPublish;
|
||||||
profile.Charter = groupInfo.Charter;
|
profile.Charter = groupInfo.Charter;
|
||||||
profile.FounderID = groupInfo.FounderID;
|
profile.FounderID = groupInfo.FounderID;
|
||||||
profile.GroupID = groupID;
|
profile.GroupID = groupID;
|
||||||
profile.GroupMembershipCount = m_groupData.GetGroupMembers(grID, groupID).Count;
|
profile.GroupMembershipCount = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID).Count;
|
||||||
profile.GroupRolesCount = m_groupData.GetGroupRoles(grID, groupID).Count;
|
profile.GroupRolesCount = m_groupData.GetGroupRoles(GetRequestingAgentID(remoteClient), groupID).Count;
|
||||||
profile.InsigniaID = groupInfo.GroupPicture;
|
profile.InsigniaID = groupInfo.GroupPicture;
|
||||||
profile.MaturePublish = groupInfo.MaturePublish;
|
profile.MaturePublish = groupInfo.MaturePublish;
|
||||||
profile.MembershipFee = groupInfo.MembershipFee;
|
profile.MembershipFee = groupInfo.MembershipFee;
|
||||||
|
@ -697,7 +665,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
profile.ShowInList = groupInfo.ShowInList;
|
profile.ShowInList = groupInfo.ShowInList;
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID);
|
GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
|
||||||
if (memberInfo != null)
|
if (memberInfo != null)
|
||||||
{
|
{
|
||||||
profile.MemberTitle = memberInfo.GroupTitle;
|
profile.MemberTitle = memberInfo.GroupTitle;
|
||||||
|
@ -711,7 +679,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
return m_groupData.GetAgentGroupMemberships(null, agentID).ToArray();
|
return m_groupData.GetAgentGroupMemberships(UUID.Zero, agentID).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID)
|
public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID)
|
||||||
|
@ -721,33 +689,30 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
"[GROUPS]: {0} called with groupID={1}, agentID={2}",
|
"[GROUPS]: {0} called with groupID={1}, agentID={2}",
|
||||||
System.Reflection.MethodBase.GetCurrentMethod().Name, groupID, agentID);
|
System.Reflection.MethodBase.GetCurrentMethod().Name, groupID, agentID);
|
||||||
|
|
||||||
return m_groupData.GetAgentGroupMembership(null, agentID, groupID);
|
return m_groupData.GetAgentGroupMembership(UUID.Zero, agentID, groupID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
|
public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
// TODO: Security Check?
|
// Note: Permissions checking for modification rights is handled by the Groups Server/Service
|
||||||
|
m_groupData.UpdateGroup(GetRequestingAgentID(remoteClient), groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish);
|
||||||
m_groupData.UpdateGroup(GetClientGroupRequestID(remoteClient), groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile)
|
public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile)
|
||||||
{
|
{
|
||||||
// TODO: Security Check?
|
// Note: Permissions checking for modification rights is handled by the Groups Server/Service
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
m_groupData.SetAgentGroupInfo(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, acceptNotices, listInProfile);
|
m_groupData.SetAgentGroupInfo(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, acceptNotices, listInProfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
|
public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
GroupRequestID grID = GetClientGroupRequestID(remoteClient);
|
if (m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), UUID.Zero, name) != null)
|
||||||
|
|
||||||
if (m_groupData.GetGroupRecord(grID, UUID.Zero, name) != null)
|
|
||||||
{
|
{
|
||||||
remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists.");
|
remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists.");
|
||||||
return UUID.Zero;
|
return UUID.Zero;
|
||||||
|
@ -761,14 +726,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got issuficient funds to create a group.");
|
remoteClient.SendCreateGroupReply(UUID.Zero, false, "You have got issuficient funds to create a group.");
|
||||||
return UUID.Zero;
|
return UUID.Zero;
|
||||||
}
|
}
|
||||||
money.ApplyGroupCreationCharge(remoteClient.AgentId);
|
money.ApplyGroupCreationCharge(GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
UUID groupID = m_groupData.CreateGroup(grID, name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId);
|
UUID groupID = m_groupData.CreateGroup(GetRequestingAgentID(remoteClient), name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, GetRequestingAgentID(remoteClient));
|
||||||
|
|
||||||
remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly");
|
remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly");
|
||||||
|
|
||||||
// Update the founder with new group information.
|
// Update the founder with new group information.
|
||||||
SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId);
|
SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
|
||||||
|
|
||||||
return groupID;
|
return groupID;
|
||||||
}
|
}
|
||||||
|
@ -779,7 +744,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
// ToDo: check if agent is a member of group and is allowed to see notices?
|
// ToDo: check if agent is a member of group and is allowed to see notices?
|
||||||
|
|
||||||
return m_groupData.GetGroupNotices(GetClientGroupRequestID(remoteClient), groupID).ToArray();
|
return m_groupData.GetGroupNotices(GetRequestingAgentID(remoteClient), groupID).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -789,7 +754,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
GroupMembershipData membership = m_groupData.GetAgentActiveMembership(null, avatarID);
|
GroupMembershipData membership = m_groupData.GetAgentActiveMembership(UUID.Zero, avatarID);
|
||||||
if (membership != null)
|
if (membership != null)
|
||||||
{
|
{
|
||||||
return membership.GroupTitle;
|
return membership.GroupTitle;
|
||||||
|
@ -804,13 +769,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
m_groupData.SetAgentActiveGroupRole(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, titleRoleID);
|
m_groupData.SetAgentActiveGroupRole(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, titleRoleID);
|
||||||
|
|
||||||
// TODO: Not sure what all is needed here, but if the active group role change is for the group
|
// TODO: Not sure what all is needed here, but if the active group role change is for the group
|
||||||
// the client currently has set active, then we need to do a scene presence update too
|
// the client currently has set active, then we need to do a scene presence update too
|
||||||
// if (m_groupData.GetAgentActiveMembership(remoteClient.AgentId).GroupID == GroupID)
|
// if (m_groupData.GetAgentActiveMembership(GetRequestingAgentID(remoteClient)).GroupID == GroupID)
|
||||||
|
|
||||||
UpdateAllClientsWithGroupInfo(remoteClient.AgentId);
|
UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -820,16 +785,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
// Security Checks are handled in the Groups Service.
|
// Security Checks are handled in the Groups Service.
|
||||||
|
|
||||||
GroupRequestID grID = GetClientGroupRequestID(remoteClient);
|
|
||||||
|
|
||||||
switch ((OpenMetaverse.GroupRoleUpdate)updateType)
|
switch ((OpenMetaverse.GroupRoleUpdate)updateType)
|
||||||
{
|
{
|
||||||
case OpenMetaverse.GroupRoleUpdate.Create:
|
case OpenMetaverse.GroupRoleUpdate.Create:
|
||||||
m_groupData.AddGroupRole(grID, groupID, UUID.Random(), name, description, title, powers);
|
m_groupData.AddGroupRole(GetRequestingAgentID(remoteClient), groupID, UUID.Random(), name, description, title, powers);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OpenMetaverse.GroupRoleUpdate.Delete:
|
case OpenMetaverse.GroupRoleUpdate.Delete:
|
||||||
m_groupData.RemoveGroupRole(grID, groupID, roleID);
|
m_groupData.RemoveGroupRole(GetRequestingAgentID(remoteClient), groupID, roleID);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OpenMetaverse.GroupRoleUpdate.UpdateAll:
|
case OpenMetaverse.GroupRoleUpdate.UpdateAll:
|
||||||
|
@ -840,7 +803,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
GroupPowers gp = (GroupPowers)powers;
|
GroupPowers gp = (GroupPowers)powers;
|
||||||
m_log.DebugFormat("[GROUPS]: Role ({0}) updated with Powers ({1}) ({2})", name, powers.ToString(), gp.ToString());
|
m_log.DebugFormat("[GROUPS]: Role ({0}) updated with Powers ({1}) ({2})", name, powers.ToString(), gp.ToString());
|
||||||
}
|
}
|
||||||
m_groupData.UpdateGroupRole(grID, groupID, roleID, name, description, title, powers);
|
m_groupData.UpdateGroupRole(GetRequestingAgentID(remoteClient), groupID, roleID, name, description, title, powers);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OpenMetaverse.GroupRoleUpdate.NoUpdate:
|
case OpenMetaverse.GroupRoleUpdate.NoUpdate:
|
||||||
|
@ -851,7 +814,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This update really should send out updates for everyone in the role that just got changed.
|
// TODO: This update really should send out updates for everyone in the role that just got changed.
|
||||||
SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId);
|
SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes)
|
public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes)
|
||||||
|
@ -859,18 +822,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
// Todo: Security check
|
// Todo: Security check
|
||||||
|
|
||||||
GroupRequestID grID = GetClientGroupRequestID(remoteClient);
|
|
||||||
|
|
||||||
switch (changes)
|
switch (changes)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
// Add
|
// Add
|
||||||
m_groupData.AddAgentToGroupRole(grID, memberID, groupID, roleID);
|
m_groupData.AddAgentToGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// Remove
|
// Remove
|
||||||
m_groupData.RemoveAgentFromGroupRole(grID, memberID, groupID, roleID);
|
m_groupData.RemoveAgentFromGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -879,25 +840,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: This update really should send out updates for everyone in the role that just got changed.
|
// TODO: This update really should send out updates for everyone in the role that just got changed.
|
||||||
SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId);
|
SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID)
|
public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
GroupRequestID grID = GetClientGroupRequestID(remoteClient);
|
GroupNoticeInfo data = m_groupData.GetGroupNotice(GetRequestingAgentID(remoteClient), groupNoticeID);
|
||||||
|
|
||||||
GroupNoticeInfo data = m_groupData.GetGroupNotice(grID, groupNoticeID);
|
|
||||||
|
|
||||||
if (data != null)
|
if (data != null)
|
||||||
{
|
{
|
||||||
GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, data.GroupID, null);
|
GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), data.GroupID, null);
|
||||||
|
|
||||||
GridInstantMessage msg = new GridInstantMessage();
|
GridInstantMessage msg = new GridInstantMessage();
|
||||||
msg.imSessionID = UUID.Zero.Guid;
|
msg.imSessionID = UUID.Zero.Guid;
|
||||||
msg.fromAgentID = data.GroupID.Guid;
|
msg.fromAgentID = data.GroupID.Guid;
|
||||||
msg.toAgentID = remoteClient.AgentId.Guid;
|
msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
|
||||||
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
||||||
msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName;
|
msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName;
|
||||||
msg.message = data.noticeData.Subject + "|" + data.Message;
|
msg.message = data.noticeData.Subject + "|" + data.Message;
|
||||||
|
@ -909,7 +868,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
msg.RegionID = UUID.Zero.Guid;
|
msg.RegionID = UUID.Zero.Guid;
|
||||||
msg.binaryBucket = data.BinaryBucket;
|
msg.binaryBucket = data.BinaryBucket;
|
||||||
|
|
||||||
OutgoingInstantMessage(msg, remoteClient.AgentId);
|
OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -929,7 +888,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
msg.Position = Vector3.Zero;
|
msg.Position = Vector3.Zero;
|
||||||
msg.RegionID = UUID.Zero.Guid;
|
msg.RegionID = UUID.Zero.Guid;
|
||||||
|
|
||||||
GroupNoticeInfo info = m_groupData.GetGroupNotice(null, groupNoticeID);
|
GroupNoticeInfo info = m_groupData.GetGroupNotice(agentID, groupNoticeID);
|
||||||
if (info != null)
|
if (info != null)
|
||||||
{
|
{
|
||||||
msg.fromAgentID = info.GroupID.Guid;
|
msg.fromAgentID = info.GroupID.Guid;
|
||||||
|
@ -956,7 +915,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
// Send agent information about his groups
|
// Send agent information about his groups
|
||||||
SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId);
|
SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID)
|
public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID)
|
||||||
|
@ -964,19 +923,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
// Should check to see if OpenEnrollment, or if there's an outstanding invitation
|
// Should check to see if OpenEnrollment, or if there's an outstanding invitation
|
||||||
m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, UUID.Zero);
|
m_groupData.AddAgentToGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, UUID.Zero);
|
||||||
|
|
||||||
remoteClient.SendJoinGroupReply(groupID, true);
|
remoteClient.SendJoinGroupReply(groupID, true);
|
||||||
|
|
||||||
// Should this send updates to everyone in the group?
|
// Should this send updates to everyone in the group?
|
||||||
SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId);
|
SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LeaveGroupRequest(IClientAPI remoteClient, UUID groupID)
|
public void LeaveGroupRequest(IClientAPI remoteClient, UUID groupID)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
m_groupData.RemoveAgentFromGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID);
|
m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
|
||||||
|
|
||||||
remoteClient.SendLeaveGroupReply(groupID, true);
|
remoteClient.SendLeaveGroupReply(groupID, true);
|
||||||
|
|
||||||
|
@ -984,33 +943,32 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
// SL sends out notifcations to the group messaging session that the person has left
|
// SL sends out notifcations to the group messaging session that the person has left
|
||||||
// Should this also update everyone who is in the group?
|
// Should this also update everyone who is in the group?
|
||||||
SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId);
|
SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID)
|
public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID)
|
||||||
{
|
{
|
||||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
GroupRequestID grID = GetClientGroupRequestID(remoteClient);
|
|
||||||
|
|
||||||
// Todo: Security check?
|
// Todo: Security check?
|
||||||
m_groupData.RemoveAgentFromGroup(grID, ejecteeID, groupID);
|
m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), ejecteeID, groupID);
|
||||||
|
|
||||||
remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, groupID, true);
|
remoteClient.SendEjectGroupMemberReply(GetRequestingAgentID(remoteClient), groupID, true);
|
||||||
|
|
||||||
|
GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null);
|
||||||
|
|
||||||
GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, groupID, null);
|
|
||||||
UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, ejecteeID);
|
UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, ejecteeID);
|
||||||
if ((groupInfo == null) || (account == null))
|
if ((groupInfo == null) || (account == null))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Send Message to Ejectee
|
// Send Message to Ejectee
|
||||||
GridInstantMessage msg = new GridInstantMessage();
|
GridInstantMessage msg = new GridInstantMessage();
|
||||||
|
|
||||||
msg.imSessionID = UUID.Zero.Guid;
|
msg.imSessionID = UUID.Zero.Guid;
|
||||||
msg.fromAgentID = remoteClient.AgentId.Guid;
|
msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
|
||||||
// msg.fromAgentID = info.GroupID;
|
// msg.fromAgentID = info.GroupID;
|
||||||
msg.toAgentID = ejecteeID.Guid;
|
msg.toAgentID = ejecteeID.Guid;
|
||||||
//msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
//msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
||||||
|
@ -1036,8 +994,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
msg = new GridInstantMessage();
|
msg = new GridInstantMessage();
|
||||||
msg.imSessionID = UUID.Zero.Guid;
|
msg.imSessionID = UUID.Zero.Guid;
|
||||||
msg.fromAgentID = remoteClient.AgentId.Guid;
|
msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
|
||||||
msg.toAgentID = remoteClient.AgentId.Guid;
|
msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
|
||||||
msg.timestamp = 0;
|
msg.timestamp = 0;
|
||||||
msg.fromAgentName = remoteClient.Name;
|
msg.fromAgentName = remoteClient.Name;
|
||||||
if (account != null)
|
if (account != null)
|
||||||
|
@ -1055,7 +1013,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
msg.Position = Vector3.Zero;
|
msg.Position = Vector3.Zero;
|
||||||
msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid;
|
msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid;
|
||||||
msg.binaryBucket = new byte[0];
|
msg.binaryBucket = new byte[0];
|
||||||
OutgoingInstantMessage(msg, remoteClient.AgentId);
|
OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
|
||||||
|
|
||||||
|
|
||||||
// SL sends out messages to everyone in the group
|
// SL sends out messages to everyone in the group
|
||||||
|
@ -1069,13 +1027,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
// Todo: Security check, probably also want to send some kind of notification
|
// Todo: Security check, probably also want to send some kind of notification
|
||||||
UUID InviteID = UUID.Random();
|
UUID InviteID = UUID.Random();
|
||||||
GroupRequestID grid = GetClientGroupRequestID(remoteClient);
|
|
||||||
|
|
||||||
m_groupData.AddAgentToGroupInvite(grid, InviteID, groupID, roleID, invitedAgentID);
|
m_groupData.AddAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID, groupID, roleID, invitedAgentID);
|
||||||
|
|
||||||
// Check to see if the invite went through, if it did not then it's possible
|
// Check to see if the invite went through, if it did not then it's possible
|
||||||
// the remoteClient did not validate or did not have permission to invite.
|
// the remoteClient did not validate or did not have permission to invite.
|
||||||
GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(grid, InviteID);
|
GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID);
|
||||||
|
|
||||||
if (inviteInfo != null)
|
if (inviteInfo != null)
|
||||||
{
|
{
|
||||||
|
@ -1087,7 +1044,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
msg.imSessionID = inviteUUID;
|
msg.imSessionID = inviteUUID;
|
||||||
|
|
||||||
// msg.fromAgentID = remoteClient.AgentId.Guid;
|
// msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
|
||||||
msg.fromAgentID = groupID.Guid;
|
msg.fromAgentID = groupID.Guid;
|
||||||
msg.toAgentID = invitedAgentID.Guid;
|
msg.toAgentID = invitedAgentID.Guid;
|
||||||
//msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
//msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
||||||
|
@ -1140,57 +1097,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
private GroupRequestID GetClientGroupRequestID(IClientAPI client)
|
|
||||||
{
|
|
||||||
if (client == null)
|
|
||||||
{
|
|
||||||
return new GroupRequestID();
|
|
||||||
}
|
|
||||||
|
|
||||||
lock (m_clientRequestIDInfo)
|
|
||||||
{
|
|
||||||
if (!m_clientRequestIDInfo.ContainsKey(client.AgentId))
|
|
||||||
{
|
|
||||||
GroupRequestIDInfo info = new GroupRequestIDInfo();
|
|
||||||
info.RequestID.AgentID = client.AgentId;
|
|
||||||
info.RequestID.SessionID = client.SessionId;
|
|
||||||
|
|
||||||
//UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(client.AgentId);
|
|
||||||
UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(client.Scene.RegionInfo.ScopeID, client.AgentId);
|
|
||||||
if (account == null)
|
|
||||||
{
|
|
||||||
// This should be impossible. If I've been passed a reference to a client
|
|
||||||
// that client should be registered with the UserService. So something
|
|
||||||
// is horribly wrong somewhere.
|
|
||||||
|
|
||||||
m_log.WarnFormat("[GROUPS]: Could not find a user profile for {0} / {1}", client.Name, client.AgentId);
|
|
||||||
|
|
||||||
// Default to local user service and hope for the best?
|
|
||||||
// REFACTORING PROBLEM
|
|
||||||
//info.RequestID.UserServiceURL = m_sceneList[0].CommsManager.NetworkServersInfo.UserURL;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
string domain = string.Empty; //m_sceneList[0].CommsManager.NetworkServersInfo.UserURL;
|
|
||||||
object homeUriObj;
|
|
||||||
if (account.ServiceURLs.TryGetValue("HomeURI", out homeUriObj) && homeUriObj != null)
|
|
||||||
domain = homeUriObj.ToString();
|
|
||||||
// They're a local user, use this:
|
|
||||||
info.RequestID.UserServiceURL = domain;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_clientRequestIDInfo.Add(client.AgentId, info);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_clientRequestIDInfo[client.AgentId].LastUsedTMStamp = DateTime.Now;
|
|
||||||
|
|
||||||
return m_clientRequestIDInfo[client.AgentId].RequestID;
|
|
||||||
}
|
|
||||||
// Unreachable code!
|
|
||||||
// return new GroupRequestID();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'.
|
/// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1209,7 +1115,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
foreach (GroupMembershipData membership in data)
|
foreach (GroupMembershipData membership in data)
|
||||||
{
|
{
|
||||||
if (remoteClient.AgentId != dataForAgentID)
|
if (GetRequestingAgentID(remoteClient) != dataForAgentID)
|
||||||
{
|
{
|
||||||
if (!membership.ListInProfile)
|
if (!membership.ListInProfile)
|
||||||
{
|
{
|
||||||
|
@ -1239,11 +1145,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
llDataStruct.Add("GroupData", GroupData);
|
llDataStruct.Add("GroupData", GroupData);
|
||||||
llDataStruct.Add("NewGroupData", NewGroupData);
|
llDataStruct.Add("NewGroupData", NewGroupData);
|
||||||
|
|
||||||
|
if (m_debugEnabled)
|
||||||
|
{
|
||||||
|
m_log.InfoFormat("[GROUPS]: {0}", OSDParser.SerializeJsonString(llDataStruct));
|
||||||
|
}
|
||||||
|
|
||||||
IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
|
IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
|
||||||
|
|
||||||
if (queue != null)
|
if (queue != null)
|
||||||
{
|
{
|
||||||
queue.Enqueue(EventQueueHelper.buildEvent("AgentGroupDataUpdate", llDataStruct), remoteClient.AgentId);
|
queue.Enqueue(EventQueueHelper.buildEvent("AgentGroupDataUpdate", llDataStruct), GetRequestingAgentID(remoteClient));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1316,7 +1227,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private GroupMembershipData[] GetProfileListedGroupMemberships(IClientAPI requestingClient, UUID dataForAgentID)
|
private GroupMembershipData[] GetProfileListedGroupMemberships(IClientAPI requestingClient, UUID dataForAgentID)
|
||||||
{
|
{
|
||||||
List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(requestingClient), dataForAgentID);
|
List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(requestingClient.AgentId, dataForAgentID);
|
||||||
GroupMembershipData[] membershipArray;
|
GroupMembershipData[] membershipArray;
|
||||||
|
|
||||||
if (requestingClient.AgentId != dataForAgentID)
|
if (requestingClient.AgentId != dataForAgentID)
|
||||||
|
@ -1338,7 +1249,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId);
|
m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId);
|
||||||
foreach (GroupMembershipData membership in membershipArray)
|
foreach (GroupMembershipData membership in membershipArray)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[GROUPS]: {0} :: {1} - {2}", dataForAgentID, membership.GroupName, membership.GroupTitle);
|
m_log.InfoFormat("[GROUPS]: {0} :: {1} - {2} - {3}", dataForAgentID, membership.GroupName, membership.GroupTitle, membership.GroupPowers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1397,6 +1308,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private UUID GetRequestingAgentID(IClientAPI client)
|
||||||
|
{
|
||||||
|
UUID requestingAgentID = UUID.Zero;
|
||||||
|
if (client != null)
|
||||||
|
{
|
||||||
|
requestingAgentID = client.AgentId;
|
||||||
|
}
|
||||||
|
return requestingAgentID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class GroupNoticeInfo
|
||||||
|
{
|
||||||
|
public GroupNoticeData noticeData = new GroupNoticeData();
|
||||||
|
public UUID GroupID = UUID.Zero;
|
||||||
|
public string Message = string.Empty;
|
||||||
|
public byte[] BinaryBucket = new byte[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,41 +36,47 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
interface IGroupsServicesConnector
|
interface IGroupsServicesConnector
|
||||||
{
|
{
|
||||||
UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, UUID founderID);
|
UUID CreateGroup(UUID RequestingAgentID, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, UUID founderID);
|
||||||
void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish);
|
void UpdateGroup(UUID RequestingAgentID, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish);
|
||||||
GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName);
|
GroupRecord GetGroupRecord(UUID RequestingAgentID, UUID GroupID, string GroupName);
|
||||||
List<DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search);
|
List<DirGroupsReplyData> FindGroups(UUID RequestingAgentID, string search);
|
||||||
List<GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID);
|
List<GroupMembersData> GetGroupMembers(UUID RequestingAgentID, UUID GroupID);
|
||||||
|
|
||||||
void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers);
|
void AddGroupRole(UUID RequestingAgentID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers);
|
||||||
void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers);
|
void UpdateGroupRole(UUID RequestingAgentID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers);
|
||||||
void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID);
|
void RemoveGroupRole(UUID RequestingAgentID, UUID groupID, UUID roleID);
|
||||||
List<GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID);
|
List<GroupRolesData> GetGroupRoles(UUID RequestingAgentID, UUID GroupID);
|
||||||
List<GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID);
|
List<GroupRoleMembersData> GetGroupRoleMembers(UUID RequestingAgentID, UUID GroupID);
|
||||||
|
|
||||||
void AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID);
|
void AddAgentToGroup(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
|
||||||
void RemoveAgentFromGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID);
|
void RemoveAgentFromGroup(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
|
||||||
|
|
||||||
void AddAgentToGroupInvite(GroupRequestID requestID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID);
|
void AddAgentToGroupInvite(UUID RequestingAgentID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID);
|
||||||
GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID);
|
GroupInviteInfo GetAgentToGroupInvite(UUID RequestingAgentID, UUID inviteID);
|
||||||
void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID);
|
void RemoveAgentToGroupInvite(UUID RequestingAgentID, UUID inviteID);
|
||||||
|
|
||||||
void AddAgentToGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID);
|
void AddAgentToGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
|
||||||
void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID);
|
void RemoveAgentFromGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
|
||||||
List<GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, UUID AgentID, UUID GroupID);
|
List<GroupRolesData> GetAgentGroupRoles(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
|
||||||
|
|
||||||
void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID);
|
void SetAgentActiveGroup(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
|
||||||
GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID);
|
GroupMembershipData GetAgentActiveMembership(UUID RequestingAgentID, UUID AgentID);
|
||||||
|
|
||||||
void SetAgentActiveGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID);
|
void SetAgentActiveGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
|
||||||
void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile);
|
void SetAgentGroupInfo(UUID RequestingAgentID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile);
|
||||||
|
|
||||||
GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, UUID AgentID, UUID GroupID);
|
GroupMembershipData GetAgentGroupMembership(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
|
||||||
List<GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID);
|
List<GroupMembershipData> GetAgentGroupMemberships(UUID RequestingAgentID, UUID AgentID);
|
||||||
|
|
||||||
void AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket);
|
void AddGroupNotice(UUID RequestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket);
|
||||||
GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID);
|
GroupNoticeInfo GetGroupNotice(UUID RequestingAgentID, UUID noticeID);
|
||||||
List<GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID);
|
List<GroupNoticeData> GetGroupNotices(UUID RequestingAgentID, UUID GroupID);
|
||||||
|
|
||||||
|
void ResetAgentGroupChatSessions(UUID agentID);
|
||||||
|
bool hasAgentBeenInvitedToGroupChatSession(UUID agentID, UUID groupID);
|
||||||
|
bool hasAgentDroppedGroupChatSession(UUID agentID, UUID groupID);
|
||||||
|
void AgentDroppedFromGroupChatSession(UUID agentID, UUID groupID);
|
||||||
|
void AgentInvitedToGroupChatSession(UUID agentID, UUID groupID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class GroupInviteInfo
|
public class GroupInviteInfo
|
||||||
|
@ -80,11 +86,4 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
public UUID AgentID = UUID.Zero;
|
public UUID AgentID = UUID.Zero;
|
||||||
public UUID InviteID = UUID.Zero;
|
public UUID InviteID = UUID.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class GroupRequestID
|
|
||||||
{
|
|
||||||
public UUID AgentID = UUID.Zero;
|
|
||||||
public string UserServiceURL = string.Empty;
|
|
||||||
public UUID SessionID = UUID.Zero;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -29,6 +29,7 @@ using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
using Nwc.XmlRpc;
|
using Nwc.XmlRpc;
|
||||||
|
|
||||||
|
@ -40,7 +41,9 @@ using OpenMetaverse;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
|
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
|
||||||
namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
{
|
{
|
||||||
|
@ -59,13 +62,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
private bool m_connectorEnabled = false;
|
private bool m_connectorEnabled = false;
|
||||||
|
|
||||||
private string m_serviceURL = string.Empty;
|
private string m_groupsServerURI = string.Empty;
|
||||||
|
|
||||||
private bool m_disableKeepAlive = false;
|
private bool m_disableKeepAlive = false;
|
||||||
|
|
||||||
private string m_groupReadKey = string.Empty;
|
private string m_groupReadKey = string.Empty;
|
||||||
private string m_groupWriteKey = string.Empty;
|
private string m_groupWriteKey = string.Empty;
|
||||||
|
|
||||||
|
private IUserAccountService m_accountService = null;
|
||||||
|
|
||||||
|
private ExpiringCache<string, XmlRpcResponse> m_memoryCache;
|
||||||
|
private int m_cacheTimeout = 30;
|
||||||
|
|
||||||
|
// Used to track which agents are have dropped from a group chat session
|
||||||
|
// Should be reset per agent, on logon
|
||||||
|
// TODO: move this to Flotsam XmlRpc Service
|
||||||
|
// SessionID, List<AgentID>
|
||||||
|
private Dictionary<UUID, List<UUID>> m_groupsAgentsDroppedFromChatSession = new Dictionary<UUID, List<UUID>>();
|
||||||
|
private Dictionary<UUID, List<UUID>> m_groupsAgentsInvitedToChatSession = new Dictionary<UUID, List<UUID>>();
|
||||||
|
|
||||||
|
|
||||||
#region IRegionModuleBase Members
|
#region IRegionModuleBase Members
|
||||||
|
|
||||||
|
@ -100,13 +115,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.InfoFormat("[GROUPS-CONNECTOR]: Initializing {0}", this.Name);
|
m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Initializing {0}", this.Name);
|
||||||
|
|
||||||
m_serviceURL = groupsConfig.GetString("XmlRpcServiceURL", string.Empty);
|
m_groupsServerURI = groupsConfig.GetString("GroupsServerURI", string.Empty);
|
||||||
if ((m_serviceURL == null) ||
|
if ((m_groupsServerURI == null) ||
|
||||||
(m_serviceURL == string.Empty))
|
(m_groupsServerURI == string.Empty))
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("Please specify a valid URL for XmlRpcServiceURL in OpenSim.ini, [Groups]");
|
m_log.ErrorFormat("Please specify a valid URL for GroupsServerURI in OpenSim.ini, [Groups]");
|
||||||
m_connectorEnabled = false;
|
m_connectorEnabled = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -116,27 +131,50 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
m_groupReadKey = groupsConfig.GetString("XmlRpcServiceReadKey", string.Empty);
|
m_groupReadKey = groupsConfig.GetString("XmlRpcServiceReadKey", string.Empty);
|
||||||
m_groupWriteKey = groupsConfig.GetString("XmlRpcServiceWriteKey", string.Empty);
|
m_groupWriteKey = groupsConfig.GetString("XmlRpcServiceWriteKey", string.Empty);
|
||||||
|
|
||||||
|
|
||||||
|
m_cacheTimeout = groupsConfig.GetInt("GroupsCacheTimeout", 30);
|
||||||
|
if (m_cacheTimeout == 0)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[XMLRPC-GROUPS-CONNECTOR]: Groups Cache Disabled.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Groups Cache Timeout set to {0}.", m_cacheTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
// If we got all the config options we need, lets start'er'up
|
// If we got all the config options we need, lets start'er'up
|
||||||
|
m_memoryCache = new ExpiringCache<string, XmlRpcResponse>();
|
||||||
m_connectorEnabled = true;
|
m_connectorEnabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[GROUPS-CONNECTOR]: Closing {0}", this.Name);
|
m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Closing {0}", this.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene)
|
public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene)
|
||||||
{
|
{
|
||||||
if (m_connectorEnabled)
|
if (m_connectorEnabled)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (m_accountService == null)
|
||||||
|
{
|
||||||
|
m_accountService = scene.UserAccountService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
scene.RegisterModuleInterface<IGroupsServicesConnector>(this);
|
scene.RegisterModuleInterface<IGroupsServicesConnector>(this);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void RemoveRegion(OpenSim.Region.Framework.Scenes.Scene scene)
|
public void RemoveRegion(OpenSim.Region.Framework.Scenes.Scene scene)
|
||||||
{
|
{
|
||||||
if (scene.RequestModuleInterface<IGroupsServicesConnector>() == this)
|
if (scene.RequestModuleInterface<IGroupsServicesConnector>() == this)
|
||||||
|
{
|
||||||
scene.UnregisterModuleInterface<IGroupsServicesConnector>(this);
|
scene.UnregisterModuleInterface<IGroupsServicesConnector>(this);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void RegionLoaded(OpenSim.Region.Framework.Scenes.Scene scene)
|
public void RegionLoaded(OpenSim.Region.Framework.Scenes.Scene scene)
|
||||||
{
|
{
|
||||||
|
@ -155,14 +193,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region IGroupsServicesConnector Members
|
#region IGroupsServicesConnector Members
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role.
|
/// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID,
|
public UUID CreateGroup(UUID requestingAgentID, string name, string charter, bool showInList, UUID insigniaID,
|
||||||
int membershipFee, bool openEnrollment, bool allowPublish,
|
int membershipFee, bool openEnrollment, bool allowPublish,
|
||||||
bool maturePublish, UUID founderID)
|
bool maturePublish, UUID founderID)
|
||||||
{
|
{
|
||||||
|
@ -234,7 +270,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.createGroup", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.createGroup", param);
|
||||||
|
|
||||||
if (respData.Contains("error"))
|
if (respData.Contains("error"))
|
||||||
{
|
{
|
||||||
|
@ -246,7 +282,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return UUID.Parse((string)respData["GroupID"]);
|
return UUID.Parse((string)respData["GroupID"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList,
|
public void UpdateGroup(UUID requestingAgentID, UUID groupID, string charter, bool showInList,
|
||||||
UUID insigniaID, int membershipFee, bool openEnrollment,
|
UUID insigniaID, int membershipFee, bool openEnrollment,
|
||||||
bool allowPublish, bool maturePublish)
|
bool allowPublish, bool maturePublish)
|
||||||
{
|
{
|
||||||
|
@ -260,10 +296,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
param["AllowPublish"] = allowPublish == true ? 1 : 0;
|
param["AllowPublish"] = allowPublish == true ? 1 : 0;
|
||||||
param["MaturePublish"] = maturePublish == true ? 1 : 0;
|
param["MaturePublish"] = maturePublish == true ? 1 : 0;
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.updateGroup", param);
|
XmlRpcCall(requestingAgentID, "groups.updateGroup", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description,
|
public void AddGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
|
||||||
string title, ulong powers)
|
string title, ulong powers)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
|
@ -274,19 +310,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
param["Title"] = title;
|
param["Title"] = title;
|
||||||
param["Powers"] = powers.ToString();
|
param["Powers"] = powers.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.addRoleToGroup", param);
|
XmlRpcCall(requestingAgentID, "groups.addRoleToGroup", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID)
|
public void RemoveGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["GroupID"] = groupID.ToString();
|
param["GroupID"] = groupID.ToString();
|
||||||
param["RoleID"] = roleID.ToString();
|
param["RoleID"] = roleID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.removeRoleFromGroup", param);
|
XmlRpcCall(requestingAgentID, "groups.removeRoleFromGroup", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description,
|
public void UpdateGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
|
||||||
string title, ulong powers)
|
string title, ulong powers)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
|
@ -306,10 +342,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
}
|
}
|
||||||
param["Powers"] = powers.ToString();
|
param["Powers"] = powers.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.updateGroupRole", param);
|
XmlRpcCall(requestingAgentID, "groups.updateGroupRole", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName)
|
public GroupRecord GetGroupRecord(UUID requestingAgentID, UUID GroupID, string GroupName)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
if (GroupID != UUID.Zero)
|
if (GroupID != UUID.Zero)
|
||||||
|
@ -321,7 +357,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
param["Name"] = GroupName.ToString();
|
param["Name"] = GroupName.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroup", param);
|
||||||
|
|
||||||
if (respData.Contains("error"))
|
if (respData.Contains("error"))
|
||||||
{
|
{
|
||||||
|
@ -332,12 +368,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupProfileData GetMemberGroupProfile(GroupRequestID requestID, UUID GroupID, UUID AgentID)
|
public GroupProfileData GetMemberGroupProfile(UUID requestingAgentID, UUID GroupID, UUID AgentID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroup", param);
|
||||||
|
|
||||||
if (respData.Contains("error"))
|
if (respData.Contains("error"))
|
||||||
{
|
{
|
||||||
|
@ -345,7 +381,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return new GroupProfileData();
|
return new GroupProfileData();
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupMembershipData MemberInfo = GetAgentGroupMembership(requestID, AgentID, GroupID);
|
GroupMembershipData MemberInfo = GetAgentGroupMembership(requestingAgentID, AgentID, GroupID);
|
||||||
GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData);
|
GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData);
|
||||||
|
|
||||||
MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle;
|
MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle;
|
||||||
|
@ -354,26 +390,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return MemberGroupProfile;
|
return MemberGroupProfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID)
|
public void SetAgentActiveGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.setAgentActiveGroup", param);
|
XmlRpcCall(requestingAgentID, "groups.setAgentActiveGroup", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetAgentActiveGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID)
|
public void SetAgentActiveGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
param["SelectedRoleID"] = RoleID.ToString();
|
param["SelectedRoleID"] = RoleID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.setAgentGroupInfo", param);
|
XmlRpcCall(requestingAgentID, "groups.setAgentGroupInfo", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile)
|
public void SetAgentGroupInfo(UUID requestingAgentID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
|
@ -381,11 +417,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
param["AcceptNotices"] = AcceptNotices ? "1" : "0";
|
param["AcceptNotices"] = AcceptNotices ? "1" : "0";
|
||||||
param["ListInProfile"] = ListInProfile ? "1" : "0";
|
param["ListInProfile"] = ListInProfile ? "1" : "0";
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.setAgentGroupInfo", param);
|
XmlRpcCall(requestingAgentID, "groups.setAgentGroupInfo", param);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddAgentToGroupInvite(GroupRequestID requestID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID)
|
public void AddAgentToGroupInvite(UUID requestingAgentID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["InviteID"] = inviteID.ToString();
|
param["InviteID"] = inviteID.ToString();
|
||||||
|
@ -393,16 +429,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
param["RoleID"] = roleID.ToString();
|
param["RoleID"] = roleID.ToString();
|
||||||
param["GroupID"] = groupID.ToString();
|
param["GroupID"] = groupID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.addAgentToGroupInvite", param);
|
XmlRpcCall(requestingAgentID, "groups.addAgentToGroupInvite", param);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID)
|
public GroupInviteInfo GetAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["InviteID"] = inviteID.ToString();
|
param["InviteID"] = inviteID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getAgentToGroupInvite", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentToGroupInvite", param);
|
||||||
|
|
||||||
if (respData.Contains("error"))
|
if (respData.Contains("error"))
|
||||||
{
|
{
|
||||||
|
@ -418,59 +454,59 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return inviteInfo;
|
return inviteInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID)
|
public void RemoveAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["InviteID"] = inviteID.ToString();
|
param["InviteID"] = inviteID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.removeAgentToGroupInvite", param);
|
XmlRpcCall(requestingAgentID, "groups.removeAgentToGroupInvite", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID)
|
public void AddAgentToGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
param["RoleID"] = RoleID.ToString();
|
param["RoleID"] = RoleID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.addAgentToGroup", param);
|
XmlRpcCall(requestingAgentID, "groups.addAgentToGroup", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveAgentFromGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID)
|
public void RemoveAgentFromGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.removeAgentFromGroup", param);
|
XmlRpcCall(requestingAgentID, "groups.removeAgentFromGroup", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddAgentToGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID)
|
public void AddAgentToGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
param["RoleID"] = RoleID.ToString();
|
param["RoleID"] = RoleID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.addAgentToGroupRole", param);
|
XmlRpcCall(requestingAgentID, "groups.addAgentToGroupRole", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID)
|
public void RemoveAgentFromGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
param["RoleID"] = RoleID.ToString();
|
param["RoleID"] = RoleID.ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.removeAgentFromGroupRole", param);
|
XmlRpcCall(requestingAgentID, "groups.removeAgentFromGroupRole", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search)
|
public List<DirGroupsReplyData> FindGroups(UUID requestingAgentID, string search)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["Search"] = search;
|
param["Search"] = search;
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.findGroups", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.findGroups", param);
|
||||||
|
|
||||||
List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>();
|
List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>();
|
||||||
|
|
||||||
|
@ -492,13 +528,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return findings;
|
return findings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, UUID AgentID, UUID GroupID)
|
public GroupMembershipData GetAgentGroupMembership(UUID requestingAgentID, UUID AgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMembership", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentGroupMembership", param);
|
||||||
|
|
||||||
if (respData.Contains("error"))
|
if (respData.Contains("error"))
|
||||||
{
|
{
|
||||||
|
@ -510,12 +546,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID)
|
public GroupMembershipData GetAgentActiveMembership(UUID requestingAgentID, UUID AgentID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getAgentActiveMembership", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentActiveMembership", param);
|
||||||
|
|
||||||
if (respData.Contains("error"))
|
if (respData.Contains("error"))
|
||||||
{
|
{
|
||||||
|
@ -525,12 +561,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return HashTableToGroupMembershipData(respData);
|
return HashTableToGroupMembershipData(respData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID)
|
public List<GroupMembershipData> GetAgentGroupMemberships(UUID requestingAgentID, UUID AgentID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMemberships", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentGroupMemberships", param);
|
||||||
|
|
||||||
List<GroupMembershipData> memberships = new List<GroupMembershipData>();
|
List<GroupMembershipData> memberships = new List<GroupMembershipData>();
|
||||||
|
|
||||||
|
@ -545,13 +581,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return memberships;
|
return memberships;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, UUID AgentID, UUID GroupID)
|
public List<GroupRolesData> GetAgentGroupRoles(UUID requestingAgentID, UUID AgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["AgentID"] = AgentID.ToString();
|
param["AgentID"] = AgentID.ToString();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getAgentRoles", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentRoles", param);
|
||||||
|
|
||||||
List<GroupRolesData> Roles = new List<GroupRolesData>();
|
List<GroupRolesData> Roles = new List<GroupRolesData>();
|
||||||
|
|
||||||
|
@ -577,12 +613,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID)
|
public List<GroupRolesData> GetGroupRoles(UUID requestingAgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoles", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupRoles", param);
|
||||||
|
|
||||||
List<GroupRolesData> Roles = new List<GroupRolesData>();
|
List<GroupRolesData> Roles = new List<GroupRolesData>();
|
||||||
|
|
||||||
|
@ -610,12 +646,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public List<GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID)
|
public List<GroupMembersData> GetGroupMembers(UUID requestingAgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getGroupMembers", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupMembers", param);
|
||||||
|
|
||||||
List<GroupMembersData> members = new List<GroupMembersData>();
|
List<GroupMembersData> members = new List<GroupMembersData>();
|
||||||
|
|
||||||
|
@ -643,12 +679,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID)
|
public List<GroupRoleMembersData> GetGroupRoleMembers(UUID requestingAgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoleMembers", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupRoleMembers", param);
|
||||||
|
|
||||||
List<GroupRoleMembersData> members = new List<GroupRoleMembersData>();
|
List<GroupRoleMembersData> members = new List<GroupRoleMembersData>();
|
||||||
|
|
||||||
|
@ -667,12 +703,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return members;
|
return members;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID)
|
public List<GroupNoticeData> GetGroupNotices(UUID requestingAgentID, UUID GroupID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["GroupID"] = GroupID.ToString();
|
param["GroupID"] = GroupID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotices", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupNotices", param);
|
||||||
|
|
||||||
List<GroupNoticeData> values = new List<GroupNoticeData>();
|
List<GroupNoticeData> values = new List<GroupNoticeData>();
|
||||||
|
|
||||||
|
@ -694,12 +730,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return values;
|
return values;
|
||||||
|
|
||||||
}
|
}
|
||||||
public GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID)
|
public GroupNoticeInfo GetGroupNotice(UUID requestingAgentID, UUID noticeID)
|
||||||
{
|
{
|
||||||
Hashtable param = new Hashtable();
|
Hashtable param = new Hashtable();
|
||||||
param["NoticeID"] = noticeID.ToString();
|
param["NoticeID"] = noticeID.ToString();
|
||||||
|
|
||||||
Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotice", param);
|
Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupNotice", param);
|
||||||
|
|
||||||
|
|
||||||
if (respData.Contains("error"))
|
if (respData.Contains("error"))
|
||||||
|
@ -725,7 +761,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
public void AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket)
|
public void AddGroupNotice(UUID requestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket)
|
||||||
{
|
{
|
||||||
string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, "");
|
string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, "");
|
||||||
|
|
||||||
|
@ -738,7 +774,70 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
param["BinaryBucket"] = binBucket;
|
param["BinaryBucket"] = binBucket;
|
||||||
param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString();
|
param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString();
|
||||||
|
|
||||||
XmlRpcCall(requestID, "groups.addGroupNotice", param);
|
XmlRpcCall(requestingAgentID, "groups.addGroupNotice", param);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region GroupSessionTracking
|
||||||
|
|
||||||
|
public void ResetAgentGroupChatSessions(UUID agentID)
|
||||||
|
{
|
||||||
|
foreach (List<UUID> agentList in m_groupsAgentsDroppedFromChatSession.Values)
|
||||||
|
{
|
||||||
|
agentList.Remove(agentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool hasAgentBeenInvitedToGroupChatSession(UUID agentID, UUID groupID)
|
||||||
|
{
|
||||||
|
// If we're tracking this group, and we can find them in the tracking, then they've been invited
|
||||||
|
return m_groupsAgentsInvitedToChatSession.ContainsKey(groupID)
|
||||||
|
&& m_groupsAgentsInvitedToChatSession[groupID].Contains(agentID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool hasAgentDroppedGroupChatSession(UUID agentID, UUID groupID)
|
||||||
|
{
|
||||||
|
// If we're tracking drops for this group,
|
||||||
|
// and we find them, well... then they've dropped
|
||||||
|
return m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID)
|
||||||
|
&& m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AgentDroppedFromGroupChatSession(UUID agentID, UUID groupID)
|
||||||
|
{
|
||||||
|
if (m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID))
|
||||||
|
{
|
||||||
|
// If not in dropped list, add
|
||||||
|
if (!m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID))
|
||||||
|
{
|
||||||
|
m_groupsAgentsDroppedFromChatSession[groupID].Add(agentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AgentInvitedToGroupChatSession(UUID agentID, UUID groupID)
|
||||||
|
{
|
||||||
|
// Add Session Status if it doesn't exist for this session
|
||||||
|
CreateGroupChatSessionTracking(groupID);
|
||||||
|
|
||||||
|
// If nessesary, remove from dropped list
|
||||||
|
if (m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID))
|
||||||
|
{
|
||||||
|
m_groupsAgentsDroppedFromChatSession[groupID].Remove(agentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateGroupChatSessionTracking(UUID groupID)
|
||||||
|
{
|
||||||
|
if (!m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID))
|
||||||
|
{
|
||||||
|
m_groupsAgentsDroppedFromChatSession.Add(groupID, new List<UUID>());
|
||||||
|
m_groupsAgentsInvitedToChatSession.Add(groupID, new List<UUID>());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -831,15 +930,44 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Encapsulate the XmlRpc call to standardize security and error handling.
|
/// Encapsulate the XmlRpc call to standardize security and error handling.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private Hashtable XmlRpcCall(GroupRequestID requestID, string function, Hashtable param)
|
private Hashtable XmlRpcCall(UUID requestingAgentID, string function, Hashtable param)
|
||||||
{
|
{
|
||||||
if (requestID == null)
|
XmlRpcResponse resp = null;
|
||||||
|
string CacheKey = null;
|
||||||
|
|
||||||
|
// Only bother with the cache if it isn't disabled.
|
||||||
|
if (m_cacheTimeout > 0)
|
||||||
{
|
{
|
||||||
requestID = new GroupRequestID();
|
if (!function.StartsWith("groups.get"))
|
||||||
|
{
|
||||||
|
// Any and all updates cause the cache to clear
|
||||||
|
m_memoryCache.Clear();
|
||||||
}
|
}
|
||||||
param.Add("RequestingAgentID", requestID.AgentID.ToString());
|
else
|
||||||
param.Add("RequestingAgentUserService", requestID.UserServiceURL);
|
{
|
||||||
param.Add("RequestingSessionID", requestID.SessionID.ToString());
|
StringBuilder sb = new StringBuilder(requestingAgentID + function);
|
||||||
|
foreach (object key in param.Keys)
|
||||||
|
{
|
||||||
|
if (param[key] != null)
|
||||||
|
{
|
||||||
|
sb.AppendFormat(",{0}:{1}", key.ToString(), param[key].ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CacheKey = sb.ToString();
|
||||||
|
m_memoryCache.TryGetValue(CacheKey, out resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( resp == null )
|
||||||
|
{
|
||||||
|
string UserService;
|
||||||
|
UUID SessionID;
|
||||||
|
GetClientGroupRequestID(requestingAgentID, out UserService, out SessionID);
|
||||||
|
param.Add("requestingAgentID", requestingAgentID.ToString());
|
||||||
|
param.Add("RequestingAgentUserService", UserService);
|
||||||
|
param.Add("RequestingSessionID", SessionID.ToString());
|
||||||
|
|
||||||
|
|
||||||
param.Add("ReadKey", m_groupReadKey);
|
param.Add("ReadKey", m_groupReadKey);
|
||||||
|
@ -852,33 +980,37 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
ConfigurableKeepAliveXmlRpcRequest req;
|
ConfigurableKeepAliveXmlRpcRequest req;
|
||||||
req = new ConfigurableKeepAliveXmlRpcRequest(function, parameters, m_disableKeepAlive);
|
req = new ConfigurableKeepAliveXmlRpcRequest(function, parameters, m_disableKeepAlive);
|
||||||
|
|
||||||
XmlRpcResponse resp = null;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
resp = req.Send(m_serviceURL, 10000);
|
resp = req.Send(m_groupsServerURI, 10000);
|
||||||
|
|
||||||
|
if ((m_cacheTimeout > 0) && (CacheKey != null))
|
||||||
|
{
|
||||||
|
m_memoryCache.AddOrUpdate(CacheKey, resp, TimeSpan.FromSeconds(m_cacheTimeout));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function);
|
||||||
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: {0} ", e.ToString());
|
||||||
|
|
||||||
|
foreach (string ResponseLine in req.RequestResponse.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function);
|
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString());
|
|
||||||
|
|
||||||
foreach (string ResponseLine in req.RequestResponse.Split(new string[] { Environment.NewLine },StringSplitOptions.None))
|
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", ResponseLine);
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: {0} ", ResponseLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (string key in param.Keys)
|
foreach (string key in param.Keys)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[XMLRPCGROUPDATA]: {0} :: {1}", key, param[key].ToString());
|
m_log.WarnFormat("[XMLRPC-GROUPS-CONNECTOR]: {0} :: {1}", key, param[key].ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
Hashtable respData = new Hashtable();
|
Hashtable respData = new Hashtable();
|
||||||
respData.Add("error", e.ToString());
|
respData.Add("error", e.ToString());
|
||||||
return respData;
|
return respData;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (resp.Value is Hashtable)
|
if (resp.Value is Hashtable)
|
||||||
{
|
{
|
||||||
|
@ -891,21 +1023,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
return respData;
|
return respData;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: The XmlRpc server returned a {1} instead of a hashtable for {0}", function, resp.Value.GetType().ToString());
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: The XmlRpc server returned a {1} instead of a hashtable for {0}", function, resp.Value.GetType().ToString());
|
||||||
|
|
||||||
if (resp.Value is ArrayList)
|
if (resp.Value is ArrayList)
|
||||||
{
|
{
|
||||||
ArrayList al = (ArrayList)resp.Value;
|
ArrayList al = (ArrayList)resp.Value;
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: Contains {0} elements", al.Count);
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: Contains {0} elements", al.Count);
|
||||||
|
|
||||||
foreach (object o in al)
|
foreach (object o in al)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} :: {1}", o.GetType().ToString(), o.ToString());
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: {0} :: {1}", o.GetType().ToString(), o.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: Function returned: {0}", resp.Value.ToString());
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: Function returned: {0}", resp.Value.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
Hashtable error = new Hashtable();
|
Hashtable error = new Hashtable();
|
||||||
|
@ -915,30 +1047,64 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
|
|
||||||
private void LogRespDataToConsoleError(Hashtable respData)
|
private void LogRespDataToConsoleError(Hashtable respData)
|
||||||
{
|
{
|
||||||
m_log.Error("[XMLRPCGROUPDATA]: Error:");
|
m_log.Error("[XMLRPC-GROUPS-CONNECTOR]: Error:");
|
||||||
|
|
||||||
foreach (string key in respData.Keys)
|
foreach (string key in respData.Keys)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: Key: {0}", key);
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: Key: {0}", key);
|
||||||
|
|
||||||
string[] lines = respData[key].ToString().Split(new char[] { '\n' });
|
string[] lines = respData[key].ToString().Split(new char[] { '\n' });
|
||||||
foreach (string line in lines)
|
foreach (string line in lines)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0}", line);
|
m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: {0}", line);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
/// <summary>
|
||||||
|
/// Group Request Tokens are an attempt to allow the groups service to authenticate
|
||||||
public class GroupNoticeInfo
|
/// requests.
|
||||||
|
/// TODO: This broke after the big grid refactor, either find a better way, or discard this
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="client"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private void GetClientGroupRequestID(UUID AgentID, out string UserServiceURL, out UUID SessionID)
|
||||||
{
|
{
|
||||||
public GroupNoticeData noticeData = new GroupNoticeData();
|
UserServiceURL = "";
|
||||||
public UUID GroupID = UUID.Zero;
|
SessionID = UUID.Zero;
|
||||||
public string Message = string.Empty;
|
|
||||||
public byte[] BinaryBucket = new byte[0];
|
|
||||||
|
// Need to rework this based on changes to User Services
|
||||||
|
/*
|
||||||
|
UserAccount userAccount = m_accountService.GetUserAccount(UUID.Zero,AgentID);
|
||||||
|
if (userAccount == null)
|
||||||
|
{
|
||||||
|
// This should be impossible. If I've been passed a reference to a client
|
||||||
|
// that client should be registered with the UserService. So something
|
||||||
|
// is horribly wrong somewhere.
|
||||||
|
|
||||||
|
m_log.WarnFormat("[GROUPS]: Could not find a UserServiceURL for {0}", AgentID);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (userProfile is ForeignUserProfileData)
|
||||||
|
{
|
||||||
|
// They aren't from around here
|
||||||
|
ForeignUserProfileData fupd = (ForeignUserProfileData)userProfile;
|
||||||
|
UserServiceURL = fupd.UserServerURI;
|
||||||
|
SessionID = fupd.CurrentAgent.SessionID;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// They're a local user, use this:
|
||||||
|
UserServiceURL = m_commManager.NetworkServersInfo.UserURL;
|
||||||
|
SessionID = userProfile.CurrentAgent.SessionID;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -235,6 +235,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
public event Action<UUID> OnRemoveAvatar;
|
public event Action<UUID> OnRemoveAvatar;
|
||||||
|
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem;
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder;
|
public event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
|
|
@ -81,6 +81,9 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
|
||||||
|
|
||||||
void PostEvent(EventParams data);
|
void PostEvent(EventParams data);
|
||||||
|
|
||||||
|
void Suspend();
|
||||||
|
void Resume();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Process the next event queued for this script
|
/// Process the next event queued for this script
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -95,6 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
private bool m_startedFromSavedState;
|
private bool m_startedFromSavedState;
|
||||||
private UUID m_CurrentStateHash;
|
private UUID m_CurrentStateHash;
|
||||||
private UUID m_RegionID;
|
private UUID m_RegionID;
|
||||||
|
private bool m_Suspended = false;
|
||||||
|
|
||||||
private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>
|
private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>
|
||||||
m_LineMap;
|
m_LineMap;
|
||||||
|
@ -638,6 +639,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public object EventProcessor()
|
public object EventProcessor()
|
||||||
{
|
{
|
||||||
|
if (m_Suspended)
|
||||||
|
return 0;
|
||||||
|
|
||||||
lock (m_Script)
|
lock (m_Script)
|
||||||
{
|
{
|
||||||
EventParams data = null;
|
EventParams data = null;
|
||||||
|
@ -1011,5 +1015,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
|
||||||
{
|
{
|
||||||
get { return m_RegionID; }
|
get { return m_RegionID; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Suspend()
|
||||||
|
{
|
||||||
|
m_Suspended = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Resume()
|
||||||
|
{
|
||||||
|
m_Suspended = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1488,5 +1488,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
return new ArrayList();
|
return new ArrayList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SuspendScript(UUID itemID)
|
||||||
|
{
|
||||||
|
IScriptInstance instance = GetInstance(itemID);
|
||||||
|
if (instance == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
instance.Suspend();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResumeScript(UUID itemID)
|
||||||
|
{
|
||||||
|
IScriptInstance instance = GetInstance(itemID);
|
||||||
|
if (instance == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
instance.Resume();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,18 +176,7 @@ namespace OpenSim.Server.Handlers.UserAccounts
|
||||||
|
|
||||||
byte[] StoreAccount(Dictionary<string, object> request)
|
byte[] StoreAccount(Dictionary<string, object> request)
|
||||||
{
|
{
|
||||||
//if (!request.ContainsKey("account"))
|
// No can do. No changing user accounts from remote sims
|
||||||
// return FailureResult();
|
|
||||||
//if (request["account"] == null)
|
|
||||||
// return FailureResult();
|
|
||||||
//if (!(request["account"] is Dictionary<string, object>))
|
|
||||||
// return FailureResult();
|
|
||||||
|
|
||||||
UserAccount account = new UserAccount(request);
|
|
||||||
|
|
||||||
if (m_UserAccountService.StoreUserAccount(account))
|
|
||||||
return SuccessResult();
|
|
||||||
|
|
||||||
return FailureResult();
|
return FailureResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ namespace OpenSim.Server
|
||||||
protected static List<IServiceConnector> m_ServiceConnectors =
|
protected static List<IServiceConnector> m_ServiceConnectors =
|
||||||
new List<IServiceConnector>();
|
new List<IServiceConnector>();
|
||||||
|
|
||||||
static int Main(string[] args)
|
public static int Main(string[] args)
|
||||||
{
|
{
|
||||||
m_Server = new HttpServerBase("R.O.B.U.S.T.", args);
|
m_Server = new HttpServerBase("R.O.B.U.S.T.", args);
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,11 @@ namespace OpenSim.Services.AssetService
|
||||||
return m_Database.GetAsset(assetID);
|
return m_Database.GetAsset(assetID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBase GetCached(string id)
|
||||||
|
{
|
||||||
|
return Get(id);
|
||||||
|
}
|
||||||
|
|
||||||
public AssetMetadata GetMetadata(string id)
|
public AssetMetadata GetMetadata(string id)
|
||||||
{
|
{
|
||||||
UUID assetID;
|
UUID assetID;
|
||||||
|
|
|
@ -111,6 +111,14 @@ namespace OpenSim.Services.Connectors
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBase GetCached(string id)
|
||||||
|
{
|
||||||
|
if (m_Cache != null)
|
||||||
|
return m_Cache.Get(id);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public AssetMetadata GetMetadata(string id)
|
public AssetMetadata GetMetadata(string id)
|
||||||
{
|
{
|
||||||
if (m_Cache != null)
|
if (m_Cache != null)
|
||||||
|
|
|
@ -116,6 +116,20 @@ namespace OpenSim.Services.Connectors
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBase GetCached(string id)
|
||||||
|
{
|
||||||
|
string url = string.Empty;
|
||||||
|
string assetID = string.Empty;
|
||||||
|
|
||||||
|
if (StringToUrlAndAssetID(id, out url, out assetID))
|
||||||
|
{
|
||||||
|
IAssetService connector = GetConnector(url);
|
||||||
|
return connector.GetCached(assetID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public AssetMetadata GetMetadata(string id)
|
public AssetMetadata GetMetadata(string id)
|
||||||
{
|
{
|
||||||
string url = string.Empty;
|
string url = string.Empty;
|
||||||
|
|
|
@ -112,60 +112,24 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
|
|
||||||
public AssetBase Get(string id)
|
public AssetBase Get(string id)
|
||||||
{
|
{
|
||||||
AssetBase asset = null;
|
|
||||||
|
|
||||||
// Cache fetch
|
// Cache fetch
|
||||||
if (m_cache != null)
|
if (m_cache != null)
|
||||||
{
|
{
|
||||||
asset = m_cache.Get(id);
|
AssetBase asset = m_cache.Get(id);
|
||||||
if (asset != null)
|
if (asset != null)
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
Uri url;
|
return GetRemote(id);
|
||||||
|
|
||||||
// Determine if id is an absolute URL or a grid-relative UUID
|
|
||||||
if (!Uri.TryCreate(id, UriKind.Absolute, out url))
|
|
||||||
url = new Uri(m_serverUrl + id);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
HttpWebRequest request = UntrustedHttpWebRequest.Create(url);
|
|
||||||
|
|
||||||
using (WebResponse response = request.GetResponse())
|
|
||||||
{
|
|
||||||
using (Stream responseStream = response.GetResponseStream())
|
|
||||||
{
|
|
||||||
string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty;
|
|
||||||
|
|
||||||
// Create the asset object
|
|
||||||
asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID);
|
|
||||||
|
|
||||||
UUID assetID;
|
|
||||||
if (UUID.TryParse(id, out assetID))
|
|
||||||
asset.FullID = assetID;
|
|
||||||
|
|
||||||
// Grab the asset data from the response stream
|
|
||||||
using (MemoryStream stream = new MemoryStream())
|
|
||||||
{
|
|
||||||
responseStream.CopyTo(stream, Int32.MaxValue);
|
|
||||||
asset.Data = stream.ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cache store
|
public AssetBase GetCached(string id)
|
||||||
if (m_cache != null && asset != null)
|
|
||||||
m_cache.Cache(asset);
|
|
||||||
|
|
||||||
return asset;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
{
|
||||||
m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message);
|
if (m_cache != null)
|
||||||
|
return m_cache.Get(id);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get an asset's metadata
|
/// Get an asset's metadata
|
||||||
|
@ -245,10 +209,21 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
/// <returns>True if the id was parseable, false otherwise</returns>
|
/// <returns>True if the id was parseable, false otherwise</returns>
|
||||||
public bool Get(string id, Object sender, AssetRetrieved handler)
|
public bool Get(string id, Object sender, AssetRetrieved handler)
|
||||||
{
|
{
|
||||||
|
// Cache fetch
|
||||||
|
if (m_cache != null)
|
||||||
|
{
|
||||||
|
AssetBase asset = m_cache.Get(id);
|
||||||
|
if (asset != null)
|
||||||
|
{
|
||||||
|
handler(id, sender, asset);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Util.FireAndForget(
|
Util.FireAndForget(
|
||||||
delegate(object o)
|
delegate(object o)
|
||||||
{
|
{
|
||||||
AssetBase asset = Get(id);
|
AssetBase asset = GetRemote(id);
|
||||||
handler(id, sender, asset);
|
handler(id, sender, asset);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -406,5 +381,53 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion IAssetService
|
#endregion IAssetService
|
||||||
|
|
||||||
|
private AssetBase GetRemote(string id)
|
||||||
|
{
|
||||||
|
AssetBase asset = null;
|
||||||
|
Uri url;
|
||||||
|
|
||||||
|
// Determine if id is an absolute URL or a grid-relative UUID
|
||||||
|
if (!Uri.TryCreate(id, UriKind.Absolute, out url))
|
||||||
|
url = new Uri(m_serverUrl + id);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HttpWebRequest request = UntrustedHttpWebRequest.Create(url);
|
||||||
|
|
||||||
|
using (WebResponse response = request.GetResponse())
|
||||||
|
{
|
||||||
|
using (Stream responseStream = response.GetResponseStream())
|
||||||
|
{
|
||||||
|
string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty;
|
||||||
|
|
||||||
|
// Create the asset object
|
||||||
|
asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID);
|
||||||
|
|
||||||
|
UUID assetID;
|
||||||
|
if (UUID.TryParse(id, out assetID))
|
||||||
|
asset.FullID = assetID;
|
||||||
|
|
||||||
|
// Grab the asset data from the response stream
|
||||||
|
using (MemoryStream stream = new MemoryStream())
|
||||||
|
{
|
||||||
|
responseStream.CopyTo(stream, Int32.MaxValue);
|
||||||
|
asset.Data = stream.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache store
|
||||||
|
if (m_cache != null && asset != null)
|
||||||
|
m_cache.Cache(asset);
|
||||||
|
|
||||||
|
return asset;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,6 +104,8 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
|
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
|
||||||
if (response["Success"].AsBoolean() && response["Identities"] is OSDArray)
|
if (response["Success"].AsBoolean() && response["Identities"] is OSDArray)
|
||||||
{
|
{
|
||||||
|
bool md5hashFound = false;
|
||||||
|
|
||||||
OSDArray identities = (OSDArray)response["Identities"];
|
OSDArray identities = (OSDArray)response["Identities"];
|
||||||
for (int i = 0; i < identities.Count; i++)
|
for (int i = 0; i < identities.Count; i++)
|
||||||
{
|
{
|
||||||
|
@ -114,13 +116,19 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
{
|
{
|
||||||
string credential = identity["Credential"].AsString();
|
string credential = identity["Credential"].AsString();
|
||||||
|
|
||||||
if (password == credential || "$1$" + Utils.MD5String(password) == credential)
|
if (password == credential || "$1$" + Utils.MD5String(password) == credential || Utils.MD5String(password) == credential)
|
||||||
return Authorize(principalID);
|
return Authorize(principalID);
|
||||||
|
|
||||||
|
md5hashFound = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.Warn("[SIMIAN AUTH CONNECTOR]: Authentication failed for " + principalID);
|
if (md5hashFound)
|
||||||
|
m_log.Warn("[SIMIAN AUTH CONNECTOR]: Authentication failed for " + principalID + " using md5hash $1$" + Utils.MD5String(password));
|
||||||
|
else
|
||||||
|
m_log.Warn("[SIMIAN AUTH CONNECTOR]: Authentication failed for " + principalID + ", no md5hash identity found");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -583,6 +583,14 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
{ "Permissions", permissions }
|
{ "Permissions", permissions }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Add different asset type only if it differs from inventory type
|
||||||
|
// (needed for links)
|
||||||
|
string invContentType = SLUtil.SLInvTypeToContentType(item.InvType);
|
||||||
|
string assetContentType = SLUtil.SLAssetTypeToContentType(item.AssetType);
|
||||||
|
|
||||||
|
if (invContentType != assetContentType)
|
||||||
|
extraData["LinkedItemType"] = OSD.FromString(assetContentType);
|
||||||
|
|
||||||
NameValueCollection requestArgs = new NameValueCollection
|
NameValueCollection requestArgs = new NameValueCollection
|
||||||
{
|
{
|
||||||
{ "RequestMethod", "AddInventoryItem" },
|
{ "RequestMethod", "AddInventoryItem" },
|
||||||
|
@ -593,6 +601,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
{ "Name", item.Name },
|
{ "Name", item.Name },
|
||||||
{ "Description", item.Description },
|
{ "Description", item.Description },
|
||||||
{ "CreatorID", item.CreatorId },
|
{ "CreatorID", item.CreatorId },
|
||||||
|
{ "ContentType", invContentType },
|
||||||
{ "ExtraData", OSDParser.SerializeJsonString(extraData) }
|
{ "ExtraData", OSDParser.SerializeJsonString(extraData) }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -781,6 +790,9 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
invItem.GroupPermissions = perms["GroupMask"].AsUInteger();
|
invItem.GroupPermissions = perms["GroupMask"].AsUInteger();
|
||||||
invItem.NextPermissions = perms["NextOwnerMask"].AsUInteger();
|
invItem.NextPermissions = perms["NextOwnerMask"].AsUInteger();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (extraData.ContainsKey("LinkedItemType"))
|
||||||
|
invItem.AssetType = SLUtil.ContentTypeToSLAssetType(extraData["LinkedItemType"].AsString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (invItem.BasePermissions == 0)
|
if (invItem.BasePermissions == 0)
|
||||||
|
|
|
@ -395,7 +395,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve sessions for " + userID + ": " + response["Message"].AsString());
|
m_log.Debug("[SIMIAN PRESENCE CONNECTOR]: No session returned for " + userID + ": " + response["Message"].AsString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -187,7 +187,7 @@ namespace OpenSim.Services.Connectors
|
||||||
return accounts;
|
return accounts;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool StoreUserAccount(UserAccount data)
|
public virtual bool StoreUserAccount(UserAccount data)
|
||||||
{
|
{
|
||||||
Dictionary<string, object> sendData = new Dictionary<string, object>();
|
Dictionary<string, object> sendData = new Dictionary<string, object>();
|
||||||
//sendData["SCOPEID"] = scopeID.ToString();
|
//sendData["SCOPEID"] = scopeID.ToString();
|
||||||
|
|
|
@ -51,7 +51,15 @@ namespace OpenSim.Services.Interfaces
|
||||||
byte[] GetData(string id);
|
byte[] GetData(string id);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get an asset asynchronously
|
/// Synchronously fetches an asset from the local cache only
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">Asset ID</param>
|
||||||
|
/// <returns>The fetched asset, or null if it did not exist in the local cache</returns>
|
||||||
|
AssetBase GetCached(string id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get an asset synchronously or asynchronously (depending on whether
|
||||||
|
/// it is locally cached) and fire a callback with the fetched asset
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id">The asset id</param>
|
/// <param name="id">The asset id</param>
|
||||||
/// <param name="sender">Represents the requester. Passed back via the handler</param>
|
/// <param name="sender">Represents the requester. Passed back via the handler</param>
|
||||||
|
|
|
@ -134,6 +134,10 @@ namespace OpenSim.Services.UserAccountService
|
||||||
u.UserTitle = d.Data["UserTitle"].ToString();
|
u.UserTitle = d.Data["UserTitle"].ToString();
|
||||||
else
|
else
|
||||||
u.UserTitle = string.Empty;
|
u.UserTitle = string.Empty;
|
||||||
|
if (d.Data.ContainsKey("UserLevel") && d.Data["UserLevel"] != null)
|
||||||
|
Int32.TryParse(d.Data["UserLevel"], out u.UserLevel);
|
||||||
|
if (d.Data.ContainsKey("UserFlags") && d.Data["UserFlags"] != null)
|
||||||
|
Int32.TryParse(d.Data["UserFlags"], out u.UserFlags);
|
||||||
|
|
||||||
if (d.Data.ContainsKey("ServiceURLs") && d.Data["ServiceURLs"] != null)
|
if (d.Data.ContainsKey("ServiceURLs") && d.Data["ServiceURLs"] != null)
|
||||||
{
|
{
|
||||||
|
@ -218,6 +222,10 @@ namespace OpenSim.Services.UserAccountService
|
||||||
d.Data = new Dictionary<string, string>();
|
d.Data = new Dictionary<string, string>();
|
||||||
d.Data["Email"] = data.Email;
|
d.Data["Email"] = data.Email;
|
||||||
d.Data["Created"] = data.Created.ToString();
|
d.Data["Created"] = data.Created.ToString();
|
||||||
|
d.Data["UserLevel"] = data.UserLevel.ToString();
|
||||||
|
d.Data["UserFlags"] = data.UserFlags.ToString();
|
||||||
|
if (data.UserTitle != null)
|
||||||
|
d.Data["UserTitle"] = data.UserTitle.ToString();
|
||||||
|
|
||||||
List<string> parts = new List<string>();
|
List<string> parts = new List<string>();
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,11 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBase GetCached(string id)
|
||||||
|
{
|
||||||
|
return Get(id);
|
||||||
|
}
|
||||||
|
|
||||||
public AssetMetadata GetMetadata(string id)
|
public AssetMetadata GetMetadata(string id)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
|
|
|
@ -141,6 +141,7 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
public event Action<UUID> OnRemoveAvatar;
|
public event Action<UUID> OnRemoveAvatar;
|
||||||
|
|
||||||
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
public event CreateNewInventoryItem OnCreateNewInventoryItem;
|
||||||
|
public event LinkInventoryItem OnLinkInventoryItem;
|
||||||
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
public event CreateInventoryFolder OnCreateNewInventoryFolder;
|
||||||
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
public event UpdateInventoryFolder OnUpdateInventoryFolder;
|
||||||
public event MoveInventoryFolder OnMoveInventoryFolder;
|
public event MoveInventoryFolder OnMoveInventoryFolder;
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* 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 log4net;
|
||||||
|
|
||||||
|
namespace Robust._32BitLaunch
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
System.Console.WriteLine("32-bit OpenSim executor");
|
||||||
|
System.Console.WriteLine("-----------------------");
|
||||||
|
System.Console.WriteLine("");
|
||||||
|
System.Console.WriteLine("This application is compiled for 32-bit CPU and will run under WOW32 or similar.");
|
||||||
|
System.Console.WriteLine("All 64-bit incompatibilities should be gone.");
|
||||||
|
System.Console.WriteLine("");
|
||||||
|
System.Threading.Thread.Sleep(300);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
global::OpenSim.Server.OpenSimServer.Main(args);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.Console.WriteLine("OpenSim threw an exception:");
|
||||||
|
System.Console.WriteLine(ex.ToString());
|
||||||
|
System.Console.WriteLine("");
|
||||||
|
System.Console.WriteLine("Application will now terminate!");
|
||||||
|
System.Console.WriteLine("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* 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.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("Robust.32BitLaunch")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("http://opensimulator.org")]
|
||||||
|
[assembly: AssemblyProduct("Robust.32BitLaunch")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright (c) 2008")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("5072e919-46ab-47e6-8a63-08108324ccdf")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("0.6.3.*")]
|
||||||
|
[assembly: AssemblyVersion("0.6.3.*")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>9.0.30729</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{595D67F3-B413-4A43-8568-5B5930E3B31D}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>Robust._32BitLaunch</RootNamespace>
|
||||||
|
<AssemblyName>Robust.32BitLaunch</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>..\..\..\bin\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\bin\log4net.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="OpenSim.Server, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\bin\OpenSim.Server.exe</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core">
|
||||||
|
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual C# Express 2008
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Robust.32BitLaunch", "Robust.32BitLaunch.csproj", "{595D67F3-B413-4A43-8568-5B5930E3B31D}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{595D67F3-B413-4A43-8568-5B5930E3B31D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{595D67F3-B413-4A43-8568-5B5930E3B31D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{595D67F3-B413-4A43-8568-5B5930E3B31D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{595D67F3-B413-4A43-8568-5B5930E3B31D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
|
@ -59,7 +59,8 @@ Once you are presented with a prompt that looks like:
|
||||||
|
|
||||||
You have successfully started OpenSim.
|
You have successfully started OpenSim.
|
||||||
|
|
||||||
Before you can log in you will need to create a user account. You can do
|
Before you can log in you will need to create a user account if you didn't already create
|
||||||
|
your user as the "Master Avatar" during the region configuration stage. You can do
|
||||||
this by running the "create user" command on the OpenSim console. This will
|
this by running the "create user" command on the OpenSim console. This will
|
||||||
ask you a series of questions such as first name, last name and password.
|
ask you a series of questions such as first name, last name and password.
|
||||||
|
|
||||||
|
|
|
@ -1176,10 +1176,18 @@
|
||||||
;MessagingModule = GroupsMessagingModule
|
;MessagingModule = GroupsMessagingModule
|
||||||
;MessagingEnabled = true
|
;MessagingEnabled = true
|
||||||
|
|
||||||
; Service connector to Groups Service [Select One]
|
; Service connector to Groups Service [Select One] ServicesConnectorModule
|
||||||
; XmlRpc Service Connector to the Flotsam XmlRpc Groups Service Implementation
|
|
||||||
|
|
||||||
|
; Simian Grid Service for Groups
|
||||||
|
;ServicesConnectorModule = SimianGroupsServicesConnector
|
||||||
|
;GroupsServerURI = http://mygridserver.com:82/Grid/
|
||||||
|
|
||||||
|
; XmlRpc Service Connector to the Flotsam XmlRpc Groups Service settings
|
||||||
;ServicesConnectorModule = XmlRpcGroupsServicesConnector
|
;ServicesConnectorModule = XmlRpcGroupsServicesConnector
|
||||||
;XmlRpcServiceURL = http://yourxmlrpcserver.com/xmlrpc.php
|
;GroupsServerURI = http://yourxmlrpcserver.com/xmlrpc.php
|
||||||
|
|
||||||
|
; XmlRpc Service Settings
|
||||||
;XmlRpcServiceReadKey = 1234
|
;XmlRpcServiceReadKey = 1234
|
||||||
;XmlRpcServiceWriteKey = 1234
|
;XmlRpcServiceWriteKey = 1234
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
|
||||||
|
</configSections>
|
||||||
|
<runtime>
|
||||||
|
<gcConcurrent enabled="true" />
|
||||||
|
<gcServer enabled="true" />
|
||||||
|
</runtime>
|
||||||
|
<appSettings>
|
||||||
|
</appSettings>
|
||||||
|
<log4net>
|
||||||
|
<appender name="Console" type="OpenSim.Framework.Console.OpenSimAppender, OpenSim.Framework.Console">
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date{HH:mm:ss} - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
|
||||||
|
<file value="Robust.32BitLaunch.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<layout type="log4net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date %-5level - %logger %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root>
|
||||||
|
<level value="DEBUG" />
|
||||||
|
<appender-ref ref="Console" />
|
||||||
|
<appender-ref ref="LogFileAppender" />
|
||||||
|
</root>
|
||||||
|
</log4net>
|
||||||
|
</configuration>
|
|
@ -52,6 +52,12 @@
|
||||||
;
|
;
|
||||||
FriendsServerURI = "http://mygridserver.com:8003"
|
FriendsServerURI = "http://mygridserver.com:8003"
|
||||||
|
|
||||||
|
[Groups]
|
||||||
|
;
|
||||||
|
; change this to your grid-wide groups server
|
||||||
|
;
|
||||||
|
GroupsServerURI = "http://mygridserver.com:82/Grid/"
|
||||||
|
|
||||||
|
|
||||||
[Modules]
|
[Modules]
|
||||||
;; Choose 0 or 1 cache modules, and the corresponding config file, if it exists.
|
;; Choose 0 or 1 cache modules, and the corresponding config file, if it exists.
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
; UserAccountServerURI = "http://www.mygrid.com/Grid/"
|
; UserAccountServerURI = "http://www.mygrid.com/Grid/"
|
||||||
; AuthenticationServerURI = "http://www.mygrid.com/Grid/"
|
; AuthenticationServerURI = "http://www.mygrid.com/Grid/"
|
||||||
; FriendsServerURI = "http://www.mygrid.com/Grid/"
|
; FriendsServerURI = "http://www.mygrid.com/Grid/"
|
||||||
|
; GroupsServerURI = "http://www.mygrid.com/Grid/"
|
||||||
|
|
||||||
[Includes]
|
[Includes]
|
||||||
Include-Common = "config-include/GridCommon.ini"
|
Include-Common = "config-include/GridCommon.ini"
|
||||||
|
@ -55,3 +56,12 @@
|
||||||
[AssetService]
|
[AssetService]
|
||||||
DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll"
|
DefaultAssetLoader = "OpenSim.Framework.AssetLoader.Filesystem.dll"
|
||||||
AssetLoaderArgs = "assets/AssetSets.xml"
|
AssetLoaderArgs = "assets/AssetSets.xml"
|
||||||
|
|
||||||
|
[Groups]
|
||||||
|
Enabled = true
|
||||||
|
Module = GroupsModule
|
||||||
|
DebugEnabled = false
|
||||||
|
NoticesEnabled = true
|
||||||
|
MessagingModule = GroupsMessagingModule
|
||||||
|
MessagingEnabled = true
|
||||||
|
ServicesConnectorModule = SimianGroupsServicesConnector
|
||||||
|
|
Loading…
Reference in New Issue