/// <summary>
 ///     Creates a new instance.
 /// </summary>
 /// <param name="events">the ResponseEvents to store the events in</param>
 /// <param name="actionCompleteEventClass">the type of event that indicates that all events have been received</param>
 /// <param name="thread">the thread to interrupt when the actionCompleteEventClass has been received</param>
 public ResponseEventHandler(ManagerConnection connection, ManagerActionEvent action, AutoResetEvent autoEvent)
 {
     this.connection = connection;
     this.events = new ResponseEvents();
     this.action = action;
     this.autoEvent = autoEvent;
 }
Пример #2
1
		private void btnConnect_Click(object sender, EventArgs e)
		{
			string address = this.tbAddress.Text;
			int port = int.Parse(this.tbPort.Text);
			string user = this.tbUser.Text;
			string password = this.tbPassword.Text;

			btnConnect.Enabled = false;
			manager = new ManagerConnection(address, port, user, password);
			manager.UnhandledEvent += new ManagerEventHandler(manager_Events);
			try
			{
				// Uncomment next 2 line comments to Disable timeout (debug mode)
				// manager.DefaultResponseTimeout = 0;
				// manager.DefaultEventTimeout = 0;
				manager.Login();
			}
			catch(Exception ex)
			{
				MessageBox.Show("Error connect\n" + ex.Message);
				manager.Logoff();
				this.Close();
			}
			btnDisconnect.Enabled = true;
		}
Пример #3
1
		/// <summary>
		///     Creates a new ManagerReader.
		/// </summary>
		/// <param name="dispatcher">the dispatcher to use for dispatching events and responses.</param>
		public ManagerReader(ManagerConnection connection)
		{
			mrConnector = connection;
			die = false;
			lineQueue = new Queue<string>();
			packet = new Dictionary<string, string>();
			commandList = new List<string>();
		}
 public void Free()
 {
     connection = null;
     autoEvent = null;
     action = null;
     events.Events.Clear();
     events.Response = null;
     events = null;
 }
Пример #5
1
		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();
		}
Пример #6
0
		private void btnDisconnect_Click(object sender, EventArgs e)
		{
			btnConnect.Enabled = true;
			if (this.manager != null)
			{
				manager.Logoff();
				this.manager = null;
			}
			btnDisconnect.Enabled = false;
		}
Пример #7
0
        public AstTray()
        {
            InitializeComponent();

            // Add context menu item
            var click2CallMenuItem = new ToolStripClick2Call();
            click2CallMenuItem.Call += click2CallMenuItem_Call;
            contextMenuStrip1.Items.Insert(0, click2CallMenuItem);
            // this.toolStrip1.Items.Add(click2CallMenuItem);

            if (ConfigurationManager.AppSettings["astHost"] == null)
            {
                MessageBox.Show("Unable to read configuration file. Maybe you need to rename App.config.example to App.config and add your own details to it?");
                Environment.Exit(0);
            }

            try
            {
                astCon = new ManagerConnection(ConfigurationManager.AppSettings["astHost"], int.Parse(ConfigurationManager.AppSettings["astPort"]),
                    ConfigurationManager.AppSettings["astUser"], ConfigurationManager.AppSettings["astPass"]);

                astCon.NewState +=astCon_NewState;
                astCon.Link += astCon_Link;         // added to support AMI 1.0 (Asterisk 1.4)
                astCon.ConnectionState += astCon_ConnectionState;
                astCon.Login();

                // Load Directories
                if(ConfigurationManager.AppSettings["sharedDirectoryType"] !=null)
                    switch (ConfigurationManager.AppSettings["sharedDirectoryType"].ToUpper())
                    {
                        case "CISCODIRECTORY":
                            sharedDiretory = CiscoDirectoryHelper.GetCiscoDirectory(ConfigurationManager.AppSettings["sharedDirectoryPath"]);
                            break;
                    }

                // Load into views
                if(sharedDiretory!=null)
                    foreach (var item in sharedDiretory)
                    {
                        this.sharedDirectoryListView.Items.Add(new ListViewItem(new string[] { item.Name, item.Number }));
                    }

                astTrayNotify.ShowBalloonTip(3000, "Connected", "Connected to Asterisk", ToolTipIcon.Info);
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("Error connecting to {0}. Error: {1}",
                    ConfigurationManager.AppSettings["astHost"],
                    ex.Message));

                // Terminate Application
                Application.Exit();
            }
        }
Пример #8
0
		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();
		}
Пример #9
0
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            string asterisk_ami_username = ConfigurationManager.AppSettings["AMIHost"];
            string asterisk_ami_port = ConfigurationManager.AppSettings["AMIPort"];
            string username = ConfigurationManager.AppSettings["AMIUser"];
            string password = ConfigurationManager.AppSettings["AMIPassword"];

            AsterNET.Manager.ManagerConnection conn = new ManagerConnection(asterisk_ami_username, int.Parse(asterisk_ami_port), username, password);

            conn.Login();
            conn.UserEvents += Conn_UserEvents;
        }
Пример #10
0
        static void Main(string[] args)
        {
            ManagerConnection mc = new ManagerConnection("192.168.1.103", 5038, "OSm", "restart.Pass1");

            try
            {
                mc.Login();
                mc.AgentCalled += Mc_AgentCalled;
                mc.AgentConnect += Mc_AgentConnect;
                Console.Write("Login OK");

                Console.Read();
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message + System.Environment.NewLine + ex.StackTrace);
            }
            finally
            {
                mc.Logoff();
            }
        }
Пример #11
0
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            astCon.Logoff();
            astCon = null;

            Application.Exit();
        }
Пример #12
0
        /// <summary>
        ///     Builds the event based on the given map of attributes and the registered event classes.
        /// </summary>
        /// <param name="source">source attribute for the event</param>
        /// <param name="attributes">map containing event attributes</param>
        /// <returns>a concrete instance of ManagerEvent or null if no event class was registered for the event type.</returns>
        internal static ManagerEvent BuildEvent(IDictionary<int, ConstructorInfo> list, ManagerConnection source,
            Dictionary<string, string> attributes)
        {
            ManagerEvent e;
            string eventType;
            ConstructorInfo constructor = null;
            int hash, hashEvent;

            eventType = attributes["event"].ToLower(CultureInfo);
            // Remove Event tail from event name (ex. JabberEvent)
            if (eventType.EndsWith("event"))
                eventType = eventType.Substring(0, eventType.Length - 5);
            hashEvent = eventType.GetHashCode();

            if (eventType == "user")
            {
                string userevent = attributes["userevent"].ToLower(CultureInfo);
                hash = string.Concat(eventType, userevent).GetHashCode();
                if (list.ContainsKey(hash))
                    constructor = list[hash];
                else
                    constructor = list[hashEvent];
            }
            else if (list.ContainsKey(hashEvent))
                constructor = list[hashEvent];

            if (constructor == null)
                e = new UnknownEvent(source);
            else
            {
                try
                {
                    e = (ManagerEvent) constructor.Invoke(new object[] {source});
                }
                catch (Exception ex)
                {
#if LOGGER
                    logger.Error("Unable to create new instance of " + eventType, ex);
                    return null;
#else
					throw ex;
#endif
                }
            }

            SetAttributes(e, attributes);

            // ResponseEvents are sent in response to a ManagerAction if the
            // response contains lots of data. They include the actionId of
            // the corresponding ManagerAction.
            if (e is ResponseEvent)
            {
                var responseEvent = (ResponseEvent) e;
                string actionId = responseEvent.ActionId;
                if (actionId != null)
                {
                    responseEvent.ActionId = StripInternalActionId(actionId);
                    responseEvent.InternalActionId = GetInternalActionId(actionId);
                }
            }

            return e;
        }
Пример #13
0
		public UserAgentLoginEvent(ManagerConnection source)
			: base(source)
		{
		}
Пример #14
0
 protected void login(string ipAddress, string amiLogin, string amiPassword)
 {
     managerConnection = new ManagerConnection(ipAddress, PORT, amiLogin, amiPassword);
     managerConnection.Login(15000);
 }