Statistics
| Branch: | Tag: | Revision:

root / ncclient / session.py @ 2acc860a

History | View | Annotate | Download (2.8 kB)

1 589b23e4 Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 589b23e4 Shikhar Bhushan
#
3 589b23e4 Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 589b23e4 Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 589b23e4 Shikhar Bhushan
# You may obtain a copy of the License at
6 589b23e4 Shikhar Bhushan
#
7 589b23e4 Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 589b23e4 Shikhar Bhushan
#
9 589b23e4 Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 589b23e4 Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 589b23e4 Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 589b23e4 Shikhar Bhushan
# See the License for the specific language governing permissions and
13 589b23e4 Shikhar Bhushan
# limitations under the License.
14 589b23e4 Shikhar Bhushan
15 589b23e4 Shikhar Bhushan
import logging
16 589b23e4 Shikhar Bhushan
from threading import Thread, Event
17 589b23e4 Shikhar Bhushan
from Queue import Queue
18 589b23e4 Shikhar Bhushan
19 ee4bb099 Shikhar Bhushan
import content
20 2acc860a Shikhar Bhushan
from capabilities import Capabilities, CAPABILITIES
21 35ad9d81 Shikhar Bhushan
from error import ClientError
22 35ad9d81 Shikhar Bhushan
from subject import Subject
23 589b23e4 Shikhar Bhushan
24 589b23e4 Shikhar Bhushan
logger = logging.getLogger('ncclient.session')
25 589b23e4 Shikhar Bhushan
26 ee4bb099 Shikhar Bhushan
class SessionError(ClientError): pass
27 589b23e4 Shikhar Bhushan
28 589b23e4 Shikhar Bhushan
class Session(Thread, Subject):
29 589b23e4 Shikhar Bhushan
    
30 589b23e4 Shikhar Bhushan
    def __init__(self):
31 589b23e4 Shikhar Bhushan
        Thread.__init__(self, name='session')
32 2acc860a Shikhar Bhushan
        Subject.__init__(self, listeners=[HelloListener(self)])
33 589b23e4 Shikhar Bhushan
        self._client_capabilities = CAPABILITIES
34 589b23e4 Shikhar Bhushan
        self._server_capabilities = None # yet
35 589b23e4 Shikhar Bhushan
        self._id = None # session-id
36 589b23e4 Shikhar Bhushan
        self._error = None
37 589b23e4 Shikhar Bhushan
        self._init_event = Event()
38 589b23e4 Shikhar Bhushan
        self._q = Queue()
39 ee4bb099 Shikhar Bhushan
        self._connected = False # to be set/cleared by subclass
40 ee4bb099 Shikhar Bhushan
    
41 ee4bb099 Shikhar Bhushan
    def _post_connect(self):
42 ee4bb099 Shikhar Bhushan
        # start the subclass' main loop
43 ee4bb099 Shikhar Bhushan
        self.start()
44 ee4bb099 Shikhar Bhushan
        # queue client's hello message for sending
45 2acc860a Shikhar Bhushan
        self.send(content.Hello.build(self._client_capabilities))
46 ee4bb099 Shikhar Bhushan
        # we expect server's hello message, wait for _init_event to be set by HelloListener
47 ee4bb099 Shikhar Bhushan
        self._init_event.wait()
48 ee4bb099 Shikhar Bhushan
        # there may have been an error
49 ee4bb099 Shikhar Bhushan
        if self._error:
50 ee4bb099 Shikhar Bhushan
            self._close()
51 ee4bb099 Shikhar Bhushan
            raise self._error
52 589b23e4 Shikhar Bhushan
    
53 2acc860a Shikhar Bhushan
    def initialize(self, id, capabilities):
54 2acc860a Shikhar Bhushan
        self._id, self._capabilities = id, Capabilities(capabilities)
55 2acc860a Shikhar Bhushan
        self._init_event.set()
56 2acc860a Shikhar Bhushan
    
57 2acc860a Shikhar Bhushan
    def initialize_error(self, err):
58 2acc860a Shikhar Bhushan
        self._error = err
59 2acc860a Shikhar Bhushan
        self._init_event.set()
60 2acc860a Shikhar Bhushan
    
61 589b23e4 Shikhar Bhushan
    def send(self, message):
62 589b23e4 Shikhar Bhushan
        logger.debug('queueing message: \n%s' % message)
63 589b23e4 Shikhar Bhushan
        self._q.put(message)
64 38a9b062 Shikhar Bhushan
    
65 38a9b062 Shikhar Bhushan
    def connect(self):
66 38a9b062 Shikhar Bhushan
        raise NotImplementedError
67 589b23e4 Shikhar Bhushan
68 589b23e4 Shikhar Bhushan
    def run(self):
69 589b23e4 Shikhar Bhushan
        raise NotImplementedError
70 2acc860a Shikhar Bhushan
        
71 2acc860a Shikhar Bhushan
    def capabilities(self, whose='client'):
72 2acc860a Shikhar Bhushan
        if whose == 'client':
73 2acc860a Shikhar Bhushan
            return self._client_capabilities
74 2acc860a Shikhar Bhushan
        elif whose == 'server':
75 2acc860a Shikhar Bhushan
            return self._server_capabilities
76 589b23e4 Shikhar Bhushan
    
77 589b23e4 Shikhar Bhushan
    ### Properties
78 2acc860a Shikhar Bhushan
    
79 589b23e4 Shikhar Bhushan
    @property
80 35ad9d81 Shikhar Bhushan
    def client_capabilities(self):
81 35ad9d81 Shikhar Bhushan
        return self._client_capabilities
82 589b23e4 Shikhar Bhushan
    
83 589b23e4 Shikhar Bhushan
    @property
84 ee4bb099 Shikhar Bhushan
    def server_capabilities(self):
85 35ad9d81 Shikhar Bhushan
        return self._server_capabilities
86 589b23e4 Shikhar Bhushan
    
87 589b23e4 Shikhar Bhushan
    @property
88 35ad9d81 Shikhar Bhushan
    def connected(self):
89 35ad9d81 Shikhar Bhushan
        return self._connected
90 589b23e4 Shikhar Bhushan
    
91 589b23e4 Shikhar Bhushan
    @property
92 35ad9d81 Shikhar Bhushan
    def id(self):
93 38a9b062 Shikhar Bhushan
        return self._id