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); } }
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); }
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); }
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); }
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); }
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; } }
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); } }
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!!!"); } }
protected virtual void OnCalling(int targetNumber) { _e = new CallEventArgs(this.Number, targetNumber); Calling?.Invoke(this, _e); }
public void PortReciveReject(object sender, ICallingEventArgs e) { OnPortRejectRecive(sender, e); }
public void PortReciveAnswer(object sender, ICallingEventArgs e) { OnPortAnswerRecive(sender, e); }
public void PortReciveCall(object sender, ICallingEventArgs e) { this.State = PortStates.Busy; OnPortCallRecive(sender, e); }
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!!!"); } }