diff --git a/Asterisk.2013/Asterisk.NET/Common.cs b/Asterisk.2013/Asterisk.NET/Common.cs index e88a0efb..93a62e18 100644 --- a/Asterisk.2013/Asterisk.NET/Common.cs +++ b/Asterisk.2013/Asterisk.NET/Common.cs @@ -18,8 +18,8 @@ public static class Common /// Line separator public const string LINE_SEPARATOR = "\r\n"; - public static Regex ASTERISK_VERSION = new Regex( "^Asterisk\\s+\\D*([0-9]+.[0-9]+.[0-9]+|[1-9][0-9]-r[0-9]+|[0-9]+.[0-9]+-cert[0-9]).*$", - RegexOptions.Compiled | RegexOptions.IgnoreCase ); + public static Regex ASTERISK_VERSION = new Regex("^(?:Output: ){0,1}Asterisk\\s+\\D*([0-9]+\\.[0-9]+\\.[0-9]+|[1-9][0-9]-r[0-9]+|[0-9]+\\.[0-9]+-cert[0-9]).*$", + RegexOptions.Compiled | RegexOptions.IgnoreCase ); public static Regex SHOW_VERSION_FILES_PATTERN = new Regex("^([\\S]+)\\s+Revision: ([0-9\\.]+)"); public static char[] RESPONSE_KEY_VALUE_SEPARATOR = {':'}; diff --git a/Asterisk.2013/Asterisk.NET/Manager/Action/ConfbridgeStartRecordAction.cs b/Asterisk.2013/Asterisk.NET/Manager/Action/ConfbridgeStartRecordAction.cs index 1caff0c2..86670ff5 100644 --- a/Asterisk.2013/Asterisk.NET/Manager/Action/ConfbridgeStartRecordAction.cs +++ b/Asterisk.2013/Asterisk.NET/Manager/Action/ConfbridgeStartRecordAction.cs @@ -26,6 +26,8 @@ public ConfbridgeStartRecordAction(string conference) public string Conference { get; set; } + public string RecordFile { get; set; } + public override string Action { get { return "ConfbridgeStartRecord"; } diff --git a/Asterisk.2013/Asterisk.NET/Manager/AsteriskVersion.cs b/Asterisk.2013/Asterisk.NET/Manager/AsteriskVersion.cs index e204a77d..a3e00b47 100644 --- a/Asterisk.2013/Asterisk.NET/Manager/AsteriskVersion.cs +++ b/Asterisk.2013/Asterisk.NET/Manager/AsteriskVersion.cs @@ -5,6 +5,7 @@ namespace AsterNET.Manager /// public enum AsteriskVersion { + Unknown = 0, ASTERISK_1_0 = 10, ASTERISK_1_2 = 12, ASTERISK_1_4 = 14, @@ -13,6 +14,11 @@ public enum AsteriskVersion ASTERISK_10 = 100, ASTERISK_11 = 110, ASTERISK_12 = 120, - ASTERISK_13 = 130 + ASTERISK_13 = 130, + ASTERISK_14 = 140, + ASTERISK_15 = 150, + ASTERISK_16 = 160, + ASTERISK_17 = 170, + ASTERISK_Newer = 999 } -} \ No newline at end of file +} diff --git a/Asterisk.2013/Asterisk.NET/Manager/ManagerConnection.cs b/Asterisk.2013/Asterisk.NET/Manager/ManagerConnection.cs index 54c23eb5..acea6221 100644 --- a/Asterisk.2013/Asterisk.NET/Manager/ManagerConnection.cs +++ b/Asterisk.2013/Asterisk.NET/Manager/ManagerConnection.cs @@ -71,7 +71,7 @@ public class ManagerConnection /// Default Slow Reconnect interval in milliseconds. private int reconnectIntervalMax = 10000; - public char[] VAR_DELIMITER = { '|' }; + public char[] VAR_DELIMITER = { '|' }; #endregion @@ -719,9 +719,10 @@ internal Thread CallerThread private void internalEventHandler(object sender, ManagerEvent e) { int eventHash = e.GetType().Name.GetHashCode(); - if (registeredEventHandlers.ContainsKey(eventHash)) + int userEventHash = typeof(UserEvent).Name.GetHashCode(); + if (registeredEventHandlers.TryGetValue(eventHash, out var currentEvent) + || (registeredEventHandlers.TryGetValue(userEventHash, out currentEvent) && typeof(UserEvent).IsAssignableFrom(e.GetType()))) { - var currentEvent = registeredEventHandlers[eventHash]; if (currentEvent(e)) { return; @@ -1012,102 +1013,130 @@ private void login(int timeout) #if LOGGER logger.Info("Determined Asterisk version: " + asteriskVersion); #endif - enableEvents = true; - ConnectEvent ce = new ConnectEvent(this); - ce.ProtocolIdentifier = this.protocolIdentifier; - DispatchEvent(ce); - } - else if (response is ManagerError) - throw new ManagerException("Unable login to Asterisk - " + response.Message); - else - throw new ManagerException("Unknown response during login to Asterisk - " + response.GetType().Name + " with message " + response.Message); - - } - #endregion - - #region determineVersion() - protected internal AsteriskVersion determineVersion() - { - Response.ManagerResponse response; - response = SendAction(new Action.CommandAction("core show version"), defaultResponseTimeout * 2); - if (response is Response.CommandResponse) - { - foreach (string line in ((Response.CommandResponse)response).Result) - { - foreach (Match m in Common.ASTERISK_VERSION.Matches(line)) - { - if (m.Groups.Count >= 2) - { - version = m.Groups[1].Value; - if (version.StartsWith("1.4.")) - { - VAR_DELIMITER = new char[] { '|' }; - return AsteriskVersion.ASTERISK_1_4; - } - else if (version.StartsWith("1.6.")) - { - VAR_DELIMITER = new char[] { '|' }; - return Manager.AsteriskVersion.ASTERISK_1_6; - } - else if (version.StartsWith("1.8.")) - { - VAR_DELIMITER = new char[] { '|' }; - return Manager.AsteriskVersion.ASTERISK_1_8; - } - else if (version.StartsWith("10.")) - { - VAR_DELIMITER = new char[] { '|' }; - return Manager.AsteriskVersion.ASTERISK_10; - } - else if (version.StartsWith("11.")) - { - VAR_DELIMITER = new char[] { ',' }; - return Manager.AsteriskVersion.ASTERISK_11; - } - else if (version.StartsWith("12.")) - { - VAR_DELIMITER = new char[] { ',' }; - return Manager.AsteriskVersion.ASTERISK_12; - } - else if (version.StartsWith("13.")) - { - VAR_DELIMITER = new char[] { ',' }; - return Manager.AsteriskVersion.ASTERISK_13; - } - else - throw new ManagerException("Unknown Asterisk version " + version); - } - } - } - } - - Response.ManagerResponse showVersionFilesResponse = SendAction(new Action.CommandAction("show version files"), defaultResponseTimeout * 2); - if (showVersionFilesResponse is Response.CommandResponse) - { - IList showVersionFilesResult = ((Response.CommandResponse)showVersionFilesResponse).Result; - if (showVersionFilesResult != null && showVersionFilesResult.Count > 0) - { - string line1; - line1 = (string)showVersionFilesResult[0]; - if (line1 != null && line1.StartsWith("File")) - return AsteriskVersion.ASTERISK_1_2; - } - } - return AsteriskVersion.ASTERISK_1_0; - } - - #endregion - - #region connect() - protected internal bool connect() - { - bool result = false; - bool startReader = false; - - lock (lockSocket) - { - if (mrSocket == null) - { + enableEvents = true; + ConnectEvent ce = new ConnectEvent(this); + ce.ProtocolIdentifier = this.protocolIdentifier; + DispatchEvent(ce); + } + else if (response is ManagerError) + throw new ManagerException("Unable login to Asterisk - " + response.Message); + else + throw new ManagerException("Unknown response during login to Asterisk - " + response.GetType().Name + " with message " + response.Message); + + } + #endregion + + #region determineVersion() + protected internal AsteriskVersion determineVersion() + { + Response.ManagerResponse response; + response = SendAction(new Action.CommandAction("core show version"), defaultResponseTimeout * 2); + if (response is Response.CommandResponse) + { + foreach (string line in ((Response.CommandResponse)response).Result) + { + foreach (Match m in Common.ASTERISK_VERSION.Matches(line)) + { + if (m.Groups.Count >= 2) + { + version = m.Groups[1].Value; + if (version.StartsWith("1.4.")) + { + VAR_DELIMITER = new char[] { '|' }; + return AsteriskVersion.ASTERISK_1_4; + } + else if (version.StartsWith("1.6.")) + { + VAR_DELIMITER = new char[] { '|' }; + return Manager.AsteriskVersion.ASTERISK_1_6; + } + else if (version.StartsWith("1.8.")) + { + VAR_DELIMITER = new char[] { '|' }; + return Manager.AsteriskVersion.ASTERISK_1_8; + } + else if (version.StartsWith("10.")) + { + VAR_DELIMITER = new char[] { '|' }; + return Manager.AsteriskVersion.ASTERISK_10; + } + else if (version.StartsWith("11.")) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_11; + } + else if (version.StartsWith("12.")) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_12; + } + else if (version.StartsWith("13.")) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_13; + } + else if (version.StartsWith("14.")) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_14; + } + else if (version.StartsWith("15.")) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_15; + } + else if (version.StartsWith("16.")) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_16; + } + else if (version.StartsWith("17.")) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_17; + } + else if (version.IndexOf('.') >= 2) + { + VAR_DELIMITER = new char[] { ',' }; + return Manager.AsteriskVersion.ASTERISK_Newer; + } + else + throw new ManagerException("Unknown Asterisk version " + version); + } + } + } + } + + Response.ManagerResponse showVersionFilesResponse = SendAction(new Action.CommandAction("show version files"), defaultResponseTimeout * 2); + if (showVersionFilesResponse is Response.CommandResponse) + { + IList showVersionFilesResult = ((Response.CommandResponse)showVersionFilesResponse).Result; + if (showVersionFilesResult != null && showVersionFilesResult.Count > 0) + { + string line1; + line1 = (string)showVersionFilesResult[0]; + if (line1 != null && line1.StartsWith("File")) + { + VAR_DELIMITER = new char[] { '|' }; + return AsteriskVersion.ASTERISK_1_2; + } + } + } + return AsteriskVersion.ASTERISK_1_0; + } + + #endregion + + #region connect() + protected internal bool connect() + { + bool result = false; + bool startReader = false; + + lock (lockSocket) + { + if (mrSocket == null) + { #if LOGGER logger.Info("Connecting to {0}:{1}", hostname, port); #endif @@ -2049,7 +2078,7 @@ private void fireEvent(ManagerEvent e) { if (enableEvents && internalEvent != null) if (UseASyncEvents) - internalEvent.BeginInvoke(this, e, new AsyncCallback(eventComplete), null); + Task.Run(() => internalEvent.Invoke(this, e)).ContinueWith(eventComplete); else internalEvent.Invoke(this, e); } diff --git a/Asterisk.2013/Asterisk.NET/Manager/ManagerReader.cs b/Asterisk.2013/Asterisk.NET/Manager/ManagerReader.cs index 2f33f400..5766855e 100644 --- a/Asterisk.2013/Asterisk.NET/Manager/ManagerReader.cs +++ b/Asterisk.2013/Asterisk.NET/Manager/ManagerReader.cs @@ -273,11 +273,10 @@ internal void Run() if (processingCommandResult) { string lineLower = line.ToLower(Helper.CultureInfo); - if (lineLower == "--end command--") + if (lineLower == "--end command--" || lineLower == "") { var commandResponse = new CommandResponse(); Helper.SetAttributes(commandResponse, packet); - commandList.Add(line); commandResponse.Result = commandList; processingCommandResult = false; packet.Clear(); @@ -308,11 +307,11 @@ internal void Run() mrConnector.DispatchEvent(connectEvent); continue; } - if (line.Trim().ToLower(Helper.CultureInfo) == "response: follows") + if (line.Trim().ToLower(Helper.CultureInfo) == "response: follows" + || line.Trim().ToLower(Helper.CultureInfo).EndsWith("command output follows")) { - // Switch to wait "--END COMMAND--" mode + // Switch to wait "--END COMMAND--"/"" mode processingCommandResult = true; - packet.Clear(); commandList.Clear(); Helper.AddKeyValue(packet, line); continue; diff --git a/Asterisk.2013/Asterisk.NET/Properties/AssemblyInfo.cs b/Asterisk.2013/Asterisk.NET/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..60515348 --- /dev/null +++ b/Asterisk.2013/Asterisk.NET/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("AsterNET")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AsterNET")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: Guid("abe98502-ea83-4b04-98c3-ffe3eabe06b0")] +[assembly: AssemblyVersion("1.3.0.0")] +[assembly: AssemblyFileVersion("1.3.0.0")] + +// 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)]