public byte[] Encode(SubtConnectedPeerStream connectedStream)
        {
            var ms = new MemoryStream();

            using (var writer = new BinaryWriter(ms))
            {
                ExtensionProcedures.InitializeExtensionSignalingPacket(writer, connectedStream.SubtLocalPeer.LocalPeer.LocalPeerId, connectedStream.SubtConnectedPeer.RemotePeerId, connectedStream.StreamId, connectedStream.SubtLocalPeer.ExtensionId);
                writer.Write((byte)SubtPacketType.RemoteStatus);
                writer.Write(RecentRxBandwidth);
                writer.Write(RecentRxPacketLoss);
                writer.Write(RecentTxBandwidth);
                byte flags = 0;
                if (IwantToIncreaseBandwidthUntilHighPacketLoss)
                {
                    flags |= 0x01;
                }
                if (IhavePassiveRole)
                {
                    flags |= 0x02;
                }

                writer.Write(flags);
            }
            return(ms.ToArray());
        }
Пример #2
0
        internal void ProcessReceivedExtensionSignalingPacket(BinaryReader reader, IPEndPoint remoteEndpoint)
        {
            // enqueue into manager thread // reduce load of the receiver thread
            _actionsQueue.Enqueue(() =>
            {
                (var fromPeerId, var toPeerId, var streamId, var extensionId) = ExtensionProcedures.ParseExtensionSignalingPacket(reader);

                if (_localPeer.LocalPeerId.Equals(toPeerId) == false)
                {
                    _localPeer.Firewall.OnUnauthenticatedReceivedPacket(remoteEndpoint);
                    return;
                }

                if (fromPeerId == null || !_connectedPeers.TryGetValue(fromPeerId, out var connectedPeer))
                {
                    _localPeer.Firewall.OnUnauthenticatedReceivedPacket(remoteEndpoint);
                    return;
                }

                if (!connectedPeer.Streams.TryGetValue(streamId, out var stream))
                {
                    _localPeer.Firewall.OnUnauthenticatedReceivedPacket(remoteEndpoint);
                    return;
                }

                if (_localPeer.ExtensionsById.TryGetValue(extensionId, out var extension))
                {
                    if (stream.Extensions.TryGetValue(extension, out var streamExtension))
                    {
                        streamExtension.OnReceivedSignalingPacket(reader);
                    }
                }
            }, "ProcessReceivedExtensionSignalingPacket3458");
        }
Пример #3
0
        void InitializePayloadPacket()
        {
            _payloadPacket = new byte[LocalLogicConfiguration.UdpMaxPacketSizeWithoutHeadersBytes];
            var rnd = new Random();

            rnd.NextBytes(_payloadPacket);
            _payloadPacketIndex = ExtensionProcedures.InitializePayloadPacketForExtension(PacketHeaders.SubtPayload, _payloadPacket, _stream.StreamId);
        }
Пример #4
0
        public byte[] Encode(SubtConnectedPeerStream connectedStream)
        {
            PacketProcedures.CreateBinaryWriter(out var ms, out var writer);

            ExtensionProcedures.InitializeExtensionSignalingPacket(writer, connectedStream.SubtLocalPeer.LocalPeer.LocalPeerId, connectedStream.SubtConnectedPeer.RemotePeerId, connectedStream.StreamId, connectedStream.SubtLocalPeer.ExtensionId);
            writer.Write((byte)SubtPacketType.AdjustmentResponse);

            byte flags = 0; // not used now

            writer.Write(flags);
            writer.Write(TxTargetBandwidth);

            return(ms.ToArray());
        }
Пример #5
0
        public byte[] Encode(SubtConnectedPeerStream connectedStream)
        {
            PacketProcedures.CreateBinaryWriter(out var ms, out var writer);

            ExtensionProcedures.InitializeExtensionSignalingPacket(writer, connectedStream.SubtLocalPeer.LocalPeer.LocalPeerId, connectedStream.SubtConnectedPeer.RemotePeerId, connectedStream.StreamId, connectedStream.SubtLocalPeer.ExtensionId);
            writer.Write((byte)SubtPacketType.RemoteStatus);
            writer.Write(RecentRxBandwidth);
            writer.Write(RecentRxPacketLoss);
            writer.Write(RecentTxBandwidth);
            byte flags = 0;

            if (IhavePassiveRole)
            {
                flags |= 0x02;
            }
            if (ImHealthyAndReadyFor100kbpsU2uSymbiosis)
            {
                flags |= 0x04;
            }
            writer.Write(flags);
            return(ms.ToArray());
        }
Пример #6
0
        void ThreadEntry()
        {
            IPEndPoint remoteEndpoint = default(IPEndPoint);

            while (!_disposing)
            {
                try
                {
                    _actionsQueue.ExecuteQueued();

                    var udpData = UdpSocket.Receive(ref remoteEndpoint);

                    var timestamp32 = _localPeer.Time32;
                    if (_previousTimestamp32.HasValue)
                    {
                        var timePassed32 = unchecked (timestamp32 - _previousTimestamp32.Value);
                        _pps.Input(1, timePassed32);
                        _bps.Input((udpData.Length + LocalLogicConfiguration.IpAndUdpHeadersSizeBytes) * 8, timePassed32);
                    }
                    _previousTimestamp32 = timestamp32;

                    var manager = _localPeer.Manager;
                    if (manager != null && _localPeer.Firewall.PacketIsAllowed(remoteEndpoint) && udpData.Length > 4)
                    {
                        if (udpData[0] == (byte)PacketTypes.NatTest1Request)
                        {
                            manager.ProcessReceivedNat1TestRequest(this, udpData, remoteEndpoint);
                            return;
                        }

                        var packetType = P2ptpCommon.DecodeHeader(udpData);
                        if (packetType.HasValue)
                        {
                            switch (packetType.Value)
                            {
                            case PacketTypes.hello:
                                manager.ProcessReceivedHello(udpData, remoteEndpoint, this, timestamp32);
                                break;

                            case PacketTypes.peersListIpv4:
                                manager.ProcessReceivedSharedPeers(udpData, remoteEndpoint);
                                break;

                            case PacketTypes.extensionSignaling:
                                manager.ProcessReceivedExtensionSignalingPacket(BinaryProcedures.CreateBinaryReader(udpData, P2ptpCommon.HeaderSize), remoteEndpoint);
                                break;
                            }
                        }
                        else
                        {
                            (var extension, var streamId, var index) = ExtensionProcedures.ParseReceivedExtensionPayloadPacket(udpData, _localPeer.Configuration.Extensions);
                            if (extension != null)
                            {
                                if (_streams.TryGetValue(streamId, out var stream))
                                {
                                    stream.Extensions.TryGetValue(extension, out var streamExtension);
                                    streamExtension.OnReceivedPayloadPacket(udpData, index);
                                }
                                //else _localPeer.WriteToLog(LogModules.Receiver, $"receiver {SocketInfo} got packet from bad stream id {streamId}");
                            }
                        }
                    }
                }
                //   catch (InvalidOperationException)
                //   {// intentionally ignored   (before "connection")
                //   }
                catch (SocketException exc)
                {
                    if (_disposing)
                    {
                        return;
                    }
                    if (exc.ErrorCode != 10054) // forcibly closed - ICMP port unreachable - it is normal when peer gets down
                    {
                        _localPeer.HandleException(LogModules.Receiver, exc);
                    }
                    // else ignore it
                }
                catch (Exception exc)
                {
                    _localPeer.HandleException(LogModules.Receiver, exc);
                }
            }
        }
        private void showPawnLoanData()
        {
            if (currIndex >= 0)
            {
                var pl = selectedLoans[currIndex];

                siteID = new SiteId
                {
                    Alias       = GlobalDataAccessor.Instance.CurrentSiteId.Alias,
                    Company     = GlobalDataAccessor.Instance.CurrentSiteId.Company,
                    Date        = ShopDateTime.Instance.ShopDate,
                    LoanAmount  = pl.Amount,
                    State       = pl.OrgShopState,
                    StoreNumber = pl.OrgShopNumber,
                    TerminalId  = GlobalDataAccessor.Instance.CurrentSiteId.TerminalId
                };

                var businessRulesProcedures = new BusinessRulesProcedures(DS);
                partialPaymentAllowed = businessRulesProcedures.IsPartialPaymentAllowed(siteID);
                var partialPaymentInLastMonth   = pl.PartialPayments.Any(pp => pp.Date_Made > pl.PfiNote && pp.Date_Made < pl.PfiEligible);
                var allowFutureInterestPayments = businessRulesProcedures.AllowFutureInterestPayments(siteID);
                var storageFee = businessRulesProcedures.GetStorageFee(siteID);

                labelLoanNumber.Text  = pl.TicketNumber.ToString();
                labelCurrDueDate.Text = pl.DueDate.FormatDate();

                DateTime PartialPmtDate = DateTime.MaxValue;


                if (pl.PartialPaymentPaid)
                {
                    Common.Libraries.Objects.Pawn.PartialPayment pmt = pl.PartialPayments.OrderByDescending(pp => pp.Time_Made).FirstOrDefault();
                    PartialPmtDate = pmt.Date_Made;
                    interestAmount = pmt.CUR_FIN_CHG;
                    serviceAmount  = pmt.Cur_Srv_Chg;
                }
                else
                {
                    interestAmount = pl.InterestAmount;
                    serviceAmount  = pl.ServiceCharge;
                }
                if (partialPaymentAllowed && _extensionType != ExtensionTerms.DAILY)
                {
                    ExtensionProcedures.GetExtensionPeriod(PartialPmtDate,
                                                           pl.DateMade,
                                                           ShopDateTime.Instance.ShopDate,
                                                           pl.DueDate,
                                                           pl.PfiNote,
                                                           pl.PfiEligible,
                                                           pl.ExtensionType,
                                                           out daysToPay,
                                                           out monthsToPay,
                                                           out LastCycleEnd);
                }
                else
                {
                    pl.ExtensionType = _extensionType;
                    //daysToPay = 30;
                }

                int     daysToAdd;
                decimal amountToExtend;

                dailyAmount = ServiceLoanProcedures.GetDailyAmount(pl.ExtensionType, interestAmount, serviceAmount);
                if (pl.ExtensionType == ExtensionTerms.MONTHLY)
                {
                    customTextBoxNumDaystoExtend.Visible = false;
                    ddlNumDaystoExtend.Visible           = true;
                    suppressDaysChangedEvent             = true;
                    for (int i = 1; i <= monthsToPay; i++)
                    {
                        ddlNumDaystoExtend.Items.Add(i.ToString());
                    }
                    if (ddlNumDaystoExtend.Items.Count > 0)
                    {
                        ddlNumDaystoExtend.SelectedIndex = 0;
                    }
                    suppressDaysChangedEvent = false;

                    customTextBoxAmtToExtend.Visible = false;
                    lblAmtToExtend.Visible           = true;
                    int monthsToExtendBy = 1;
                    if (partialPaymentAllowed && pl.PartialPaymentPaid)
                    {
                        monthsToExtendBy = GetDaysToExtendFromUI() - 1;

                        amountToExtend = (monthsToExtendBy * dailyAmount) + (daysToPay * interestAmount / 30) + (daysToPay * serviceAmount / 30);
                    }
                    else
                    {
                        monthsToExtendBy = GetDaysToExtendFromUI();
                        amountToExtend   = monthsToExtendBy * dailyAmount;
                    }
                    lblAmtToExtend.Text = amountToExtend.ToString("f2");
                    this.ActiveControl  = this.ddlNumDaystoExtend;

                    var pfiDateAdjusted = false;
                    labelAdjustedDueDate.Text =
                        new BusinessRulesProcedures(DS).GetValidDueDate(pl.DueDate.AddMonths(Utilities.GetIntegerValue(ddlNumDaystoExtend.Text, 1)), siteID);
                    dateCalendarLastPickupDate.SelectedDate =
                        new BusinessRulesProcedures(GlobalDataAccessor.Instance.DesktopSession).GetValidPFIDate(
                            pl.PfiEligible.AddMonths(Utilities.GetIntegerValue(ddlNumDaystoExtend.Text, 1)),
                            siteID, ref pfiDateAdjusted);
                    dateCalendarLastPickupDate.Enabled = false;
                }
                else
                {
                    customTextBoxNumDaystoExtend.Visible = true;
                    ddlNumDaystoExtend.Visible           = false;
                    customTextBoxNumDaystoExtend.Text    = "30";
                    labelNumDaysToExtendHeading.Visible  = true;
                    customTextBoxAmtToExtend.Visible     = true;
                    lblAmtToExtend.Visible = false;
                    SetAmountToExtendToUI(ServiceLoanProcedures.GetAmountToExtend(GetDaysToExtendFromUI(), dailyAmount));
                    daysToAdd          = GetDaysToExtendFromUI();
                    this.ActiveControl = this.customTextBoxNumDaystoExtend;
                    var pfiDateAdjusted = false;
                    labelDailyAmtHeading.Text = "Daily Amount:";
                    if (partialPaymentAllowed && pl.PartialPaymentPaid && !allowFutureInterestPayments)
                    {
                        labelNumDaysToExtendHeading.Text = "One Month's Full Charge";
                        //customTextBoxNumDaystoExtend.Visible = false;
                        ddlNumDaystoExtend.Visible = false;
                        lblNumDaysToExtend.Visible = true;
                        //customTextBoxAmtToExtend.Visible = false;
                        lblAmtToExtend.Visible = false;
                        //lblNumDaysToExtend.Text = fullMonth;
                        customTextBoxAmtToExtend.Visible  = true;
                        customTextBoxAmtToExtend.Text     = (daysToPay * dailyAmount).ToString("f2");
                        customTextBoxNumDaystoExtend.Text = (interestAmount + serviceAmount).ToString("f2");
                        labelAdjustedDueDate.Text         =
                            new BusinessRulesProcedures(DS).GetValidDueDate(LastCycleEnd.AddMonths(1), siteID);
                        dateCalendarLastPickupDate.SelectedDate =
                            new BusinessRulesProcedures(GlobalDataAccessor.Instance.DesktopSession).GetValidPFIDate(
                                pl.PfiEligible.AddMonths(1),
                                siteID, ref pfiDateAdjusted);
                        dateCalendarLastPickupDate.Enabled   = false;
                        customTextBoxAmtToExtend.Enabled     = false;
                        customTextBoxNumDaystoExtend.Enabled = false;
                    }
                    else
                    {
                        labelAdjustedDueDate.Text =
                            new BusinessRulesProcedures(DS).GetValidDueDate(pl.DueDate.AddDays(daysToAdd), siteID);
                        dateCalendarLastPickupDate.SelectedDate =
                            new BusinessRulesProcedures(GlobalDataAccessor.Instance.DesktopSession).GetValidPFIDate(
                                pl.PfiEligible.AddDays(daysToAdd),
                                siteID, ref pfiDateAdjusted);
                    }
                }

                lblNumDaysToExtend.Visible = false;

                labelDailyAmount.Text = String.Format("{0:0.0000}", dailyAmount);

                daysToExtend            = GetDaysToExtendFromUI();
                AmtToExtend             = GetAmountToExtendFromUI();
                newPickupDate           = dateCalendarLastPickupDate.SelectedDate;
                labelLoanSelection.Text = (this.currIndex + 1) + " of " + this.numberOfLoansToExtend;
                //}

                currentPFIDate = pl.PfiEligible;

                //Show the selection for printing memo of extension in single page
                //if this is the last loan to be processed
                if (currIndex + 1 == numberOfLoansToExtend)
                {
                    //Check if there are any service loans set for extension already
                    var idx = GlobalDataAccessor.Instance.DesktopSession.ServiceLoans.FindIndex(ploan => ploan.TempStatus == StateStatus.E);

                    if (new BusinessRulesProcedures(GlobalDataAccessor.Instance.DesktopSession).PrintMultipleMemoOfExtension(siteID) && (numberOfLoansToExtend > 1 || idx >= 0) &&
                        !GlobalDataAccessor.Instance.DesktopSession.PrintSingleMemoOfExtension)
                    {
                        this.checkBoxPrintSingleMemoForExtn.Visible = true;
                    }
                    this.customButtonContinue.Text = "Submit";
                }
                if (numberOfLoansToExtend == 1)
                {
                    this.customButtonSkip.Visible = false;
                }
            }
        }