def deal_with_message(self, data): messages_to_send_list = [] if self.message_buffer: self.message_buffer.extend(bytearray(data)) else: self.message_buffer = bytearray(data) if self.message_buffer[1:20].lower() == "bittorrent protocol": print "Handshake Received!" self.decode_handshake( self.factory.active_torrent.torrent_info) #compare info-hash self.message_buffer = self.message_buffer[68:] messages_to_send_list.append(messages.Interested( )) #we send interested when we receive handhake self.interested = True if len(self.message_buffer) >= 4: message_length = messages.bytes_to_number( self.message_buffer[0:4]) + 4 while len(self.message_buffer) >= message_length: messages_to_send_list = self.parse_messages( messages_to_send_list) message_length = messages.bytes_to_number( self.message_buffer[0:4]) + 4 #print messages_to_send_list[0] return messages_to_send_list
def write_block(self,block): block_num_in_piece = bytes_to_number(block.begin) / constants.REQUEST_LENGTH piece_num = bytes_to_number(block.index) mypiece = self.file_downloading.piece_list[piece_num] block_num_overall = self.piece_and_index_to_overall_index(block_num_in_piece, piece_num) if not self.have_blocks[block_num_overall]: mypiece.write(block_num_in_piece, block.block) self.have_blocks[block_num_overall] = 1 #add block to have list #print '\npiece ' + str(piece_num) +' and block '+ str(block_num_in_piece) + ' received' if block_num_overall in self.pending_timeout: #remove block from timeout pending dict del self.pending_timeout[block_num_overall] if mypiece.check_if_full() and not mypiece.written: self.check_hash(mypiece,piece_num)
def write_block(self,block): # called by bittorrenter! block_num_in_piece = bytes_to_number(block.begin) / constants.REQUEST_LENGTH piece_num = bytes_to_number(block.index) mypiece = self.file_downloading.piece_list[piece_num] block_num_overall = self.piece_and_index_to_overall_index(block_num_in_piece, piece_num) if not self.have_blocks[block_num_overall]: mypiece.write(block_num_in_piece, block.block) self.have_blocks[block_num_overall] = 1 #add block to have list #print '\npiece ' + str(piece_num) +' and block '+ str(block_num_in_piece) + ' received' if block_num_overall in self.pending_timeout: #remove block from timeout pending dict del self.pending_timeout[block_num_overall] if mypiece.check_if_full() and not mypiece.written: percentage=self.check_hash(mypiece,piece_num)# check hash value of piece when piece is downloaded fuly return percentage
def deal_with_message(self,data): messages_to_send_list = [] if self.message_buffer: self.message_buffer.extend(bytearray(data)) else: self.message_buffer = bytearray(data) if self.message_buffer[1:20].lower() == "bittorrent protocol": print "handshake received" self.decode_handshake(self.factory.active_torrent.torrent_info) self.message_buffer = self.message_buffer[68:] messages_to_send_list.append(messages.Interested()) self.interested = True if len(self.message_buffer) >= 4: message_length = messages.bytes_to_number(self.message_buffer[0:4]) + 4 while len(self.message_buffer) >= message_length: messages_to_send_list = self.parse_messages(messages_to_send_list) message_length = messages.bytes_to_number(self.message_buffer[0:4])+4 return messages_to_send_list
def parse_messages(self, messages_to_send_list): message_obj = self.parse_message_from_response() if isinstance(message_obj, messages.Choke): print 'messages.Choked' self.choked = True elif isinstance(message_obj, messages.Unchoke): print 'messages.Unchoked!' self.choked = False if self.interested: for i in range(5): messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Interested): self.peer_interested = True elif isinstance(message_obj, messages.Interested): self.peer_interested = False elif isinstance(message_obj, messages.Have): piece_index = messages.bytes_to_number(message_obj.index) self.peer_has_pieces[piece_index] = 1 if self.interested and not self.choked: messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Bitfield): bitarray = BitArray(bytes=message_obj.bitfield) self.peer_has_pieces = bitarray[:len(self.peer_has_pieces)] if self.interested and not self.choked: messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Request): print 'request' pass #send piece elif isinstance(message_obj, messages.Piece): self.pending_requests -= 1 percentage = self.factory.active_torrent.write_block(message_obj) #print percentage if self.interested and not self.choked: messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Cancel): print 'cancel' elif isinstance(message_obj, messages.Port): print 'port' #parse port and switch connection to that port return messages_to_send_list
def parse_messages(self, messages_to_send_list): message_obj = self.parse_message_from_response() if isinstance(message_obj, messages.Choke): print 'messages.Choked' self.choked = True elif isinstance(message_obj, messages.Unchoke): print 'messages.Unchoked!' self.choked = False if self.interested: for i in range(5): messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Interested): self.peer_interested = True elif isinstance(message_obj, messages.Interested): self.peer_interested = False elif isinstance(message_obj, messages.Have): piece_index = messages.bytes_to_number(message_obj.index) self.peer_has_pieces[piece_index] = 1 if self.interested and not self.choked: messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Bitfield): bitarray = BitArray(bytes=message_obj.bitfield) self.peer_has_pieces = bitarray[:len(self.peer_has_pieces)] if self.interested and not self.choked: messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Request): print 'request' pass #send piece elif isinstance(message_obj, messages.Piece): self.pending_requests -= 1 percentage=self.factory.active_torrent.write_block(message_obj) #print percentage if self.interested and not self.choked: messages_to_send_list.append(self.get_next_request()) elif isinstance(message_obj, messages.Cancel): print 'cancel' elif isinstance(message_obj, messages.Port): print 'port' #parse port and switch connection to that port return messages_to_send_list
def parse_message_from_response(self): length = messages.bytes_to_number(self.message_buffer[0:4]) + 4 #length indicated by the first 4 bytes + 4 for those first 4 bytes bytestring = self.message_buffer[:length] if self.message_buffer[0:4] == '\x00\x00\x00\x00': #no msg_id message_obj = KeepAlive(response=bytestring) else: message_obj = { 0: lambda: messages.Choke(response=bytestring), 1: lambda: messages.Unchoke(response=bytestring), 2: lambda: messages.Interested(response=bytestring), 3: lambda: messaged.Interested(response=bytestring), 4: lambda: messages.Have(response=bytestring), 5: lambda: messages.Bitfield(response=bytestring), 6: lambda: messages.Request(response=bytestring), 7: lambda: messages.Piece(response=bytestring), 8: lambda: messages.Cancel(response=bytestring), 9: lambda: messages.Port(response=bytestring), }[self.message_buffer[4]]() #response[4] is the msg_id self.message_buffer = self.message_buffer[length:] return message_obj
def parse_message_from_response(self): length = messages.bytes_to_number( self.message_buffer[0:4] ) + 4 #length indicated by the first 4 bytes + 4 for those first 4 bytes bytestring = self.message_buffer[:length] if self.message_buffer[0:4] == '\x00\x00\x00\x00': #no msg_id message_obj = KeepAlive(response=bytestring) else: message_obj = { 0: lambda: messages.Choke(response=bytestring), 1: lambda: messages.Unchoke(response=bytestring), 2: lambda: messages.Interested(response=bytestring), 3: lambda: messaged.Interested(response=bytestring), 4: lambda: messages.Have(response=bytestring), 5: lambda: messages.Bitfield(response=bytestring), 6: lambda: messages.Request(response=bytestring), 7: lambda: messages.Piece(response=bytestring), 8: lambda: messages.Cancel(response=bytestring), 9: lambda: messages.Port(response=bytestring), }[self.message_buffer[4]]() #response[4] is the msg_id self.message_buffer = self.message_buffer[length:] return message_obj
def __repr__(self): to_print = ''.join(repr(block) for block in self.block_list) return to_print class TorrentFile(object): def __init__(self, overall_length, piece_size): self.number_pieces = overall_length / piece_size self.piece_list = [] for piece in range(self.number_pieces): self.piece_list.append(MyPiece(piece_size)) if overall_length % piece_size != 0: print 'extra smaller piece for this file' last_piece_size = overall_length % piece_size self.piece_list.append(MyPiece(last_piece_size)) self.number_pieces += 1 if __name__ == "__main__": print 'testing blocks and pieces' print 'LENGTH:',len('\x00\x00\x06\x18') block = Block(bytes_to_number('\x00\x00\x06\x18'),'\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff') #print 'block: ' + repr(block) #piece = MyPiece(1048576) piece = MyPiece(2**3 * 10+4) print 'number:',(2**3 * 10+4) print 'length:',(84/REQUEST_LENGTH) print 'index:',bytes_to_number('\x00\x00\x00\x41') #print 'index:',bytes_to_number('\x01\x01\x01\x01\x05\x01\x01\x09') #piece.write(bytes_to_number('\x00\x00\x00\x41'), '\x01\x01\x01\x01\x05\x01\x01\x09') #print repr(piece)
def __repr__(self): to_print = ''.join(repr(block) for block in self.block_list) return to_print class TorrentFile(object): def __init__(self, overall_length, piece_size): self.number_pieces = overall_length / piece_size self.piece_list = [] for piece in range(self.number_pieces): self.piece_list.append(MyPiece(piece_size)) if overall_length % piece_size != 0: print 'extra smaller piece for this file' last_piece_size = overall_length % piece_size self.piece_list.append(MyPiece(last_piece_size)) self.number_pieces += 1 if __name__ == "__main__": print 'testing blocks and pieces' block = Block( bytes_to_number('\x00\x00\x06\x18'), '\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff' ) #print 'block: ' + repr(block) #piece = MyPiece(1048576) piece = MyPiece(2**3 * 10 + 4) piece.write(bytes_to_number('\x00\x00\x00\x41'), '\x01\x01\x01\x01\x05\x01\x01\x09') print repr(piece)
self.block_list[block_index].write(bytestring) def return_block(self, piece_offset): block_index = piece_offset / self.block_size return self.block_list[block_index].bytestring def __repr__(self): to_print = ''.join(repr(block) for block in self.block_list) return to_print class TorrentFile(object): def __init__(self, overall_length, piece_size): self.number_pieces = overall_length / piece_size self.piece_list = [] for piece in range(self.number_pieces): self.piece_list.append(MyPiece(piece_size)) if overall_length % piece_size != 0: print 'extra smaller piece for this file' last_piece_size = overall_length % piece_size self.piece_list.append(MyPiece(last_piece_size)) self.number_pieces += 1 if __name__ == "__main__": print 'testing blocks and pieces' block = Block(bytes_to_number('\x00\x00\x06\x18'),'\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x9d\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff') #print 'block: ' + repr(block) #piece = MyPiece(1048576) piece = MyPiece(2**3 * 10+4) piece.write(bytes_to_number('\x00\x00\x00\x41'), '\x01\x01\x01\x01\x05\x01\x01\x09') print repr(piece)