diff --git a/Asterisk.2013/Asterisk.2013.sln b/Asterisk.2013/Asterisk.2013.sln
index 49cc63e..7a10dbe 100644
--- a/Asterisk.2013/Asterisk.2013.sln
+++ b/Asterisk.2013/Asterisk.2013.sln
@@ -10,9 +10,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Asterisk.NET", "Asterisk.NE
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Asterisk.NET.WinForm", "Asterisk.NET.WinForm\Asterisk.NET.WinForm.csproj", "{03687626-613A-4E41-8F60-7C7839D6DD5D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Asterisk.NET.Test", "..\..\dfd\Asterisk.NET.1.6.3.1\Asterisk.NET.Test\Asterisk.NET.Test.csproj", "{B82B8EBF-8180-401D-8D3A-4BF7CFDB7A08}"
+EndProject
Global
GlobalSection(TeamFoundationVersionControl) = preSolution
- SccNumberOfProjects = 3
+ SccNumberOfProjects = 4
SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs33
SccLocalPath0 = .
@@ -22,6 +24,9 @@ Global
SccProjectUniqueName2 = Asterisk.NET\\Asterisk.NET.csproj
SccProjectName2 = Asterisk.NET
SccLocalPath2 = Asterisk.NET
+ SccProjectUniqueName3 = ..\\..\\dfd\\Asterisk.NET.1.6.3.1\\Asterisk.NET.Test\\Asterisk.NET.Test.csproj
+ SccProjectName3 = Asterisk.NET.Test/Asterisk.NET.Test
+ SccLocalPath3 = ..\\..\\dfd\\Asterisk.NET.1.6.3.1\\Asterisk.NET.Test
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -36,6 +41,10 @@ Global
{03687626-613A-4E41-8F60-7C7839D6DD5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{03687626-613A-4E41-8F60-7C7839D6DD5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{03687626-613A-4E41-8F60-7C7839D6DD5D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B82B8EBF-8180-401D-8D3A-4BF7CFDB7A08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B82B8EBF-8180-401D-8D3A-4BF7CFDB7A08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B82B8EBF-8180-401D-8D3A-4BF7CFDB7A08}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B82B8EBF-8180-401D-8D3A-4BF7CFDB7A08}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Asterisk.NET.Test.csproj b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Asterisk.NET.Test.csproj
new file mode 100644
index 0000000..7ec0b45
--- /dev/null
+++ b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Asterisk.NET.Test.csproj
@@ -0,0 +1,113 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.50727
+ 2.0
+ {B82B8EBF-8180-401D-8D3A-4BF7CFDB7A08}
+ Exe
+ Properties
+ Asterisk.NET.Test
+ Asterisk.NET.Test
+ false
+ v4.5
+
+
+
+
+ 2.0
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.10
+ false
+ true
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ true
+ full
+ false
+ bin\Debug\
+ TRACE;DEBUG;TIMEOUT
+ prompt
+ 4
+ false
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 2.0
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+ fastagi-mapping.Designer.cs
+ Designer
+
+
+
+
+ {bc6e7dba-c05a-45fe-a2a3-b1637ce16274}
+ Asterisk.NET
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Asterisk.NET.Test.csproj.vspscc b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Asterisk.NET.Test.csproj.vspscc
new file mode 100644
index 0000000..feffdec
--- /dev/null
+++ b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Asterisk.NET.Test.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/CustomIVR.cs b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/CustomIVR.cs
new file mode 100644
index 0000000..f1dc197
--- /dev/null
+++ b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/CustomIVR.cs
@@ -0,0 +1,118 @@
+using System;
+using Asterisk.NET.FastAGI;
+
+namespace Asterisk.NET.Test
+{
+ public class CustomIVR : AGIScript
+ {
+ private string escapeKeys = "0123456789*#";
+ /*
+ * Call -> play "wellcome" -> wait digit 5 seconds -> press 1 -> play "press-1" -> wait digit -> press * ----------------------------\
+ * ^ ^ ^ -> press 4 -> play "press-4" -------\ |
+ * | | | -> press any -> play "bad" "digit" -+ |
+ * | | \-----------------------------------------/ |
+ * | | -> press # or timeout -\ |
+ * | | | |
+ * | | -> press # or timeout -> play "goodbye" -> Hangup | |
+ * | | ^ | |
+ * | | \-----------------------------------+ |
+ * | | | |
+ * | | | |
+ * | | -> press 2 -> play "press-1" -> wait digit -> press # or timeout -/ |
+ * | | ^ -> press * ----------------------------+
+ * | | | -> press 4 -> play "press-4" -------\ |
+ * | | | -> press any -> play "bad" "digit" -+ |
+ * | | \-----------------------------------------/ |
+ * | | |
+ * | | -> press other -> play "bad" "digit" -\ |
+ * | \--------------------------------------------------/ |
+ * \-------------------------------------------------------------------------------------------------------------------/
+ */
+
+ public override void Service(AGIRequest request, AGIChannel channel)
+ {
+ Answer();
+ int submenu = 0;
+ char key = '\0';
+ bool welcome = true;
+
+ while (true)
+ {
+ if (welcome)
+ {
+ key = StreamFile("welcome", escapeKeys);
+ welcome = false;
+ submenu = 0;
+ }
+ if (key == '\0')
+ {
+ key = WaitForDigit(5000);
+ if (key == '\0' || key == '#')
+ {
+ StreamFile("goodbye");
+ break;
+ }
+ }
+ char newKey = '\0';
+ switch (submenu)
+ {
+ case 0:
+ switch (key)
+ {
+ case '1':
+ newKey = StreamFile("press-1", escapeKeys);
+ submenu = 1;
+ break;
+ case '2':
+ newKey = StreamFile("press-2", escapeKeys);
+ submenu = 2;
+ break;
+ case '3':
+ newKey = StreamFile("press-3", escapeKeys);
+ break;
+ default:
+ newKey = StreamFile("bad", escapeKeys);
+ if(newKey == '\0')
+ newKey = StreamFile("digit", escapeKeys);
+ break;
+ }
+ break;
+ case 1:
+ switch (key)
+ {
+ case '*':
+ welcome = true;
+ break;
+ case '4':
+ newKey = StreamFile("press-4", escapeKeys);
+ break;
+ default:
+ newKey = StreamFile("bad", escapeKeys);
+ if (newKey == '\0')
+ newKey = StreamFile("digit", escapeKeys);
+ break;
+ }
+ break;
+ case 2:
+ switch (key)
+ {
+ case '*':
+ welcome = true;
+ break;
+ case '5':
+ newKey = StreamFile("press-5", escapeKeys);
+ break;
+ default:
+ newKey = StreamFile("bad", escapeKeys);
+ if (newKey == '\0')
+ newKey = StreamFile("digit", escapeKeys);
+ break;
+ }
+ break;
+ }
+ key = newKey;
+ }
+ Hangup();
+ }
+ }
+}
diff --git a/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Program.cs b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Program.cs
new file mode 100644
index 0000000..1562e20
--- /dev/null
+++ b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Program.cs
@@ -0,0 +1,466 @@
+using System;
+
+using Asterisk.NET.Manager;
+using Asterisk.NET.Manager.Action;
+using Asterisk.NET.Manager.Response;
+using Asterisk.NET.FastAGI;
+using Asterisk.NET.Manager.Event;
+
+namespace Asterisk.NET.Test
+{
+ class Program
+ {
+ const string DEV_HOST = "192.168.2.34";
+ const int ASTERISK_PORT = 5038;
+ const string ASTERISK_HOST = "192.168.2.39";
+ const string ASTERISK_LOGINNAME = "admin";
+ const string ASTERISK_LOGINPWD = "amp111";
+
+ const string ORIGINATE_CONTEXT = "from-internal";
+ const string ORIGINATE_CHANNEL = "IAX2/100";
+ const string ORIGINATE_EXTRA_CHANNEL = "SIP/101";
+ const string ORIGINATE_EXTRA_EXTEN = "101";
+ const string ORIGINATE_EXTEN = "101";
+ const string ORIGINATE_CALLERID = "Asterisk.NET";
+ const int ORIGINATE_TIMEOUT = 15000;
+
+ [STAThread]
+ static void Main()
+ {
+ checkManagerAPI();
+ checkFastAGI();
+ }
+
+ #region checkFastAGI()
+ private static void checkFastAGI()
+ {
+ Console.WriteLine(@"
+Add next lines to your extension.conf file
+ exten => 200,1,agi(agi://" + DEV_HOST + @"/customivr)
+ exten => 200,2,Hangup()
+reload Asterisk and dial 200 from phone.
+Also enter 'agi debug' from Asterisk console to more information.
+See CustomIVR.cs and fastagi-mapping.resx to detail.
+
+Ctrl-C to exit");
+ AsteriskFastAGI agi = new AsteriskFastAGI();
+ agi.Start();
+ }
+ #endregion
+
+ private static ManagerConnection manager;
+ private static string monitorChannel = null;
+ private static string transferChannel = null;
+
+ #region displayQueue()
+ private static void displayQueue()
+ {
+ manager = new ManagerConnection(ASTERISK_HOST, ASTERISK_PORT, ASTERISK_LOGINNAME, ASTERISK_LOGINPWD);
+
+ try
+ {
+#if NOTIMEOUT
+ manager.Connection.DefaultTimeout = 0;
+ manager.Connection.DefaultEventTimeout = 0;
+#endif
+ manager.Login();
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ Console.WriteLine("Press ENTER to next test or CTRL-C to exit.");
+ Console.ReadLine();
+ return;
+ }
+
+ ResponseEvents re;
+ try
+ {
+ re = manager.SendEventGeneratingAction(new QueueStatusAction());
+ }
+ catch (EventTimeoutException e)
+ {
+ // this happens with Asterisk 1.0.x as it doesn't send a QueueStatusCompleteEvent
+ re = e.PartialResult;
+ }
+
+ foreach (ManagerEvent e in re.Events)
+ {
+ if (e is QueueParamsEvent)
+ {
+ QueueParamsEvent qe = (QueueParamsEvent)e;
+ Console.WriteLine("QueueParamsEvent" + "\n\tQueue:\t\t" + qe.Queue + "\n\tServiceLevel:\t" + qe.ServiceLevel);
+ }
+ else if (e is QueueMemberEvent)
+ {
+ QueueMemberEvent qme = (QueueMemberEvent)e;
+ Console.WriteLine("QueueMemberEvent" + "\n\tQueue:\t\t" + qme.Queue + "\n\tLocation:\t" + qme.Location);
+ }
+ else if (e is QueueEntryEvent)
+ {
+ QueueEntryEvent qee = (QueueEntryEvent)e;
+ Console.WriteLine("QueueEntryEvent" + "\n\tQueue:\t\t" + qee.Queue + "\n\tChannel:\t" + qee.Channel + "\n\tPosition:\t" + qee.Position);
+ }
+ }
+ Console.WriteLine("Press ENTER to next test or CTRL-C to exit.");
+ Console.ReadLine();
+ }
+ #endregion
+
+ #region checkManagerAPI()
+ private static void checkManagerAPI()
+ {
+ manager = new ManagerConnection(ASTERISK_HOST, ASTERISK_PORT, ASTERISK_LOGINNAME, ASTERISK_LOGINPWD);
+
+ // Register user event class
+ manager.RegisterUserEventClass(typeof(UserAgentLoginEvent));
+
+ // Add or Remove events
+ manager.UserEvents += new UserEventHandler(dam_UserEvents);
+
+ // Dont't display this event
+ manager.NewExten += new NewExtenEventHandler(manager_IgnoreEvent);
+
+ // Display all other
+ manager.UnhandledEvent += new ManagerEventHandler(dam_Events);
+
+ // +++ Only to debug purpose
+ manager.FireAllEvents = true;
+ // manager.DefaultEventTimeout = 0;
+ // manager.DefaultResponseTimeout = 0;
+ manager.PingInterval = 0;
+ // +++
+ try
+ {
+ manager.Login(); // Login only (fast)
+
+ Console.WriteLine("Asterisk version : " + manager.Version);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex);
+ Console.ReadLine();
+ manager.Logoff();
+ return;
+ }
+
+ {
+ Console.WriteLine("\nGetConfig action");
+ ManagerResponse response = manager.SendAction(new GetConfigAction("manager.conf"));
+ if (response.IsSuccess())
+ {
+ GetConfigResponse responseConfig = (GetConfigResponse)response;
+ foreach (int key in responseConfig.Categories.Keys)
+ {
+ Console.WriteLine(string.Format("{0}:{1}", key, responseConfig.Categories[key]));
+ foreach (int keyLine in responseConfig.Lines(key).Keys)
+ {
+ Console.WriteLine(string.Format("\t{0}:{1}", keyLine, responseConfig.Lines(key)[keyLine]));
+ }
+ }
+ }
+ else
+ Console.WriteLine(response);
+ }
+
+ {
+ Console.WriteLine("\nUpdateConfig action");
+ UpdateConfigAction config = new UpdateConfigAction("manager.conf", "manager.conf");
+ config.AddCommand(UpdateConfigAction.ACTION_NEWCAT, "testadmin");
+ config.AddCommand(UpdateConfigAction.ACTION_APPEND, "testadmin", "secret", "blabla");
+ ManagerResponse response = manager.SendAction(config);
+ Console.WriteLine(response);
+ }
+
+ // Originate call example
+ Console.WriteLine("\nPress ENTER key to originate call.\n"
+ + "Start phone (or connect) or make a call to see events.\n"
+ + "After all events press a key to originate call.");
+ Console.ReadLine();
+
+ OriginateAction oc = new OriginateAction();
+ oc.Context = ORIGINATE_CONTEXT;
+ oc.Priority = 1;
+ oc.Channel = ORIGINATE_CHANNEL;
+ oc.CallerId = ORIGINATE_CALLERID;
+ oc.Exten = ORIGINATE_EXTEN;
+ oc.Timeout = ORIGINATE_TIMEOUT;
+ // oc.Variable = "VAR1=abc|VAR2=def";
+ // oc.SetVariable("VAR3", "ghi");
+ ManagerResponse originateResponse = manager.SendAction(oc, oc.Timeout);
+ Console.WriteLine("Response:");
+ Console.WriteLine(originateResponse);
+
+ Console.WriteLine("Press ENTER key to next test.");
+ Console.ReadLine();
+
+ //
+ // Display result of Show Queues command
+ //
+ {
+ CommandAction command = new CommandAction();
+ CommandResponse response = new CommandResponse();
+ if (manager.AsteriskVersion == AsteriskVersion.ASTERISK_1_6)
+ command.Command = "queue show";
+ else
+ command.Command = "show queues";
+ try
+ {
+ response = (CommandResponse)manager.SendAction(command);
+ Console.WriteLine("Result of " + command.Command);
+ foreach (string str in response.Result)
+ Console.WriteLine("\t" + str);
+ }
+ catch (Exception err)
+ {
+ Console.WriteLine("Response error: " + err);
+ }
+ Console.WriteLine("Press ENTER to next test or CTRL-C to exit.");
+ Console.ReadLine();
+ }
+ //
+ // Display Queues and Members
+ //
+ ResponseEvents re;
+ try
+ {
+ re = manager.SendEventGeneratingAction(new QueueStatusAction());
+ }
+ catch (EventTimeoutException e)
+ {
+ // this happens with Asterisk 1.0.x as it doesn't send a QueueStatusCompleteEvent
+ re = e.PartialResult;
+ }
+
+ foreach (ManagerEvent e in re.Events)
+ {
+ if (e is QueueParamsEvent)
+ {
+ QueueParamsEvent qe = (QueueParamsEvent)e;
+ Console.WriteLine("QueueParamsEvent" + "\n\tQueue:\t\t" + qe.Queue + "\n\tServiceLevel:\t" + qe.ServiceLevel);
+ }
+ else if (e is QueueMemberEvent)
+ {
+ QueueMemberEvent qme = (QueueMemberEvent)e;
+ Console.WriteLine("QueueMemberEvent" + "\n\tQueue:\t\t" + qme.Queue + "\n\tLocation:\t" + qme.Location);
+ }
+ else if (e is QueueEntryEvent)
+ {
+ QueueEntryEvent qee = (QueueEntryEvent)e;
+ Console.WriteLine("QueueEntryEvent" + "\n\tQueue:\t\t" + qee.Queue + "\n\tChannel:\t" + qee.Channel + "\n\tPosition:\t" + qee.Position);
+ }
+ }
+
+ Console.WriteLine("Press ENTER to next test or CTRL-C to exit.");
+ Console.ReadLine();
+
+ //
+ // To test create 3 extensions:
+ // 1 - SIP/4012 w/o voicemail (with eyeBeam softphone)
+ // 2 - IAX2/4008 w/o voicemail (with iaxComm softphone)
+ // 3 - SIP/4010 w/ voicemal but no phone connect
+
+ // RedirectCall: call from IAX2/4008 to SIP/4012
+ // Don't answer on SIP/4012 and call must redirect to SIP/4010 (to voicemail really)
+ // Dial event used to define redirect channel
+
+ Console.WriteLine("Redirect Call from " + ORIGINATE_CHANNEL + " to " + ORIGINATE_EXTRA_CHANNEL + " or press ESC.");
+ // Wait for Dial Event from ORIGINATE_CHANNEL
+ DialEventHandler de = new DialEventHandler(dam_Dial);
+ manager.Dial += de;
+ while (transferChannel == null)
+ {
+ System.Threading.Thread.Sleep(100);
+ if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
+ break;
+ }
+ manager.Dial -= de;
+
+ // Now send Redirect action
+ RedirectAction ra = new RedirectAction();
+ ra.Channel = transferChannel;
+ ra.ExtraChannel = ORIGINATE_EXTRA_CHANNEL;
+ ra.Context = ORIGINATE_CONTEXT;
+ ra.Exten = ORIGINATE_EXTRA_EXTEN;
+ ra.Priority = 1;
+ try
+ {
+ ManagerResponse mr = manager.SendAction(ra, 10000);
+ Console.WriteLine("Transfer Call"
+ + "\n\tResponse:" + mr.Response
+ + "\n\tMessage:" + mr.Message
+ );
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+
+ // Monitor call.
+ // Call from IA2/4008 to SIP/4012
+ // Link event used to define monitor channel
+ Console.WriteLine("Monitor call. Please call " + ORIGINATE_CHANNEL + " and answer or press ESC.");
+ // Wait for Link event
+ LinkEventHandler le = new LinkEventHandler(dam_Link);
+ manager.Link += le;
+ while (monitorChannel == null)
+ {
+ System.Threading.Thread.Sleep(100);
+ if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
+ break;
+ }
+ manager.Link -= le;
+ // Now send Monitor action
+ MonitorAction ma = new MonitorAction();
+ ma.Channel = monitorChannel;
+ ma.File = "voicefile";
+ ma.Format = "gsm";
+ ma.Mix = true;
+ try
+ {
+ ManagerResponse mr = manager.SendAction(ma, 10000);
+ Console.WriteLine("Monitor Call"
+ + "\n\tResponse:" + mr.Response);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+
+ manager.Logoff();
+ }
+
+ static void manager_IgnoreEvent(object sender, NewExtenEvent e)
+ {
+ // Ignore this event.
+ }
+
+ #endregion
+
+ #region Event handlers
+ static void dam_Events(object sender, ManagerEvent e)
+ {
+ Console.WriteLine(e);
+ }
+
+ static void dam_Reload(object sender, ReloadEvent e)
+ {
+ Console.WriteLine(string.Format("\nReload Event: {0}", e.Message));
+ }
+
+ static void dam_Link(object sender, LinkEvent e)
+ {
+ Console.WriteLine("Link Event"
+ + "\n\tChannel1:\t" + e.Channel1
+ + "\n\tChannel2:\t" + e.Channel2
+ );
+ if (e.Channel1.StartsWith(ORIGINATE_CHANNEL) || e.Channel2.StartsWith(ORIGINATE_CHANNEL))
+ monitorChannel = e.Channel1;
+ }
+
+ static void dam_ExtensionStatus(object sender, ExtensionStatusEvent e)
+ {
+ Console.WriteLine("ExtensionStatus Event"
+ + "\n\tContext\t\t" + e.Context
+ + "\n\tExten\t\t" + e.Exten
+ + "\n\tStatus\t\t" + e.Status
+ );
+ }
+
+ static void dam_Dial(object sender, DialEvent e)
+ {
+ Console.WriteLine(
+ "Dial Event"
+ + "\n\tCallerId\t" + e.CallerId
+ + "\n\tCallerIdName\t" + e.CallerIdName
+ + "\n\tDestination\t" + e.Destination
+ + "\n\tDestUniqueId\t" + e.DestUniqueId
+ + "\n\tSrc\t\t" + e.Src
+ + "\n\tSrcUniqueId\t" + e.SrcUniqueId
+ );
+ if (e != null && e.Destination != null && e.Destination.StartsWith(ORIGINATE_CHANNEL))
+ transferChannel = e.Src;
+ }
+
+ static void dam_Hangup(object sender, HangupEvent e)
+ {
+ Console.WriteLine("Hangup Event"
+ + "\n\tChannel\t\t" + e.Channel
+ + "\n\tUniqueId\t" + e.UniqueId
+ );
+ }
+
+ static void dam_NewExten(object sender, NewExtenEvent e)
+ {
+ Console.WriteLine(
+ "New Extension Event"
+ + "\n\tChannel\t\t" + e.Channel
+ + "\n\tExtension\t" + e.Extension
+ + "\n\tContext\t\t" + e.Context
+ + "\n\tDateReceived\t" + e.DateReceived.ToString()
+ + "\n\tPriority\t" + e.Priority.ToString()
+ + "\n\tPrivilege\t" + e.Privilege
+ + "\n\tUniqueId\t" + e.UniqueId
+ + "\n\tAppData\t\t" + e.AppData
+ + "\n\tApplication\t" + e.Application
+ );
+ }
+
+ static void dam_NewChannel(object sender, NewChannelEvent e)
+ {
+ Console.WriteLine("New channel Event"
+ + "\n\tChannel\t\t" + e.Channel
+ + "\n\tUniqueId\t" + e.UniqueId
+ + "\n\tCallerId\t" + e.CallerId
+ + "\n\tCallerIdName\t" + e.CallerIdName
+ + "\n\tState\t\t" + e.State
+ + "\n\tDateReceived\t" + e.DateReceived.ToString()
+ );
+ }
+
+ static void dam_PeerStatus(object sender, PeerStatusEvent e)
+ {
+ Console.WriteLine("Peer Status Event"
+ + "\n\tPeer\t\t" + e.Peer
+ + "\n\tStatus\t\t" + e.PeerStatus
+ + "\n\tDateReceived\t" + e.DateReceived.ToString()
+ );
+ }
+
+ static void dam_UserEvents(object sender, UserEvent e)
+ {
+ if (e is UserAgentLoginEvent)
+ {
+ Console.WriteLine("User Event - AgentLogin:"
+ + "\n\tAgent\t\t" + ((UserAgentLoginEvent)e).Agent
+ );
+ }
+ else
+ {
+ Console.WriteLine("User Event:"
+ + "\n\tUserEventName\t\t" + e.UserEventName
+ );
+ foreach (System.Collections.Generic.KeyValuePair pair in e.Attributes)
+ {
+ Console.WriteLine(String.Format("\t{0}\t{1}", pair.Key, pair.Value));
+ }
+ }
+ }
+ #endregion
+ }
+
+ public class UserAgentLoginEvent : UserEvent
+ {
+ private string agent;
+ public string Agent
+ {
+ get { return agent; }
+ set { agent = value; }
+ }
+
+ public UserAgentLoginEvent(ManagerConnection source)
+ : base(source)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Properties/AssemblyInfo.cs b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..5757316
--- /dev/null
+++ b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/Properties/AssemblyInfo.cs
@@ -0,0 +1,20 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("Asterisk.NET.Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("x893")]
+[assembly: AssemblyProduct("Asterisk.NET.Test")]
+[assembly: AssemblyCopyright("Copyright © 2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: Guid("1a245924-e504-4cb4-9885-67a39085196a")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.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)]
diff --git a/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/app.config b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/app.config
new file mode 100644
index 0000000..b7a7ef1
--- /dev/null
+++ b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/app.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/fastagi-mapping.resx b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/fastagi-mapping.resx
new file mode 100644
index 0000000..46050b4
--- /dev/null
+++ b/Asterisk.2013/Asterisk.NET.Test/Asterisk.NET.Test/fastagi-mapping.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Asterisk.NET.Test.CustomIVR, Asterisk.NET.Test
+
+
+ Asterisk.NET.FastAGI.Scripts.AGINoAction, Asterisk.NET
+
+
\ No newline at end of file
diff --git a/Asterisk.2013/ChangeLog.txt b/Asterisk.2013/ChangeLog.txt
index 39bd59e..9bad93d 100644
--- a/Asterisk.2013/ChangeLog.txt
+++ b/Asterisk.2013/ChangeLog.txt
@@ -2,6 +2,8 @@
Re-homed project to CodePlex with TFS Support
Upgraded Project to .NET 4.5
Allow connection to Asterisk 1.8.x - Still uses the 1.6.x logic, so any 1.8 changes are not yet implemented. <- TODO
+ Readded the Test Project, upgraded to .NET 4.5 and post build fix.
+ Removed "@"%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\ResGen.exe" "$(ProjectDir)fastagi-mapping.resx" fastagi-mapping.resources" for now until I know what it does
09.06.2009