Exemplo n.º 1
0
        protected virtual void OnPortRejectRecive(object sender, ICallingEventArgs e)
        {
            Console.WriteLine("Port[{0}]: recive reject.\n", this.PortId);

            this.State = PortStates.Free;
            PortRejectReciving?.Invoke(sender, e);
        }
        private void HandlePortCallRequest(object sender, ICallingEventArgs e)
        {
            IPort sourcePort = sender as IPort;

            if (_portMapping.ContainsKey(e.TargetNumber))
            {
                IPort targetPort = _portMapping[e.TargetNumber];

                if (targetPort.State == PortStates.Free)
                {
                    Console.WriteLine("Station: port[{0}] transfer call from terminal {1} to terminal {2}.\n",
                                      sourcePort.PortId, e.SourceNumber, e.TargetNumber);

                    _waitingConnection[sourcePort] = targetPort;
                    targetPort.PortReciveCall(targetPort, e);
                }
                else
                {
                    Console.WriteLine(
                        "Station to port[{0}]: call from terminal {1} to terminal {2} turn dowm. Terminal busy or disconected.\n",
                        sourcePort.PortId, e.SourceNumber, e.TargetNumber);

                    sourcePort.PortReciveReject(sourcePort, e);
                    CreateUnsuccessfulStats(e);
                }
            }
            else
            {
                Console.WriteLine("Station to port[{0}]: invalid target number, or number is not exist.\n",
                                  sourcePort.PortId);

                sourcePort.PortReciveReject(sourcePort, e);
            }
        }
Exemplo n.º 3
0
        protected virtual void OnPortAnswerRecive(object sender, ICallingEventArgs e)
        {
            Console.WriteLine("Port[{0}]: recive answer from {1} to {2}.\n",
                              this.PortId, e.TargetNumber, e.SourceNumber);

            PortAnswerReciving?.Invoke(sender, e);
        }
        private void CreateUnsuccessfulStats(ICallingEventArgs e)
        {
            IStatistic sourceStat = new NotCalledStatistic(_day, e.TargetNumber);
            IStatistic targetStat = new MissedCallStatistic(_day, e.SourceNumber);

            _billing.AddStats(e.SourceNumber, sourceStat);
            _billing.AddStats(e.TargetNumber, targetStat);
        }
Exemplo n.º 5
0
        protected virtual void OnPortCallSend(object sender, ICallingEventArgs e)
        {
            Console.WriteLine("Port[{0}]: terminal {1} calling to terminal {2}.\n",
                              this.PortId, e.SourceNumber, e.TargetNumber);

            this.State = PortStates.Busy;
            PortCallSending?.Invoke(this, e);
        }
Exemplo n.º 6
0
 public void SetOnlineState(object sender, ICallingEventArgs e)
 {
     if (State == TerminalStates.OutgoingCall)
     {
         State = TerminalStates.Online;
         Console.WriteLine("Terminal {0}: online with terminal {1}.\n", this.Number, e.TargetNumber);
     }
 }
        private void CreateSuccessfulStats(ICallingEventArgs e)
        {
            IStatistic sourceStat = new OutgoingCallStatistic(_day, _callSpan, e.TargetNumber);
            IStatistic targetStat = new IncomingCallStatistic(_day, _callSpan, e.SourceNumber);

            _billing.AddStats(e.SourceNumber, sourceStat);
            _billing.AddStats(e.TargetNumber, targetStat);
        }
Exemplo n.º 8
0
        protected virtual void OnPortRejectSend(object sender, ICallingEventArgs e)
        {
            Console.WriteLine("Port[{0}]: transfer reject.\n",
                              this.PortId);

            this.State = PortStates.Free;
            PortRejectSending?.Invoke(this, e);
        }
Exemplo n.º 9
0
        public void SetConnectedState(object sender, ICallingEventArgs e)
        {
            if (State == TerminalStates.OutgoingCall || State == TerminalStates.Online)
            {
                Console.WriteLine("Terminal {0}: call rejected.\n", this.Number);

                State = TerminalStates.Connected;
            }
        }
Exemplo n.º 10
0
        public void SetIncommingCallState(object sender, ICallingEventArgs e)
        {
            Console.WriteLine("Terminal {0}: have incomming call from terminal {1}.\n", e.TargetNumber, e.SourceNumber);

            if (State == TerminalStates.Connected)
            {
                State = TerminalStates.IncommingCall;
                _e    = e;
            }
        }
        private void HandleRejectRequestFromSourceTerminal(IPort port, ICallingEventArgs e)
        {
            IPort sourcePort = port;
            IPort targetPort = _onConnection[sourcePort];

            Console.WriteLine(
                "Station: port[{0}] transfer reject from terminal {1} to terminal {2}.\n",
                sourcePort.PortId, e.SourceNumber, e.TargetNumber);

            _onConnection.Remove(sourcePort);
            targetPort.PortReciveReject(targetPort, e);
        }
        private void HandleRejectRequestFromTargetTerminal(IPort port, ICallingEventArgs e)
        {
            IPort sourcePort = _onConnection.FirstOrDefault(x => x.Value == port).Key;
            IPort targetPort = port;

            Console.WriteLine(
                "Station: port[{0}] transfer reject from terminal {2} to terminal {1}.\n",
                targetPort.PortId, e.SourceNumber, e.TargetNumber);

            _onConnection.Remove(sourcePort);
            sourcePort.PortReciveReject(sourcePort, e);
        }
        private void HandleIgnoreRequest(IPort port, ICallingEventArgs e)
        {
            // Ignore request only from 'target' terminal

            IPort targetPort = port;
            IPort sourcePort = _waitingConnection.FirstOrDefault(x => x.Value == port).Key;

            _waitingConnection.Remove(sourcePort);

            Console.WriteLine(
                "Station: port[{0}] transfer reject from terminal {2} to terminal {1}.\n",
                targetPort.PortId, e.SourceNumber, e.TargetNumber);

            sourcePort.PortReciveReject(sourcePort, e);
        }
        private void HandlePortAnswerRequest(object sender, ICallingEventArgs e)
        {
            Console.WriteLine(
                "Station: port[{0}] transfer answer from terminal {2} to terminal {1}. Terminals online.\n",
                (sender as IPort).PortId, e.SourceNumber, e.TargetNumber);

            Thread.Sleep(750);
            _callSpan = TimeSpan.FromMinutes(random.Next(1, 15));
            _day      = DateTime.Now.AddDays(random.Next(0, 5));

            IPort targetPort = sender as IPort;
            IPort sourcePort = _portMapping[e.SourceNumber];

            if (sourcePort.State == PortStates.Busy)
            {
                _waitingConnection.Remove(targetPort); _waitingConnection.Remove(sourcePort);
                _onConnection[sourcePort] = targetPort;
                sourcePort.PortReciveAnswer(targetPort, e);
            }
        }
        private void HandlePortRejectRequest(object sender, ICallingEventArgs e)
        {
            IPort port = sender as IPort;

            if (_waitingConnection.Values.Contains(port))
            {
                HandleIgnoreRequest(port, e);
                CreateUnsuccessfulStats(e);
            }
            else if (_onConnection.Keys.Contains(port))
            {
                HandleRejectRequestFromSourceTerminal(port, e);
                CreateSuccessfulStats(e);
            }
            else if (_onConnection.Values.Contains(port))
            {
                HandleRejectRequestFromTargetTerminal(port, e);
                CreateSuccessfulStats(e);
            }
        }
Exemplo n.º 16
0
        public void CallingTo(object sender, ICallingEventArgs e)
        {
            if ((_usersData.ContainsKey(e.TargetTelephoneNumber) && e.TargetTelephoneNumber != e.TelephoneNumber)
                || e is EndCallEventArgs)
            {
                CallInformation inf = null;
                Port targetPort;
                Port port;
                int number = 0;
                int targetNumber = 0;
                if (e is EndCallEventArgs)
                {
                    var callListFirst = _callList.First(x => x.Id.Equals(e.Id));
                    if (callListFirst.MyNumber == e.TelephoneNumber)
                    {
                        targetPort = _usersData[callListFirst.TargetNumber].Item1;
                        port = _usersData[callListFirst.MyNumber].Item1;
                        number = callListFirst.MyNumber;
                        targetNumber = callListFirst.TargetNumber;
                    }
                    else
                    {
                        port = _usersData[callListFirst.TargetNumber].Item1;
                        targetPort = _usersData[callListFirst.MyNumber].Item1;
                        targetNumber = callListFirst.MyNumber;
                        number = callListFirst.TargetNumber;
                    }
                }
                else
                {
                    targetPort = _usersData[e.TargetTelephoneNumber].Item1;
                    port = _usersData[e.TelephoneNumber].Item1;
                    targetNumber = e.TargetTelephoneNumber;
                    number = e.TelephoneNumber;
                }
                if (targetPort.State == Enums.PortState.Connect && port.State == PortState.Connect)
                {
                    var tuple = _usersData[number];
                    var targetTuple = _usersData[targetNumber];

                    if (e is AnswerEventArgs)
                    {

                        var answerArgs = (AnswerEventArgs)e;

                        if (!answerArgs.Id.Equals(Guid.Empty) && _callList.Any(x => x.Id.Equals(answerArgs.Id)))
                        {
                            inf = _callList.First(x => x.Id.Equals(answerArgs.Id));
                        }

                        if (inf != null)
                        {
                            targetPort.AnswerCall(answerArgs.TelephoneNumber, answerArgs.TargetTelephoneNumber, answerArgs.StateInCall, inf.Id);
                        }
                        else
                        {
                            targetPort.AnswerCall(answerArgs.TelephoneNumber, answerArgs.TargetTelephoneNumber, answerArgs.StateInCall);
                        }
                    }
                    if (e is CallEventArgs)
                    {
                        if (tuple.Item2.Subscriber.Money > tuple.Item2.Tariff.CostOfCallPerMinute)
                        {
                            var callArgs = (CallEventArgs)e;

                            if (callArgs.Id.Equals(Guid.Empty))
                            {
                                inf = new CallInformation(
                                    callArgs.TelephoneNumber,
                                    callArgs.TargetTelephoneNumber,
                                    DateTime.Now);
                                _callList.Add(inf);
                            }

                            if (!callArgs.Id.Equals(Guid.Empty) && _callList.Any(x => x.Id.Equals(callArgs.Id)))
                            {
                                inf = _callList.First(x => x.Id.Equals(callArgs.Id));
                            }
                            if (inf != null)
                            {
                                targetPort.IncomingCall(callArgs.TelephoneNumber, callArgs.TargetTelephoneNumber, inf.Id);
                            }
                            else
                            {
                                targetPort.IncomingCall(callArgs.TelephoneNumber, callArgs.TargetTelephoneNumber);
                            }
                        }
                        else
                        {
                            Console.WriteLine("Terminal with number {0} is not enough money in the account!", e.TelephoneNumber);

                        }
                    }
                    if (e is EndCallEventArgs)
                    {
                        var args = (EndCallEventArgs)e;
                        inf = _callList.First(x => x.Id.Equals(args.Id));
                        inf.EndCall = DateTime.Now;
                        var sumOfCall = tuple.Item2.Tariff.CostOfCallPerMinute * TimeSpan.FromTicks((inf.EndCall - inf.BeginCall).Ticks).TotalMinutes;
                        inf.Cost = (int)sumOfCall;
                        targetTuple.Item2.Subscriber.RemoveMoney(inf.Cost);
                        targetPort.AnswerCall(args.TelephoneNumber, args.TargetTelephoneNumber, CallState.Rejected, inf.Id);
                    }
                }
            }
            else if (!_usersData.ContainsKey(e.TargetTelephoneNumber))
            {
                Console.WriteLine("You have calling a non-existent number!!!");
            }
            else
            {
                Console.WriteLine("You have calling a your number!!!");
            }
        }
Exemplo n.º 17
0
 protected virtual void OnCalling(int targetNumber)
 {
     _e = new CallEventArgs(this.Number, targetNumber);
     Calling?.Invoke(this, _e);
 }
Exemplo n.º 18
0
 public void PortReciveReject(object sender, ICallingEventArgs e)
 {
     OnPortRejectRecive(sender, e);
 }
Exemplo n.º 19
0
 public void PortReciveAnswer(object sender, ICallingEventArgs e)
 {
     OnPortAnswerRecive(sender, e);
 }
Exemplo n.º 20
0
 public void PortReciveCall(object sender, ICallingEventArgs e)
 {
     this.State = PortStates.Busy;
     OnPortCallRecive(sender, e);
 }
Exemplo n.º 21
0
        public void CallingTo(object sender, ICallingEventArgs e)
        {
            if ((_usersData.ContainsKey(e.TargetTelephoneNumber) && e.TargetTelephoneNumber != e.TelephoneNumber) ||
                e is EndCallEventArgs)
            {
                CallInformation inf = null;
                Port            targetPort;
                Port            port;
                int             number       = 0;
                int             targetNumber = 0;
                if (e is EndCallEventArgs)
                {
                    var callListFirst = _callList.First(x => x.Id.Equals(e.Id));
                    if (callListFirst.MyNumber == e.TelephoneNumber)
                    {
                        targetPort   = _usersData[callListFirst.TargetNumber].Item1;
                        port         = _usersData[callListFirst.MyNumber].Item1;
                        number       = callListFirst.MyNumber;
                        targetNumber = callListFirst.TargetNumber;
                    }
                    else
                    {
                        port         = _usersData[callListFirst.TargetNumber].Item1;
                        targetPort   = _usersData[callListFirst.MyNumber].Item1;
                        targetNumber = callListFirst.MyNumber;
                        number       = callListFirst.TargetNumber;
                    }
                }
                else
                {
                    targetPort   = _usersData[e.TargetTelephoneNumber].Item1;
                    port         = _usersData[e.TelephoneNumber].Item1;
                    targetNumber = e.TargetTelephoneNumber;
                    number       = e.TelephoneNumber;
                }
                if (targetPort.State == Enums.PortState.Connect && port.State == PortState.Connect)
                {
                    var tuple       = _usersData[number];
                    var targetTuple = _usersData[targetNumber];

                    if (e is AnswerEventArgs)
                    {
                        var answerArgs = (AnswerEventArgs)e;

                        if (!answerArgs.Id.Equals(Guid.Empty) && _callList.Any(x => x.Id.Equals(answerArgs.Id)))
                        {
                            inf = _callList.First(x => x.Id.Equals(answerArgs.Id));
                        }

                        if (inf != null)
                        {
                            targetPort.AnswerCall(answerArgs.TelephoneNumber, answerArgs.TargetTelephoneNumber, answerArgs.StateInCall, inf.Id);
                        }
                        else
                        {
                            targetPort.AnswerCall(answerArgs.TelephoneNumber, answerArgs.TargetTelephoneNumber, answerArgs.StateInCall);
                        }
                    }
                    if (e is CallEventArgs)
                    {
                        if (tuple.Item2.Subscriber.Money > tuple.Item2.Tariff.CostOfCallPerMinute)
                        {
                            var callArgs = (CallEventArgs)e;

                            if (callArgs.Id.Equals(Guid.Empty))
                            {
                                inf = new CallInformation(
                                    callArgs.TelephoneNumber,
                                    callArgs.TargetTelephoneNumber,
                                    DateTime.Now);
                                _callList.Add(inf);
                            }

                            if (!callArgs.Id.Equals(Guid.Empty) && _callList.Any(x => x.Id.Equals(callArgs.Id)))
                            {
                                inf = _callList.First(x => x.Id.Equals(callArgs.Id));
                            }
                            if (inf != null)
                            {
                                targetPort.IncomingCall(callArgs.TelephoneNumber, callArgs.TargetTelephoneNumber, inf.Id);
                            }
                            else
                            {
                                targetPort.IncomingCall(callArgs.TelephoneNumber, callArgs.TargetTelephoneNumber);
                            }
                        }
                        else
                        {
                            Console.WriteLine("Terminal with number {0} is not enough money in the account!", e.TelephoneNumber);
                        }
                    }
                    if (e is EndCallEventArgs)
                    {
                        var args = (EndCallEventArgs)e;
                        inf         = _callList.First(x => x.Id.Equals(args.Id));
                        inf.EndCall = DateTime.Now;
                        var sumOfCall = tuple.Item2.Tariff.CostOfCallPerMinute * TimeSpan.FromTicks((inf.EndCall - inf.BeginCall).Ticks).TotalMinutes;
                        inf.Cost = (int)sumOfCall;
                        targetTuple.Item2.Subscriber.RemoveMoney(inf.Cost);
                        targetPort.AnswerCall(args.TelephoneNumber, args.TargetTelephoneNumber, CallState.Rejected, inf.Id);
                    }
                }
            }
            else if (!_usersData.ContainsKey(e.TargetTelephoneNumber))
            {
                Console.WriteLine("You have calling a non-existent number!!!");
            }
            else
            {
                Console.WriteLine("You have calling a your number!!!");
            }
        }