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); }
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); }
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 } }
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}"); }