Add plugin options to skip autoreload

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14654 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Michael Giagnocavo 2009-08-28 07:57:19 +00:00
parent ca8dfda04a
commit c6be531b4b
7 changed files with 55 additions and 19 deletions

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.4.0")]
[assembly: AssemblyFileVersion("1.0.4.0")]
[assembly: AssemblyVersion("1.0.5.0")]
[assembly: AssemblyFileVersion("1.0.5.0")]

View File

@ -133,7 +133,17 @@ namespace FreeSWITCH {
}
static void watcher_Changed(object sender, FileSystemEventArgs e) {
Action<string> queueFile = x => { lock (watcherLock) { watcherFiles.Add(x); } };
Action<string> queueFile = fileName => {
var currentPi = pluginInfos.FirstOrDefault(p => string.Compare(fileName, p.FileName, StringComparison.OrdinalIgnoreCase) == 0);
if (currentPi != null) {
var noReload = currentPi.Manager.ApiExecutors.Any(x => (x.PluginOptions & PluginOptions.NoAutoReload) == PluginOptions.NoAutoReload) ||
currentPi.Manager.AppExecutors.Any(x => (x.PluginOptions & PluginOptions.NoAutoReload) == PluginOptions.NoAutoReload);
if (noReload) return;
}
lock (watcherLock) {
watcherFiles.Add(fileName);
}
};
try {
if (!initialLoadComplete) return;
var file = e.FullPath;

View File

@ -88,4 +88,14 @@ namespace FreeSWITCH {
bool Load();
}
[Flags]
public enum PluginOptions {
None = 0,
NoAutoReload = 1,
}
public interface IPluginOptionsProvider {
PluginOptions GetOptions();
}
}

View File

@ -51,11 +51,15 @@ namespace FreeSWITCH {
public string Name { get { return name; } }
readonly string name;
protected PluginExecutor(string name, List<string> aliases) {
public PluginOptions PluginOptions { get { return pluginOptions; } }
readonly PluginOptions pluginOptions;
protected PluginExecutor(string name, List<string> aliases, PluginOptions pluginOptions) {
if (string.IsNullOrEmpty(name)) throw new ArgumentException("No name provided.");
if (aliases == null || aliases.Count == 0) throw new ArgumentException("No aliases provided.");
this.name = name;
this.aliases = aliases.Distinct().ToList();
this.pluginOptions = pluginOptions;
}
int useCount = 0;
@ -85,8 +89,8 @@ namespace FreeSWITCH {
readonly Func<IAppPlugin> createPlugin;
public AppPluginExecutor(string name, List<string> aliases, Func<IAppPlugin> creator)
: base(name, aliases) {
public AppPluginExecutor(string name, List<string> aliases, Func<IAppPlugin> creator, PluginOptions pluginOptions)
: base(name, aliases, pluginOptions) {
if (creator == null) throw new ArgumentNullException("Creator cannot be null.");
this.createPlugin = creator;
}
@ -117,8 +121,8 @@ namespace FreeSWITCH {
readonly Func<IApiPlugin> createPlugin;
public ApiPluginExecutor(string name, List<string> aliases, Func<IApiPlugin> creator)
: base(name, aliases) {
public ApiPluginExecutor(string name, List<string> aliases, Func<IApiPlugin> creator, PluginOptions pluginOptions)
: base(name, aliases, pluginOptions) {
if (creator == null) throw new ArgumentNullException("Creator cannot be null.");
this.createPlugin = creator;
}
@ -196,7 +200,7 @@ namespace FreeSWITCH {
var pluginTypes = allTypes.Where(x => ty.IsAssignableFrom(x) && !x.IsAbstract).ToList();
if (pluginTypes.Count == 0) return true;
foreach (var pt in pluginTypes) {
var load = ((ILoadNotificationPlugin)Activator.CreateInstance(pt, false));
var load = ((ILoadNotificationPlugin)Activator.CreateInstance(pt, true));
if (!load.Load()) {
Log.WriteLine(LogLevel.Notice, "Type {0} requested no loading. Assembly will not be loaded.", pt.FullName);
return false;
@ -205,20 +209,29 @@ namespace FreeSWITCH {
return true;
}
protected void AddApiPlugins(Type[] allTypes) {
protected PluginOptions GetOptions(Type[] allTypes) {
var ty = typeof(IPluginOptionsProvider);
var pluginTypes = allTypes.Where(x => ty.IsAssignableFrom(x) && !x.IsAbstract).ToList();
return pluginTypes.Aggregate(PluginOptions.None, (opts, t) => {
var x = ((IPluginOptionsProvider)Activator.CreateInstance(t, true));
return opts | x.GetOptions();
});
}
protected void AddApiPlugins(Type[] allTypes, PluginOptions pluginOptions) {
var iApiTy = typeof(IApiPlugin);
foreach (var ty in allTypes.Where(x => iApiTy.IsAssignableFrom(x) && !x.IsAbstract)) {
var del = CreateConstructorDelegate<IApiPlugin>(ty);
var exec = new ApiPluginExecutor(ty.FullName, new List<string> { ty.FullName, ty.Name }, del);
var exec = new ApiPluginExecutor(ty.FullName, new List<string> { ty.FullName, ty.Name }, del, pluginOptions);
this.ApiExecutors.Add(exec);
}
}
protected void AddAppPlugins(Type[] allTypes) {
protected void AddAppPlugins(Type[] allTypes, PluginOptions pluginOptions) {
var iAppTy = typeof(IAppPlugin);
foreach (var ty in allTypes.Where(x => iAppTy.IsAssignableFrom(x) && !x.IsAbstract)) {
var del = CreateConstructorDelegate<IAppPlugin>(ty);
var exec = new AppPluginExecutor(ty.FullName, new List<string> { ty.FullName, ty.Name }, del);
var exec = new AppPluginExecutor(ty.FullName, new List<string> { ty.FullName, ty.Name }, del, pluginOptions);
this.AppExecutors.Add(exec);
}
}
@ -283,8 +296,10 @@ namespace FreeSWITCH {
var allTypes = asm.GetExportedTypes();
if (!RunLoadNotify(allTypes)) return false;
AddApiPlugins(allTypes);
AddAppPlugins(allTypes);
var opts = GetOptions(allTypes);
AddApiPlugins(allTypes, opts);
AddAppPlugins(allTypes, opts);
return true;
}

View File

@ -161,14 +161,15 @@ namespace FreeSWITCH {
if (!RunLoadNotify(allTypes)) return false;
// Scripts can specify classes too
AddApiPlugins(allTypes);
AddAppPlugins(allTypes);
var opts = GetOptions(allTypes);
AddApiPlugins(allTypes, opts);
AddAppPlugins(allTypes, opts);
// Add the script executors
var name = Path.GetFileName(fileName);
var aliases = new List<string> { name };
this.ApiExecutors.Add(new ApiPluginExecutor(name, aliases, () => new ScriptApiWrapper(entryPoint)));
this.AppExecutors.Add(new AppPluginExecutor(name, aliases, () => new ScriptAppWrapper(entryPoint)));
this.ApiExecutors.Add(new ApiPluginExecutor(name, aliases, () => new ScriptApiWrapper(entryPoint), opts));
this.AppExecutors.Add(new AppPluginExecutor(name, aliases, () => new ScriptAppWrapper(entryPoint), opts));
return true;
}