Statistics
| Branch: | Tag: | Revision:

root / src / session.py @ 45fef9ac

History | View | Annotate | Download (2.4 kB)

1 7238f39d Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 7238f39d Shikhar Bhushan
#
3 7238f39d Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 7238f39d Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 7238f39d Shikhar Bhushan
# You may obtain a copy of the License at
6 7238f39d Shikhar Bhushan
#
7 7238f39d Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 7238f39d Shikhar Bhushan
#
9 7238f39d Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 7238f39d Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 7238f39d Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 7238f39d Shikhar Bhushan
# See the License for the specific language governing permissions and
13 7238f39d Shikhar Bhushan
# limitations under the License.
14 7238f39d Shikhar Bhushan
15 45fef9ac Shikhar Bhushan
from content import Creator, Parser
16 7238f39d Shikhar Bhushan
17 45fef9ac Shikhar Bhushan
from threading import Thread
18 45fef9ac Shikhar Bhushan
from listener import Subject, Listener
19 da799558 Shikhar Bhushan
20 45fef9ac Shikhar Bhushan
class SessionError(ncclientError): pass
21 45fef9ac Shikhar Bhushan
22 45fef9ac Shikhar Bhushan
class Session(Thread, Subject, Listener):
23 45fef9ac Shikhar Bhushan
    
24 45fef9ac Shikhar Bhushan
    def __init__(self, capabilities=None):
25 45fef9ac Shikhar Bhushan
        Thread.__init__(self, name='session')
26 45fef9ac Shikhar Bhushan
        Subject.__init__(self, listeners=[self])
27 45fef9ac Shikhar Bhushan
        Thread.setDaemon(True)
28 45fef9ac Shikhar Bhushan
        self.client_capabilities = capabilities
29 45fef9ac Shikhar Bhushan
        self.server_capabilities = None # yet
30 7238f39d Shikhar Bhushan
        self.id = None # session-id
31 45fef9ac Shikhar Bhushan
        self.is_connected = False
32 45fef9ac Shikhar Bhushan
        self._q = Queue.Queue()
33 da799558 Shikhar Bhushan
    
34 da799558 Shikhar Bhushan
    def _make_hello(self):
35 da799558 Shikhar Bhushan
        pass
36 da799558 Shikhar Bhushan
    
37 45fef9ac Shikhar Bhushan
    def _init(self, id, capabilities):
38 45fef9ac Shikhar Bhushan
        self.id = id
39 45fef9ac Shikhar Bhushan
        self.capabilities[SERVER] = capabilities
40 45fef9ac Shikhar Bhushan
        self.is_connected = True
41 45fef9ac Shikhar Bhushan
    
42 45fef9ac Shikhar Bhushan
    @override
43 45fef9ac Shikhar Bhushan
    def _close(self):
44 45fef9ac Shikhar Bhushan
        raise NotImplementedError
45 da799558 Shikhar Bhushan
    
46 7238f39d Shikhar Bhushan
    def connect(self):
47 45fef9ac Shikhar Bhushan
        self._greet()
48 45fef9ac Shikhar Bhushan
        Thread.start()
49 45fef9ac Shikhar Bhushan
    
50 45fef9ac Shikhar Bhushan
    def send(self, msg):
51 45fef9ac Shikhar Bhushan
        if self.is_connected:
52 45fef9ac Shikhar Bhushan
            self._q.add(msg)
53 45fef9ac Shikhar Bhushan
        else:
54 45fef9ac Shikhar Bhushan
            raise SessionError('Attempted to send message while not connected')
55 7238f39d Shikhar Bhushan
        
56 45fef9ac Shikhar Bhushan
    ### Thread methods
57 45fef9ac Shikhar Bhushan
58 45fef9ac Shikhar Bhushan
    @override
59 7238f39d Shikhar Bhushan
    def run(self):
60 7238f39d Shikhar Bhushan
        raise NotImplementedError
61 45fef9ac Shikhar Bhushan
    
62 45fef9ac Shikhar Bhushan
    ### Subject methods
63 45fef9ac Shikhar Bhushan
    
64 45fef9ac Shikhar Bhushan
    def add_listener(self, listener):
65 45fef9ac Shikhar Bhushan
        if not self.is_connected:
66 45fef9ac Shikhar Bhushan
            raise SessionError('Listeners may only be added after session initialisation')
67 da799558 Shikhar Bhushan
        else:
68 45fef9ac Shikhar Bhushan
            Subject.add_listner(self, listener)
69 45fef9ac Shikhar Bhushan
    
70 45fef9ac Shikhar Bhushan
    ### Listener methods
71 45fef9ac Shikhar Bhushan
    # these are relevant for the initial greeting only
72 45fef9ac Shikhar Bhushan
    
73 45fef9ac Shikhar Bhushan
    def reply(self, data):
74 45fef9ac Shikhar Bhushan
        p = Parser(data)
75 45fef9ac Shikhar Bhushan
        s = p['session']
76 45fef9ac Shikhar Bhushan
        id = s['@id']
77 45fef9ac Shikhar Bhushan
        capabilities = Capabilities()
78 45fef9ac Shikhar Bhushan
        capabilities.fromXML(p['capabilities'])
79 45fef9ac Shikhar Bhushan
        self._init(id, capabilities)
80 45fef9ac Shikhar Bhushan
        self.remove_listener(self)
81 45fef9ac Shikhar Bhushan
    
82 45fef9ac Shikhar Bhushan
    def error(self, data):
83 45fef9ac Shikhar Bhushan
        self._close()
84 45fef9ac Shikhar Bhushan
        raise SSHError('Session initialization failed')
85 45fef9ac Shikhar Bhushan