43 lines
1.2 KiB
Swift
43 lines
1.2 KiB
Swift
//
|
|
// TorrentPeerMessageBuffer.swift
|
|
// BitTorrent
|
|
//
|
|
// Created by Ben Davis on 09/07/2017.
|
|
// Copyright © 2017 Ben Davis. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
protocol TorrentPeerMessageBufferDelegate: class {
|
|
func peerMessageBuffer(_ sender: TorrentPeerMessageBuffer, gotMessage data: Data)
|
|
}
|
|
|
|
class TorrentPeerMessageBuffer {
|
|
|
|
weak var delegate: TorrentPeerMessageBufferDelegate?
|
|
|
|
private var buffer = Data()
|
|
|
|
func appendData(_ data: Data) {
|
|
buffer = buffer + data
|
|
|
|
testIfBufferContainsCompletedMessage()
|
|
}
|
|
|
|
func testIfBufferContainsCompletedMessage() {
|
|
guard buffer.count >= 4 else {
|
|
return
|
|
}
|
|
|
|
let lengthPrefix = buffer.correctingIndicies[0..<4]
|
|
let expectedLength = Int(UInt32(data: lengthPrefix)) + 4
|
|
|
|
if buffer.count >= expectedLength {
|
|
let message = buffer.correctingIndicies[0..<expectedLength]
|
|
delegate?.peerMessageBuffer(self, gotMessage: message)
|
|
buffer = buffer.correctingIndicies[expectedLength..<buffer.count]
|
|
testIfBufferContainsCompletedMessage()
|
|
}
|
|
}
|
|
}
|