示例#1
0
        public static TransferRequest Decode(G2Header root)
        {
            TransferRequest tr = new TransferRequest();

            G2Header child = new G2Header(root.Data);

            while (G2Protocol.ReadNextChild(root, child) == G2ReadResult.PACKET_GOOD)
            {
                if (child.Name == Packet_GetBitfield)
                    tr.GetBitfield = true;

                if (!G2Protocol.ReadPayload(child))
                    continue;

                switch (child.Name)
                {
                    case Packet_FileID:
                        tr.FileID = BitConverter.ToUInt64(child.Data, child.PayloadPos);
                        break;

                    case Packet_ChunkIndex:
                        tr.ChunkIndex = CompactNum.ToInt32(child.Data, child.PayloadPos, child.PayloadSize);
                        break;

                    case Packet_StartByte:
                        tr.StartByte = CompactNum.ToInt64(child.Data, child.PayloadPos, child.PayloadSize);
                        break;

                    case Packet_EndByte:
                        tr.EndByte = CompactNum.ToInt64(child.Data, child.PayloadPos, child.PayloadSize);
                        break;
                }
            }

            return tr;
        }
示例#2
0
        public void Refresh(OpTransfer transfer)
        {
            if (!transfer.Peers.ContainsKey(RoutingID))
            {
                Text = "Error";
                return;
            }

            RemotePeer peer = transfer.Peers[RoutingID];

            int upPiece = -1, downPiece = -1;

            string text = "";

            // remote name / IP - last seen, timeout: x
            // flags: UL (active?, chunk index, progress) / DL (chunk index, progress) / RBU

            if (peer.DhtIndex < transfer.RoutingTable.Length && transfer.RoutingTable[peer.DhtIndex] == peer)
            {
                text += "(B" + peer.DhtIndex + ") ";
            }

            text += Service.Core.GetName(peer.Client.UserID) + ", ";
            text += "Last Seen: " + peer.LastSeen.ToShortTimeString() + ", ";
            //text += "Timeout: " + peer.PingTimeout + ", ";

            if (peer.RemoteBitfieldUpdated)
            {
                text += "Out of Date, ";
            }

            if (Service.UploadPeers.ContainsKey(peer.RoutingID))
            {
                UploadPeer upload = Service.UploadPeers[peer.RoutingID];
                text += "Last Upload: " + upload.LastAttempt.ToShortTimeString() + ", ";

                if (upload.Active == peer)
                {
                    text += "Upload: ";

                    if (upload.Active.LastRequest != null && upload.Active.CurrentPos != 0)
                    {
                        TransferRequest req = upload.Active.LastRequest;
                        upPiece = req.ChunkIndex;
                        int percent = (int)((req.EndByte - upload.Active.CurrentPos) * 100 / (req.EndByte - req.StartByte));

                        // Piece 4 - 34%,
                        text += "Piece " + upPiece + " - " + percent + "%, ";
                    }
                    else
                    {
                        text += "Pending, ";
                    }
                }

                if (peer.LastError != null)
                {
                    text += "Stopped: " + peer.LastError + ", ";
                }
            }

            if (Service.DownloadPeers.ContainsKey(peer.RoutingID))
            {
                if (Service.DownloadPeers[peer.RoutingID].Requests.ContainsKey(transfer.FileID))
                {
                    TransferRequest req = Service.DownloadPeers[peer.RoutingID].Requests[transfer.FileID];

                    text += "Download: ";

                    if (req.CurrentPos != 0)
                    {
                        downPiece = req.ChunkIndex;
                        int percent = (int)((req.EndByte - req.CurrentPos) * 100 / (req.EndByte - req.StartByte));

                        // Piece 4 - 34%,
                        text += "Piece " + downPiece + " - " + percent + "%, ";
                    }
                    else
                    {
                        text += "Pending, ";
                    }
                }
            }

            Text = text.Substring(0, text.Length - 2);

            Bitfield.UpdateField(peer.RemoteBitfield, upPiece, downPiece);
        }