示例#1
0
        private IPort CancelNotStartedCall(IPort portRejectedCall, RejectedCallEvent e)
        {
            IPort  portWhichNeedToSendNotification;
            string senderPhoneNumber;
            string receiverPhoneNumber;

            if (CallsWaitingToBeAnswered.ContainsKey(portRejectedCall))
            {
                portWhichNeedToSendNotification = CallsWaitingToBeAnswered[portRejectedCall];

                senderPhoneNumber   = portRejectedCall.PhoneNumber;
                receiverPhoneNumber = portWhichNeedToSendNotification.PhoneNumber;

                CallsWaitingToBeAnswered.Remove(portRejectedCall);
            }
            else
            {
                portWhichNeedToSendNotification = CallsWaitingToBeAnswered.FirstOrDefault(x => x.Value == portRejectedCall).Key;

                senderPhoneNumber   = portWhichNeedToSendNotification.PhoneNumber;
                receiverPhoneNumber = portRejectedCall.PhoneNumber;

                CallsWaitingToBeAnswered.Remove(portWhichNeedToSendNotification);
            }

            DisposeTimer(portRejectedCall);

            OnNotifyBillingSystemAboutCallEnd(new UnansweredCallEvent(senderPhoneNumber, receiverPhoneNumber,
                                                                      e.CallRejectionTime));

            Logger.WriteLine(
                $"{portRejectedCall.PhoneNumber} rejected call from {portWhichNeedToSendNotification.PhoneNumber}");

            return(portWhichNeedToSendNotification);
        }
示例#2
0
        private Timer SetTimer(IPort senderPort, IPort receiverPort)
        {
            var timer = new Timer(CancellationTime);

            timer.Elapsed += (sender, eventArgs) =>
            {
                Logger.WriteLine($"{receiverPort.PhoneNumber} Did not answered call from {senderPort.PhoneNumber}");

                OnNotifyPortOfFailure(
                    new FailureEvent(receiverPort.PhoneNumber, FailureType.AbonentIsNotResponding),
                    senderPort);

                OnNotifyPortOfFailure(
                    new FailureEvent(receiverPort.PhoneNumber, FailureType.AbonentIsNotResponding),
                    receiverPort);

                CallsWaitingToBeAnswered.Remove(senderPort);
                DisposeTimer(senderPort);

                Logger.WriteLine("Base Station Notifies Billing System about Failed Call " +
                                 $"from {senderPort.PhoneNumber} to {receiverPort.PhoneNumber}");

                OnNotifyBillingSystemAboutCallEnd(new UnansweredCallEvent(senderPort.PhoneNumber,
                                                                          receiverPort.PhoneNumber, DateTime.Now));
            };                       // creating logic wich will track time and perform certain actions if time expires

            timer.AutoReset = false; // switch off timer reset
            timer.Enabled   = true;  // enable set timer

            return(timer);
        }
示例#3
0
        private void ConnectPorts(IPort senderPort, OutgoingCallEvent e)
        {
            var receiverPort = Ports.FirstOrDefault(x => x.PhoneNumber == e.ReceiverPhoneNumber);

            if (receiverPort == null || senderPort == null || receiverPort.PortStatus == PortStatus.SwitchedOff)
            {
                OnNotifyPortOfFailure(new FailureEvent(e.ReceiverPhoneNumber, FailureType.AbonentDoesNotExist),
                                      senderPort);

                Logger.WriteLine($"{e.ReceiverPhoneNumber} does not exist");
            }
            else if (receiverPort.PortStatus != PortStatus.Free)
            {
                OnNotifyPortOfFailure(new FailureEvent(e.ReceiverPhoneNumber, FailureType.AbonentIsBusy),
                                      senderPort);

                Logger.WriteLine($"{e.ReceiverPhoneNumber} is busy");
            }
            else
            {
                CallsWaitingToBeAnswered.Add(senderPort, receiverPort);                                  // add aour cakk information to specified list

                PortTimeout.Add(senderPort, SetTimer(senderPort, receiverPort));                         // setting timer for call waiting to be answered, wich will end call after certain ammout of time if it wasn't answered

                OnNotifyPortOfIncomingCall(new IncomingCallEvent(senderPort.PhoneNumber), receiverPort); // This method will call the event that invokes methods that changes telephones statuses and send notifications
            }
        }
示例#4
0
        public void AnswerCall(object sender, AnsweredCallEvent e)
        {
            if (!(sender is IPort receiverPort))
            {
                return;
            }

            var senderPort = CallsWaitingToBeAnswered.FirstOrDefault(x => x.Value == receiverPort).Key;

            if (senderPort == null)
            {
                return;
            }

            DisposeTimer(senderPort);                    // dispose timer because call was answered
            CallsWaitingToBeAnswered.Remove(senderPort); // remove information about call from this specified list

            CallsInProgress.Add(new HeldCallEvent(senderPort.PhoneNumber, receiverPort.PhoneNumber)
            {
                CallStartTime = e.CallStartTime
            });                                   //

            Logger.WriteLine($"{receiverPort.PhoneNumber} answered call from {senderPort.PhoneNumber}");
        }