Create a generic way for passing constructor args to plugins

The old syntax didn't allow for any parameters except for services
listed in the ServiceList. Now, services loaded by other services can
also be made to use different ini sections or have additional paramters.
Syntax is: [<ExtraParam>@]...<DllName>[:<ClassName>]
melanie
Melanie Thielker 2017-01-02 17:47:20 +00:00
parent 7abb0477ed
commit f03a6bbc61
4 changed files with 32 additions and 6 deletions

View File

@ -242,6 +242,18 @@ namespace OpenSim.Server.Base
className = parts[2];
}
// Handle extra string arguments in a more generic way
if (dllName.Contains("@"))
{
string[] dllNameParts = dllName.Split(new char[] {'@'});
dllName = dllNameParts[dllNameParts.Length - 1];
List<Object> argList = new List<Object>(args);
for (int i = 0 ; i < dllNameParts.Length - 1 ; ++i)
argList.Add(dllNameParts[i]);
args = argList.ToArray();
}
return LoadPlugin<T>(dllName, className, args);
}

View File

@ -63,6 +63,7 @@ namespace OpenSim.Services.Connectors
/// In this case, -1 is default timeout (100 seconds), not infinite.
/// </remarks>
private int m_requestTimeoutSecs = -1;
private string m_configName = "InventoryService";
private const double CACHE_EXPIRATION_SECONDS = 20.0;
private static ExpiringCache<UUID, InventoryItemBase> m_ItemCache = new ExpiringCache<UUID,InventoryItemBase>();
@ -76,6 +77,13 @@ namespace OpenSim.Services.Connectors
m_ServerURI = serverURI.TrimEnd('/');
}
public XInventoryServicesConnector(IConfigSource source, string configName)
: base(source, configName)
{
m_configName = configName;
Initialise(source);
}
public XInventoryServicesConnector(IConfigSource source)
: base(source, "InventoryService")
{
@ -84,10 +92,10 @@ namespace OpenSim.Services.Connectors
public virtual void Initialise(IConfigSource source)
{
IConfig config = source.Configs["InventoryService"];
IConfig config = source.Configs[m_configName];
if (config == null)
{
m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini");
m_log.ErrorFormat("[INVENTORY CONNECTOR]: {0} missing from OpenSim.ini", m_configName);
throw new Exception("Inventory connector init error");
}

View File

@ -180,9 +180,14 @@ namespace OpenSim.Services.LLLoginService
string hgInvServicePlugin = m_LoginServerConfig.GetString("HGInventoryServicePlugin", String.Empty);
if (hgInvServicePlugin != string.Empty)
{
// TODO: Remove HGInventoryServiceConstructorArg after 0.9 release
string hgInvServiceArg = m_LoginServerConfig.GetString("HGInventoryServiceConstructorArg", String.Empty);
Object[] args2 = new Object[] { config, hgInvServiceArg };
m_HGInventoryService = ServerUtils.LoadPlugin<IInventoryService>(hgInvServicePlugin, args2);
if (hgInvServiceArg != String.Empty)
{
m_log.Warn("[LLOGIN SERVICE]: You are using HGInventoryServiceConstructorArg, which is deprecated. See example file for correct syntax.");
hgInvServicePlugin = hgInvServiceArg + "@" + hgInvServicePlugin;
}
m_HGInventoryService = ServerUtils.LoadPlugin<IInventoryService>(hgInvServicePlugin, args);
}
//

View File

@ -488,8 +488,9 @@
UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
; This inventory service will be used to initialize the user's inventory
HGInventoryServicePlugin = "OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"
HGInventoryServiceConstructorArg = "HGInventoryService"
HGInventoryServicePlugin = "HGInventoryService@OpenSim.Services.HypergridService.dll:HGSuitcaseInventoryService"
; NOTE: HGInventoryServiceConstructorArg is deprecated. For now it will work, but see above
; for the correct method if passing additional arguments.
;; end hypergrid
; Ask co-operative viewers to use a different currency name