Added test project. Remoed post build because it references VS2005? Need to fix that later.

This commit is contained in:
ppumkin_cp 2013-01-18 08:50:47 -08:00
parent f6d419aa39
commit 236f6af81e
9 changed files with 868 additions and 1 deletions

View file

@ -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

View file

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{B82B8EBF-8180-401D-8D3A-4BF7CFDB7A08}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Asterisk.NET.Test</RootNamespace>
<AssemblyName>Asterisk.NET.Test</AssemblyName>
<IsWebBootstrapper>false</IsWebBootstrapper>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>2.0</OldToolsVersion>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.10</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkProfile />
<SccProjectName>SAK</SccProjectName>
<SccLocalPath>SAK</SccLocalPath>
<SccAuxPath>SAK</SccAuxPath>
<SccProvider>SAK</SccProvider>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;TIMEOUT</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CustomIVR.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
<Visible>False</Visible>
<ProductName>.NET Framework 2.0</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="fastagi-mapping.resx">
<LastGenOutput>fastagi-mapping.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Asterisk.NET.1.6.3.1\Asterisk.NET.1.6.3.1\Asterisk.NET\Asterisk.NET.csproj">
<Project>{bc6e7dba-c05a-45fe-a2a3-b1637ce16274}</Project>
<Name>Asterisk.NET</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>

View file

@ -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"
}

View file

@ -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();
}
}
}

View file

@ -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<string, string> 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)
{
}
}
}

View file

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

View file

@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="customivr" xml:space="preserve">
<value>Asterisk.NET.Test.CustomIVR, Asterisk.NET.Test</value>
</data>
<data name="noaction" xml:space="preserve">
<value>Asterisk.NET.FastAGI.Scripts.AGINoAction, Asterisk.NET</value>
</data>
</root>

View file

@ -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