private static void HandleCustomEvent(FSEvent evt, string uuid) { if (evt.subclass_name == "portaudio::ringing") { Utils.DebugEventDump(evt); if ((from c in calls where c._leg_a_uuid == uuid && c.call_ended == false select c).Count() > 0) //only care about first ring { return; } Call call = new Call(); call.SetCallInfoFromEvent(evt); String gw_id = (from c in channels where c.Key == call.leg_b_uuid select c.Value.gateway_id).SingleOrDefault(); call.account = (from a in Account.accounts where a.gateway_id == gw_id select a).SingleOrDefault(); calls.Add(call); call.UpdateCallState(CALL_STATE.Ringing, active_call ?? call); } else if (evt.subclass_name == "portaudio::makecall") { Utils.DebugEventDump(evt); if (evt.get_header("fail") == "true") { MessageBox.Show("Make Call failed!!!, came from portaudio not sure why"); return; } Call call = new Call(); call.is_outgoing = true; call.SetCallInfoFromEvent(evt); if (call.other_party_number == "fsc_conference") { call.visibility = Visibility.Collapsed; Conference.instance.our_conference_call = call; call.is_conference_call = true; } calls.Add(call); call.UpdateCallState(call.is_conference_call ? CALL_STATE.Answered : CALL_STATE.Ringing, call); } else if (evt.subclass_name == "portaudio::callheld" || evt.subclass_name == "portaudio::callresumed") { String paid_str = evt.get_header("variable_pa_call_id"); if (String.IsNullOrEmpty(paid_str)) { return; } int portaudio_id = Int32.Parse(paid_str); Call call = (from c in calls where c.portaudio_id == portaudio_id && c.call_ended == false select c).SingleOrDefault(); if (call == null) { return; } if (evt.subclass_name == "portaudio::callresumed") { call.UpdateCallState(CALL_STATE.Answered, call); } else { call.UpdateCallState(call.state == CALL_STATE.Ringing ? CALL_STATE.Hold_Ringing : CALL_STATE.Hold, call == active_call ? null : active_call); } } }
public static void HandleHangupCompleteEvent(FSEvent evt, String uuid) { Utils.DebugEventDump(evt); Call call = (from c in calls where c.call_ended == false && (c.leg_a_uuid == uuid || c.leg_b_uuid == uuid) select c).SingleOrDefault(); if (call == null || call.call_ended) { return; } CALL_STATE new_state = CALL_STATE.None; if (call.state != CALL_STATE.Answered && call.state != CALL_STATE.Missed && call.state != CALL_STATE.Hold) { if (String.IsNullOrEmpty(call.note)) { call.note = evt.get_header("variable_sip_hangup_phrase"); } if (!call.is_outgoing && call.state == CALL_STATE.Ringing) { new_state = CALL_STATE.Missed; } else { new_state = CALL_STATE.Failed; } } else if (call.state == CALL_STATE.Answered || call.state == CALL_STATE.Hold) { new_state = CALL_STATE.Ended; } if (new_state == CALL_STATE.None) { throw new Exception("Not sure what happened call was at state...: " + call.state); } Call new_active_call; if (Call.active_call != call) { new_active_call = Call.active_call; } else { new_active_call = (from c in calls where c.state == CALL_STATE.Ringing && c.is_outgoing == false && c != call select c).FirstOrDefault(); } call.UpdateCallState(new_state, new_active_call); }
public static void NewFSEvent(object sender, FSEvent evt) { if (evt.event_id != switch_event_types_t.SWITCH_EVENT_MODULE_LOAD) { Utils.DebugEventDump(evt); } String uuid = evt.get_header("Unique-ID"); switch (evt.event_id) { case switch_event_types_t.SWITCH_EVENT_CHANNEL_CREATE: handleChannelCreateEvent(evt, uuid); break; case switch_event_types_t.SWITCH_EVENT_CHANNEL_OUTGOING: HandleOutgoingEvent(evt, uuid); break; case switch_event_types_t.SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE: HandleHangupCompleteEvent(evt, uuid); break; case switch_event_types_t.SWITCH_EVENT_CHANNEL_ANSWER: String dest = "Caller-Destination-Number"; if (dest != "fsc_conference") { HandleChannelAnswerEvent(evt, uuid); } break; case switch_event_types_t.SWITCH_EVENT_CUSTOM: HandleCustomEvent(evt, uuid); break; case switch_event_types_t.SWITCH_EVENT_CHANNEL_DESTROY: channels.Remove(uuid); break; case switch_event_types_t.SWITCH_EVENT_DTMF: HandleDTMFEvent(evt, uuid); break; } }