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)]