Compare commits

...

5 Commits

Author SHA1 Message Date
UbitUmarov
b7da2feedd add cosmetics on AgentTransactionModule 2026-05-12 04:22:34 +01:00
UbitUmarov
88ef8a9dbe add Util.GetFirstConfigVarFromSections<T>(..) While GetConfigVarFromSections<T> scans all sections and returns the last value found, this returns as soon a value is found. So sections should be order from high priority to lower 2026-05-12 03:18:26 +01:00
UbitUmarov
9db019b2cc still read upload level from teh old position in Startup config, just in case 2026-05-11 17:46:57 +01:00
Ubit Umarov
f1b74cde60 Merge pull request #34 from holoneon/patch-1
Update AssetTransactionModule.cs
2026-05-11 17:15:41 +01:00
Fiona Sweet
d6fd012e65 Update AssetTransactionModule.cs
LevelUpload is defined in [Permissions] in OpenSimDefaults.ini, not [Startup]
2026-05-11 07:14:56 -07:00
3 changed files with 126 additions and 32 deletions

View File

@@ -2232,9 +2232,9 @@ namespace OpenSim.Framework
/// <returns></returns>
public static T GetConfigVarFromSections<T>(IConfigSource config, string varname, string[] sections, object val)
{
foreach (string section in sections.AsSpan())
for (int i = 0 ; i < sections.Length; i++)
{
IConfig cnf = config.Configs[section];
IConfig cnf = config.Configs[sections[i]];
if (cnf == null)
continue;
@@ -2252,6 +2252,119 @@ namespace OpenSim.Framework
return (T)val;
}
/// <summary>
/// Gets the value of a configuration variable by looking into
/// multiple sections in order. Returns as soon one is found, ignoring other sections
/// </summary>
/// <remarks>
/// If no value is found then the given default value is returned
/// </remarks>
/// <typeparam name="T">Type of the variable</typeparam>
/// <param name="config">The configuration object</param>
/// <param name="varname">The configuration variable</param>
/// <param name="sections">Ordered sequence of sections to look at</param>
/// <param name="val">Default value</param>
/// <returns></returns>
public static T GetFirstConfigVarFromSections<T>(IConfigSource config, string varname, string[] sections, object val)
{
for (int i = 0 ; i < sections.Length; i++)
{
IConfig cnf = config.Configs[sections[i]];
if (cnf == null)
continue;
string text = cnf.Get(varname);
if (!string.IsNullOrEmpty(text))
{
if (typeof(T) == typeof(string))
return Unsafe.As<string, T>(ref text);
if (typeof(T) == typeof(bool))
{
bool b = bool.Parse(text);
return Unsafe.As<bool, T>(ref b);
}
if (typeof(T) == typeof(int))
{
int ti = int.Parse(text);
return Unsafe.As<int, T>(ref ti);
}
if (typeof(T) == typeof(float))
{
float f = float.Parse(text);
return Unsafe.As<float, T>(ref f);
}
if (typeof(T) == typeof(double))
{
double d = double.Parse(text);
return Unsafe.As<double, T>(ref d);
}
}
}
return val == null ? default : (T) val;
}
/// <summary>
/// Gets the value of a configuration variable by looking into
/// multiple sections in order. Returns as soon one is found, ignoring other sections
/// </summary>
/// <remarks>
/// If no value is found then the default value of T is returned
/// </remarks>
/// <typeparam name="T">Type of the variable</typeparam>
/// <param name="config">The configuration object</param>
/// <param name="varname">The configuration variable</param>
/// <param name="sections">Ordered sequence of sections to look at</param>
/// <returns></returns>
public static T GetFirstConfigVarFromSections<T>(IConfigSource config, string varname, string[] sections)
{
for (int i = 0 ; i < sections.Length; i++)
{
IConfig cnf = config.Configs[sections[i]];
if (cnf == null)
continue;
string text = cnf.Get(varname);
if (!string.IsNullOrEmpty(text))
{
if (typeof(T) == typeof(string))
return Unsafe.As<string, T>(ref text);
if (typeof(T) == typeof(bool))
{
bool b = bool.Parse(text);
return Unsafe.As<bool, T>(ref b);
}
if (typeof(T) == typeof(int))
{
int ti = int.Parse(text);
return Unsafe.As<int, T>(ref ti);
}
if (typeof(T) == typeof(float))
{
float f = float.Parse(text);
return Unsafe.As<float, T>(ref f);
}
if (typeof(T) == typeof(double))
{
double d = double.Parse(text);
return Unsafe.As<double, T>(ref d);
}
}
}
return default;
}
public static void MergeEnvironmentToConfig(IConfigSource ConfigSource)
{
IConfig enVars = ConfigSource.Configs["Environment"];

View File

@@ -100,16 +100,7 @@ namespace OpenSim.Region.ClientStack.Linden
IConfigSource config = m_Scene.Config;
if (config is not null)
{
IConfig sconfig = config.Configs["Startup"];
if (sconfig is not null)
ConfigOptions.levelUpload = sconfig.GetInt("LevelUpload", 0);
if (ConfigOptions.levelUpload == 0)
{
IConfig pconfig = config.Configs["Permissions"];
if (pconfig is not null)
ConfigOptions.levelUpload = pconfig.GetInt("LevelUpload", 0);
}
ConfigOptions.levelUpload = Util.GetFirstConfigVarFromSections<int>(config,"LevelUpload",["Permissions", "Startup"], 0);
IConfig appearanceConfig = config.Configs["Appearance"];
if (appearanceConfig is not null)

View File

@@ -35,6 +35,7 @@ using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using Mono.Addins;
using System.Runtime.InteropServices;
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{
@@ -51,18 +52,14 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
/// <summary>
/// Each agent has its own singleton collection of transactions
/// </summary>
private Dictionary<UUID, AgentAssetTransactions> AgentTransactions =
new Dictionary<UUID, AgentAssetTransactions>();
private Dictionary<UUID, AgentAssetTransactions> AgentTransactions = [];
#region Region Module interface
public void Initialise(IConfigSource source)
{
IConfig sconfig = source.Configs["Startup"];
if (sconfig != null)
{
m_levelUpload = sconfig.GetInt("LevelUpload", 0);
}
if(source != null)
m_levelUpload = Util.GetFirstConfigVarFromSections<int>(source,"LevelUpload",["Permissions", "Startup"], 0);
}
public void AddRegion(Scene scene)
@@ -113,16 +110,11 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{
lock (AgentTransactions)
{
if (!AgentTransactions.ContainsKey(userID))
{
AgentAssetTransactions transactions =
new AgentAssetTransactions(userID, m_Scene,
m_dumpAssetsToFile);
ref AgentAssetTransactions value = ref CollectionsMarshal.GetValueRefOrAddDefault(AgentTransactions, userID, out bool exists);
if (!exists)
value = new AgentAssetTransactions(userID, m_Scene, m_dumpAssetsToFile);
AgentTransactions.Add(userID, transactions);
}
return AgentTransactions[userID];
return value;
}
}
@@ -217,8 +209,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
// "[ASSET TRANSACTION MODULE]: Called HandleTaskItemUpdateFromTransaction with item {0} in {1} for {2} in {3}",
// item.Name, part.Name, remoteClient.Name, m_Scene.RegionInfo.RegionName);
AgentAssetTransactions transactions =
GetUserTransactions(remoteClient.AgentId);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId);
transactions.RequestUpdateTaskInventoryItem(remoteClient, part,
transactionID, item);
@@ -247,9 +238,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
(AssetType)type == AssetType.Animation) &&
tempFile == false)
{
ScenePresence avatar = null;
Scene scene = (Scene)remoteClient.Scene;
scene.TryGetScenePresence(remoteClient.AgentId, out avatar);
scene.TryGetScenePresence(remoteClient.AgentId, out ScenePresence avatar);
// check user level
if (avatar != null)