diff --git a/src/mod/languages/mod_managed/managed/AssemblyInfo.cs b/src/mod/languages/mod_managed/managed/AssemblyInfo.cs index 321f10a320..6eb82b0f23 100644 --- a/src/mod/languages/mod_managed/managed/AssemblyInfo.cs +++ b/src/mod/languages/mod_managed/managed/AssemblyInfo.cs @@ -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")] diff --git a/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.dll b/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.dll index 3f24557bcc..8ccd645906 100644 Binary files a/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.dll and b/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.dll differ diff --git a/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.pdb b/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.pdb index bd1d5ef9aa..f8d5a98708 100644 Binary files a/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.pdb and b/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.pdb differ diff --git a/src/mod/languages/mod_managed/managed/Loader.cs b/src/mod/languages/mod_managed/managed/Loader.cs index c7c9cc12c6..52335563b5 100644 --- a/src/mod/languages/mod_managed/managed/Loader.cs +++ b/src/mod/languages/mod_managed/managed/Loader.cs @@ -133,7 +133,17 @@ namespace FreeSWITCH { } static void watcher_Changed(object sender, FileSystemEventArgs e) { - Action queueFile = x => { lock (watcherLock) { watcherFiles.Add(x); } }; + Action 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; diff --git a/src/mod/languages/mod_managed/managed/PluginInterfaces.cs b/src/mod/languages/mod_managed/managed/PluginInterfaces.cs index 06d2a38951..479d002775 100644 --- a/src/mod/languages/mod_managed/managed/PluginInterfaces.cs +++ b/src/mod/languages/mod_managed/managed/PluginInterfaces.cs @@ -88,4 +88,14 @@ namespace FreeSWITCH { bool Load(); } + [Flags] + public enum PluginOptions { + None = 0, + NoAutoReload = 1, + } + + public interface IPluginOptionsProvider { + PluginOptions GetOptions(); + } + } diff --git a/src/mod/languages/mod_managed/managed/PluginManager.cs b/src/mod/languages/mod_managed/managed/PluginManager.cs index 3d76b912a8..450f76e9c8 100644 --- a/src/mod/languages/mod_managed/managed/PluginManager.cs +++ b/src/mod/languages/mod_managed/managed/PluginManager.cs @@ -51,11 +51,15 @@ namespace FreeSWITCH { public string Name { get { return name; } } readonly string name; - protected PluginExecutor(string name, List aliases) { + public PluginOptions PluginOptions { get { return pluginOptions; } } + readonly PluginOptions pluginOptions; + + protected PluginExecutor(string name, List 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 createPlugin; - public AppPluginExecutor(string name, List aliases, Func creator) - : base(name, aliases) { + public AppPluginExecutor(string name, List aliases, Func 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 createPlugin; - public ApiPluginExecutor(string name, List aliases, Func creator) - : base(name, aliases) { + public ApiPluginExecutor(string name, List aliases, Func 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(ty); - var exec = new ApiPluginExecutor(ty.FullName, new List { ty.FullName, ty.Name }, del); + var exec = new ApiPluginExecutor(ty.FullName, new List { 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(ty); - var exec = new AppPluginExecutor(ty.FullName, new List { ty.FullName, ty.Name }, del); + var exec = new AppPluginExecutor(ty.FullName, new List { 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; } diff --git a/src/mod/languages/mod_managed/managed/ScriptPluginManager.cs b/src/mod/languages/mod_managed/managed/ScriptPluginManager.cs index 76fb84910c..ad8e3a11e6 100644 --- a/src/mod/languages/mod_managed/managed/ScriptPluginManager.cs +++ b/src/mod/languages/mod_managed/managed/ScriptPluginManager.cs @@ -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 { 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; }