コード例 #1
0
ファイル: Phone.cs プロジェクト: MichaelGCox/ivrToolkit
 private void ClearLine()
 {
     if (_line != null)
     {
         _line.UnsubscribeToHangup(HandleHangup);
         _line.SendHangup();
         _line = null;
     }
 }
コード例 #2
0
ファイル: Simulator.cs プロジェクト: MichaelGCox/ivrToolkit
        public ILine GetLine(int lineNumber)
        {
            // make sure the simulator thread is started and listening for a connection
            SimulatorListener.Singleton.Start();

            try
            {
                return(Lines[lineNumber.ToString(CultureInfo.InvariantCulture)]);
            }
            catch (KeyNotFoundException)
            {
                var line = new SimulatorLine(lineNumber);
                Lines.Add(lineNumber.ToString(CultureInfo.InvariantCulture), line);
                return(line);
            }
        }
コード例 #3
0
ファイル: Phone.cs プロジェクト: MichaelGCox/ivrToolkit
        public CallAnalysis Dial(SimulatorLine line)
        {
            if (_line != null)
            {
                return(CallAnalysis.Busy);
            }

            lock (_dialoutLock)
            {
                Send("dialout");
                Monitor.Wait(_dialoutLock);
            }
            if (_dialAnalysis == CallAnalysis.Connected)
            {
                _line = line;
            }
            return(_dialAnalysis);
        }
コード例 #4
0
ファイル: Phone.cs プロジェクト: MichaelGCox/ivrToolkit
        private void ReadCallback(IAsyncResult ar)
        {
            // Retrieve the state object and the handler socket
            // from the asynchronous state object.
            var state   = (StateObject)ar.AsyncState;
            var handler = state.WorkSocket;

            int bytesRead;

            try
            {
                // Read data from the client socket.
                bytesRead = handler.EndReceive(ar);
            }
            catch (SocketException)
            {
                ClearLine();
                RemovePhone(_phoneNumber);
                return;
            }
            catch (ObjectDisposedException)
            {
                ClearLine();
                RemovePhone(_phoneNumber);
                return;
            }

            if (bytesRead > 0)
            {
                // There  might be more data, so store the data received so far.
                state.Sb.Append(Encoding.ASCII.GetString(
                                    state.Buffer, 0, bytesRead));

                // Check for end-of-file tag. If it is not there, read
                // more data.
                var content = state.Sb.ToString();
                var index   = content.IndexOf("<EOF>", StringComparison.Ordinal);
                if (index != -1)
                {
                    state.Sb = new StringBuilder();
                    string command = content.Substring(0, index);
                    if (command == "disconnect")
                    {
                        ClearLine();
                        handler.Shutdown(SocketShutdown.Both);
                        handler.Disconnect(false);
                        RemovePhone(_phoneNumber);
                        return;
                    }
                    if (command.StartsWith("dial,"))
                    {
                        var parts      = command.Split(new[] { ',' });
                        var lineNumber = int.Parse(parts[1]);
                        // line should equal null the first dial
                        if (_line == null)
                        {
                            _line = (SimulatorLine)(new Simulator().GetLine(lineNumber));
                            _line.SubscribeToHangup(HandleHangup);
                        }
                        switch (_line.Status)
                        {
                        case LineStatusTypes.OnHook:
                            Send("idle");
                            _line.UnsubscribeToHangup(HandleHangup);
                            _line = null;
                            break;

                        case LineStatusTypes.Connected:
                            Send("busy");
                            _line.UnsubscribeToHangup(HandleHangup);
                            _line = null;
                            break;

                        case LineStatusTypes.AcceptingCalls:
                            var status = _line.SendRing();
                            switch (status)
                            {
                            case LineStatusTypes.AcceptingCalls:
                                Send("ring");
                                break;

                            case LineStatusTypes.Connected:
                                Send("answered");
                                break;
                            }
                            break;
                        }
                    }
                    else if (command == "hangup")
                    {
                        ClearLine();
                    }
                    else if (command.StartsWith("dialoutResponse,"))
                    {
                        var parts      = command.Split(new[] { ',' });
                        var subCommand = parts[1];
                        switch (subCommand)
                        {
                        case "Busy":
                            _dialAnalysis = CallAnalysis.Busy;
                            break;

                        case "Ignore":
                            _dialAnalysis = CallAnalysis.NoAnswer;
                            break;

                        case "Answering Machine":
                            _dialAnalysis = CallAnalysis.AnsweringMachine;
                            break;

                        case "No Dial Tone":
                            _dialAnalysis = CallAnalysis.NoDialTone;
                            break;

                        case "Answer":
                            _dialAnalysis = CallAnalysis.Connected;
                            break;

                        default:
                            _dialAnalysis = CallAnalysis.Error;
                            break;
                        }
                        lock (_dialoutLock)
                        {
                            Monitor.Pulse(_dialoutLock);
                        }
                    }
                    else if (command.Length == 1)
                    {
                        _line.SendDigit(char.Parse(command));
                    }
                    else
                    {
                        // echo the command back
                        Send(command);
                    }
                }
                // read more or wait for the next command to come in
                handler.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0,
                                     ReadCallback, state);
            }
        }