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