private void AriClient_OnChannelHangupRequestEvent(IAriClient sender, ChannelHangupRequestEvent e) { string callerId = e.Channel.Caller.Number; numbers.Remove(callerId); if (!String.IsNullOrEmpty(e.Channel.Id)) { dtmfs.Remove(e.Channel.Id); } else { var keys = dtmfs.Keys; foreach (var item in keys) { DtmfItem dtmfItem; dtmfs.TryGetValue(item, out dtmfItem); if (dtmfItem != null) { if (dtmfItem.channel.Caller.Number == callerId) { dtmfs.Remove(item); } } } } }
private void Pbx_OnChannelHangupRequestEvent(IAriClient sender, ChannelHangupRequestEvent e) { ProtocolMessages.Message msg = null; try { lock (_locker) { msg = callHandlerCache.GetByChannelId(e.Channel.Id).ChannelHangupEvent(e.Channel.Id, e.Cause, ""); } } catch (Exception ex) { Log.Logger.Debug("Channel HangUpReques: ERROR " + ex.Message + "\n" + ex.StackTrace); } if (msg != null) { actorPbxProxy.Send(msg); } else { Log.Logger.Debug("Channel HangUpReques: " + e.Channel.Id + " el callhandler devolvió msg = null"); } //TODO:Revisar este lock, verificar si lo que está adentro lo estoy ejecutando lock (_locker) { //si la llamada finalizó remuevo todo CallHandler callHandler = callHandlerCache.GetByChannelId(e.Channel.Id); if (callHandler != null && callHandler.IsCallTerminated()) { Log.Logger.Debug("Channel HangUpRequest: " + e.Channel.Id + ", call TERMINATED remuevo todo el callhandler: " + callHandler); callHandlerCache.RemoveCallHandler(callHandler.Id); Log.Logger.Debug("Channel HangUpRequest: el bridge: " + callHandler.Bridge.Id + " lo marco como free"); bridgesList.SetFreeBridge(callHandler.Bridge.Id); } else // hago lo mismo que el channel destroy { callHandlerCache.RemoveChannel(e.Channel.Id); Log.Logger.Debug("Channel HangUpRequest: " + e.Channel.Id + " remuevo channel del callhandler"); } } }