Revision 634a0ea7

b/src/session.py
21 21

  
22 22
class Session(Thread, Subject, Listener):
23 23
    
24
    def __init__(self, capabilities=None):
24
    CLIENT, SERVER = range(2)
25
    
26
    def __init__(self, capabilities=None, listeners=[]):
25 27
        Thread.__init__(self, name='session')
26
        Subject.__init__(self, listeners=[self])
28
        listeners.append(self)
29
        Subject.__init__(self, listeners=listeners)
27 30
        Thread.setDaemon(True)
28
        self.client_capabilities = capabilities
29
        self.server_capabilities = None # yet
30
        self.id = None # session-id
31
        self.connected = False
32
        self.initialised = False
31
        self._capabilities = {
32
            CLIENT: capabilities,
33
            SERVER: None # yet
34
        }
35
        self._id = None # session-id
36
        self._connected = False
37
        self._initialised = False
33 38
        self._q = Queue.Queue()
34 39
        
35 40
    def _init(self, id, capabilities):
36
        self.id = id
37
        self.capabilities[SERVER] = capabilities
38
        self.initialised = True
41
        if isinstance(id, int) and isinstance(capabilities, Capabilities):
42
            self.id = id
43
            self.capabilities[SERVER] = capabilities
44
            self.initialised = True
45
        else:
46
            raise ValueError
39 47
    
40 48
    def _greet(self):
41
        self._q.add(make_hello())
49
        hello = Creator()
50
        # ...
51
        self._q.add(hello)
42 52
    
43 53
    @override
44 54
    def _close(self):
......
46 56
    
47 57
    @override
48 58
    def connect(self):
49
        'call Session.connect() at the end'
50
        self._greet()
51
        Thread.start()
59
        raise NotImplementedError
52 60
    
53
    def send(self, msg):
54
        if self.connected and self.initialised:
55
            self._q.add(msg)
61

  
62
    def send(self, message):
63
        if self.ready:
64
            self._q.add(message)
56 65
        else:
57
            raise SessionError('Attempted to send message while not connected')
58
        
66
            raise SessionError('Session not ready')
67
    
59 68
    ### Thread methods
60 69

  
61 70
    @override
62 71
    def run(self):
63 72
        raise NotImplementedError
64 73
    
65
    ### Subject methods
66
    
67
    def add_listener(self, listener):
68
        if not self.initialised:
69
            raise SessionError('Listeners may only be added after session initialisation')
70
        else:
71
            Subject.add_listner(self, listener)
72
    
73
    ### Listener methods
74
    # these are relevant for the initial greeting only
74
    ### Listener methods - these are relevant for the initial greeting only
75 75
    
76 76
    def reply(self, data):
77
        p = Parser(data)
78
        s = p['session']
79
        id = s['@id']
80
        capabilities = Capabilities()
81
        capabilities.fromXML(p['capabilities'])
82
        self._init(id, capabilities)
83
        self.remove_listener(self)
77
        id, capabilities = None, None
78
        try:
79
            p = Parser()
80
            # ...
81
            self._init(id, capabilities)
82
        except: # ...
83
            pass
84
        finally:
85
            self.remove_listener(self)
84 86
    
85 87
    def error(self, data):
86 88
        self._close()
87 89
        raise SSHError('Session initialization failed')
88
    
90

  
91
    ### Getter methods and properties
92

  
93
    def get_capabilities(self, whose):
94
        return self._capabilities[whose]
95
    
96
    @property
97
    def ready(self): self._connected and self._initialised
98
    
99
    @property
100
    def id(self): self._id    
101
    
102
    @property
103
    def client_capabilities(self):
104
        return self._capabilities[CLIENT]
105
    
106
    @property
107
    def server_capabilities(self):
108
        return self._capabilities[SERVER]

Also available in: Unified diff