Beispiel #1
0
        private void OnNotification(Client client, BroadcastParams broadcastParams)
        {
            if (broadcastParams.Event != "queuing.relay.events" && broadcastParams.Event != "relay")
            {
                return;
            }

            mLogger.LogDebug("CallingAPI OnNotification");

            CallingEventParams callingEventParams = null;

            try { callingEventParams = broadcastParams.ParametersAs <CallingEventParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse CallingEventParams");
                return;
            }

            if (string.IsNullOrWhiteSpace(callingEventParams.EventType))
            {
                mLogger.LogWarning("Received CallingEventParams with empty EventType");
                return;
            }

            switch (callingEventParams.EventType.ToLower())
            {
            case "calling.call.state":
                OnCallingEvent_State(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.receive":
                OnCallingEvent_Receive(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.connect":
                OnCallingEvent_Connect(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.play":
                OnCallingEvent_Play(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.collect":
                OnCallingEvent_Collect(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.record":
                OnCallingEvent_Record(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.tap":
                OnCallingEvent_Tap(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.detect":
                OnCallingEvent_Detect(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.fax":
                OnCallingEvent_Fax(client, broadcastParams, callingEventParams);
                break;

            case "calling.call.send_digits":
                OnCallingEvent_SendDigits(client, broadcastParams, callingEventParams);
                break;

            default: break;
            }
        }
Beispiel #2
0
        private void OnCallingEvent_SendDigits(Client client, BroadcastParams broadcastParams, CallingEventParams callEventParams)
        {
            CallingEventParams.SendDigitsParams sendDigitsParams = null;
            try { sendDigitsParams = callEventParams.ParametersAs <CallingEventParams.SendDigitsParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse SendDigitsParams");
                return;
            }
            if (!mCalls.TryGetValue(sendDigitsParams.CallID, out Call call))
            {
                mLogger.LogWarning("Received SendDigitsParams with unknown CallID: {0}", sendDigitsParams.CallID);
                return;
            }

            call.SendDigitsStateChangeHandler(callEventParams, sendDigitsParams);
        }
Beispiel #3
0
        private void OnCallingEvent_Fax(Client client, BroadcastParams broadcastParams, CallingEventParams callEventParams)
        {
            CallingEventParams.FaxParams faxParams = null;
            try { faxParams = callEventParams.ParametersAs <CallingEventParams.FaxParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse FaxParams");
                return;
            }
            if (!mCalls.TryGetValue(faxParams.CallID, out Call call))
            {
                mLogger.LogWarning("Received FaxParams with unknown CallID: {0}", faxParams.CallID);
                return;
            }

            call.FaxHandler(callEventParams, faxParams);
        }
Beispiel #4
0
        private void OnCallingEvent_Connect(Client client, BroadcastParams broadcastParams, CallingEventParams callEventParams)
        {
            CallingEventParams.ConnectParams connectParams = null;
            try { connectParams = callEventParams.ParametersAs <CallingEventParams.ConnectParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse ConnectParams");
                return;
            }
            if (!mCalls.TryGetValue(connectParams.CallID, out Call call))
            {
                mLogger.LogWarning("Received ConnectParams with unknown CallID: {0}, {1}", connectParams.CallID, connectParams.State);
                return;
            }

            call.ConnectHandler(callEventParams, connectParams);
        }
Beispiel #5
0
        private void OnCallingEvent_Receive(Client client, BroadcastParams broadcastParams, CallingEventParams callEventParams)
        {
            CallingEventParams.ReceiveParams receiveParams = null;
            try { receiveParams = callEventParams.ParametersAs <CallingEventParams.ReceiveParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse ReceiveParams");
                return;
            }

            // @note A received call should only ever receive one receive event regardless of the state of the call, but we act as though
            // we could receive multiple just for sanity here, but the callbacks will still only be called when first created, which makes
            // this effectively a no-op on additional receive events
            Call call = null;
            Call tmp  = null;

            switch (receiveParams.Device.Type)
            {
            case CallDevice.DeviceType.phone:
            {
                CallDevice.PhoneParams phoneParams = null;
                try { phoneParams = receiveParams.Device.ParametersAs <CallDevice.PhoneParams>(); }
                catch (Exception exc)
                {
                    mLogger.LogWarning(exc, "Failed to parse PhoneParams");
                    return;
                }

                // If the call already exists under the real call id simply obtain the call, otherwise create a new call
                call = mCalls.GetOrAdd(receiveParams.CallID, k => (tmp = new PhoneCall(this, receiveParams.NodeID, receiveParams.CallID)
                    {
                        To = phoneParams.ToNumber,
                        From = phoneParams.FromNumber,
                        Timeout = phoneParams.Timeout,
                    }));
                break;
            }

            // @TODO: sip and webrtc
            default:
                mLogger.LogWarning("Unknown device type: {0}", receiveParams.Device.Type);
                return;
            }

            if (tmp == call)
            {
                call.Context = receiveParams.Context;

                OnCallCreated?.Invoke(this, call);
                OnCallReceived?.Invoke(this, call, receiveParams);
            }

            call.ReceiveHandler(callEventParams, receiveParams);
        }
Beispiel #6
0
        private void OnCallingEvent_State(Client client, BroadcastParams broadcastParams, CallingEventParams callEventParams)
        {
            CallingEventParams.StateParams stateParams = null;
            try { stateParams = callEventParams.ParametersAs <CallingEventParams.StateParams>(); }
            catch (Exception exc)
            {
                mLogger.LogWarning(exc, "Failed to parse StateParams");
                return;
            }

            Call call = null;

            if (!string.IsNullOrWhiteSpace(stateParams.TemporaryCallID))
            {
                // Remove the call keyed by the temporary call id if it exists
                if (mCalls.TryRemove(stateParams.TemporaryCallID, out call))
                {
                    // Update the internal details for the call, including the real call id
                    call.NodeID = stateParams.NodeID;
                    call.ID     = stateParams.CallID;
                }
            }
            // If call is not null at this point, it means this is the first event for a call that was started with a temporary call id
            // and the call should be readded under the real call id

            Call tmp = null;

            switch (stateParams.Device.Type)
            {
            case CallDevice.DeviceType.phone:
            {
                CallDevice.PhoneParams phoneParams = null;
                try { phoneParams = stateParams.Device.ParametersAs <CallDevice.PhoneParams>(); }
                catch (Exception exc)
                {
                    mLogger.LogWarning(exc, "Failed to parse PhoneParams");
                    return;
                }

                // If the call already exists under the real call id simply obtain the call, however if the call was found under
                // a temporary call id then readd it here under the real call id, otherwise create a new call
                call = mCalls.GetOrAdd(stateParams.CallID, k => call ?? (tmp = new PhoneCall(this, stateParams.NodeID, stateParams.CallID)
                    {
                        To = phoneParams.ToNumber,
                        From = phoneParams.FromNumber,
                        Timeout = phoneParams.Timeout,
                        // Capture the state, it may not always be created the first time we see the call
                        State = stateParams.CallState,
                    }));
                break;
            }

            // @TODO: sip and webrtc
            default:
                mLogger.LogWarning("Unknown device type: {0}", stateParams.Device.Type);
                return;
            }

            if (tmp == call)
            {
                OnCallCreated?.Invoke(this, call);
            }

            call.StateChangeHandler(callEventParams, stateParams);
        }