Show
Ignore:
Timestamp:
08/10/05 17:59:55 (3 years ago)
Author:
dkirov
Message:

proper disconnect routines

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/common/socks5.py

    r2916 r2942  
    3636                self.files_props = {} 
    3737                self.senders = {} 
    38                 self.idx = 0 
     38                self.idx = 1 
    3939                self.listener = None 
    4040                self.sha_handlers = {} 
     
    6161                                                if proxy == streamhost: 
    6262                                                        self.on_success(streamhost) 
    63                                                         return True 
    64                                 return False 
     63                                                        return 2 
     64                                return 0 
    6565                if file_props.has_key('streamhosts'): 
    6666                        for host in file_props['streamhosts']: 
    67                                 if streamhost['state'] == 1 and host != streamhost: 
    68                                         return False 
     67                                if streamhost['state'] == 1: 
     68                                        return 0 
    6969                        streamhost['state'] = 1 
    7070                        self.on_success(streamhost) 
    71                         return True 
    72                 return False 
     71                        return 1 
     72                return 0 
    7373 
    7474        def connect_to_hosts(self, account, sid, on_success = None,  
     
    145145                        props = self.sha_handlers[sha_str] 
    146146                        props[0](props[1], idx) 
    147                          
     147        def activate_proxy(self, idx): 
     148                if not self.readers.has_key(idx): 
     149                        return 
     150                reader = self.readers[idx] 
     151                if reader.file_props['type'] != 's': 
     152                        return 
     153                if reader.state != 5: 
     154                        return 
     155                reader.state = 6 
     156                if reader.connected: 
     157                        reader.fd = open(reader.file_props['file-name']) 
     158                        reader.file_props['error'] = 0 
     159                        reader.file_props['disconnect_cb'] = reader.disconnect 
     160                        reader.file_props['started'] = True 
     161                        reader.file_props['completed'] = False 
     162                        reader.file_props['paused'] = False 
     163                        reader.file_props['stalled'] = False 
     164                        reader.file_props['received-len'] = 0 
     165                        reader.pauses = 0 
     166                        reader.send_raw(reader._get_nl_byte()) 
     167                        result = reader.write_next() 
     168                        self.process_result(result, reader) 
     169         
    148170        def send_file(self, file_props, account): 
    149171                if file_props.has_key('hash') and \ 
     
    171193                        self.files_props[account] = {} 
    172194                self.files_props[account][_id] = file_props 
     195         
     196        def remove_file_props(self, account, sid): 
     197                if self.files_props.has_key(account): 
     198                        fl_props = self.files_props[account] 
     199                        if fl_props.has_key(sid): 
     200                                del(fl_props[sid]) 
     201                 
     202                if len(self.files_props) == 0: 
     203                        self.connected = 0 
    173204                 
    174205        def get_file_props(self, account, sid): 
     
    241272                                                result = receiver.main(0) 
    242273                                                self.process_result(result, receiver) 
     274                                elif receiver.state == 5: # wait for proxy reply 
     275                                        pass 
    243276                                else: 
    244277                                        if receiver.file_props['type'] == 'r': 
     
    267300                                actor.file_props) 
    268301         
    269         def remove_receiver(self, idx): 
     302        def remove_receiver(self, idx, do_disconnect = True): 
    270303                ''' Remove reciver from the list and decrease  
    271304                the number of active connections with 1''' 
    272305                if idx != -1: 
    273306                        if self.readers.has_key(idx): 
    274                                 if self.readers[idx].streamhost is not None: 
    275                                         self.readers[idx].streamhost['state'] = -1 
    276                                 del(self.readers[idx]) 
    277          
    278         def remove_sender(self, idx): 
     307                                if do_disconnect: 
     308                                        self.readers[idx].disconnect() 
     309                                else: 
     310                                        if self.readers[idx].streamhost is not None: 
     311                                                self.readers[idx].streamhost['state'] = -1 
     312                                        del(self.readers[idx]) 
     313         
     314        def remove_sender(self, idx, do_disconnect = True): 
    279315                ''' Remove reciver from the list of senders and decrease the  
    280316                number of active connections with 1''' 
    281317                if idx != -1: 
    282318                        if self.senders.has_key(idx): 
    283                                 del(self.senders[idx]) 
    284                         if self.connected > 0: 
    285                                 self.connected -= 1 
     319                                if do_disconnect: 
     320                                        self.senders[idx].disconnect() 
     321                                else: 
     322                                        del(self.senders[idx]) 
     323                                        if self.connected > 0: 
     324                                                self.connected -= 1 
    286325         
    287326class Socks5: 
     
    650689                ''' Closes the socket. ''' 
    651690                # close connection and remove us from the queue 
    652                 self._sock.close() 
     691                try: 
     692                        self._sock.close() 
     693                except: 
     694                        pass 
    653695                self.connected = False 
    654696                if self.file_props is not None: 
     
    656698                        self.file_props['disconnect_cb'] = None 
    657699                if self.queue is not None: 
    658                         self.queue.remove_sender(self.queue_idx) 
     700                        self.queue.remove_sender(self.queue_idx, False) 
    659701         
    660702class Socks5Listener: 
     
    741783                self.connected = True 
    742784                self.file_props['connected'] = True 
     785                self.file_props['disconnect_cb'] = self.disconnect 
    743786                self.state = 1 # connected 
    744787                self.queue._socket_connected(self.streamhost, self.file_props) 
     
    747790        def main(self, timeout = 0): 
    748791                ''' begin negotiation. on success 'address' != 0 ''' 
     792                result = 1 
    749793                if self.state == 1: # send initially: version and auth types 
    750794                        self.send_raw(self._get_auth_buff()) 
     
    780824                        self.state = 5 # for senders: init file_props and send '\n' 
    781825                        if self.queue.on_success: 
    782                                 if not self.queue.send_success_reply(self.file_props,  
    783                                         self.streamhost): 
     826                                result = self.queue.send_success_reply(self.file_props,  
     827                                        self.streamhost) 
     828                                if result == 0: 
    784829                                        self.state = 8 
    785830                                        self.disconnect() 
    786                 if self.state == 5: # for senders: init file_props and send '\n' 
     831                 
     832                # for senders: init file_props and send '\n' 
     833                if result == 1 and self.state == 5:  
    787834                        if self.file_props['type'] == 's': 
    788835                                self.fd = open(self.file_props['file-name']) 
     
    797844                                self.send_raw(self._get_nl_byte()) 
    798845                        self.state = 6 # send/get file contents 
    799                 if self.state < 6: 
     846                if self.state < 5: 
    800847                        self.state += 1 
    801848                        return None 
     
    819866                # close connection and remove us from the queue 
    820867                if self._sock: 
    821                         self._sock.close() 
     868                        try: 
     869                                self._sock.close() 
     870                        except: 
     871                                pass 
    822872                self.connected = False 
    823873                if cb is True: 
    824874                        self.file_props['disconnect_cb'] = None 
    825875                if self.queue is not None: 
    826                         self.queue.remove_receiver(self.queue_idx) 
     876                        self.queue.remove_receiver(self.queue_idx, False)