Statistics
| Branch: | Tag: | Revision:

root / ncclient / transport / session.py @ 541247ba

History | View | Annotate | Download (2.8 kB)

1 d095a59e Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 d095a59e Shikhar Bhushan
#
3 d095a59e Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 d095a59e Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 d095a59e Shikhar Bhushan
# You may obtain a copy of the License at
6 d095a59e Shikhar Bhushan
#
7 d095a59e Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 d095a59e Shikhar Bhushan
#
9 d095a59e Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 d095a59e Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 d095a59e Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 d095a59e Shikhar Bhushan
# See the License for the specific language governing permissions and
13 d095a59e Shikhar Bhushan
# limitations under the License.
14 d095a59e Shikhar Bhushan
15 1d540e60 Shikhar Bhushan
from threading import Event
16 e91a5349 Shikhar Bhushan
17 4ba5e843 Shikhar Bhushan
from ncclient.capabilities import Capabilities, CAPABILITIES
18 e91a5349 Shikhar Bhushan
from ncclient.glue import Subject
19 d095a59e Shikhar Bhushan
20 c35cebbf Shikhar Bhushan
from hello import HelloHandler
21 d095a59e Shikhar Bhushan
22 41e2ed46 Shikhar Bhushan
import logging
23 41e2ed46 Shikhar Bhushan
logger = logging.getLogger('ncclient.transport.session')
24 41e2ed46 Shikhar Bhushan
25 1d540e60 Shikhar Bhushan
class Session(Subject):
26 d095a59e Shikhar Bhushan
    
27 68006767 Shikhar Bhushan
    "TODO: docstring"
28 68006767 Shikhar Bhushan
    
29 d095a59e Shikhar Bhushan
    def __init__(self):
30 41e2ed46 Shikhar Bhushan
        "Subclass constructor should call this"
31 d095a59e Shikhar Bhushan
        Subject.__init__(self)
32 1d540e60 Shikhar Bhushan
        self.setName('session')
33 d095a59e Shikhar Bhushan
        self._client_capabilities = CAPABILITIES
34 d095a59e Shikhar Bhushan
        self._server_capabilities = None # yet
35 d095a59e Shikhar Bhushan
        self._id = None # session-id
36 d095a59e Shikhar Bhushan
        self._connected = False # to be set/cleared by subclass implementation
37 41e2ed46 Shikhar Bhushan
        logger.debug('%r created: client_capabilities=%r' %
38 41e2ed46 Shikhar Bhushan
                     (self, self._client_capabilities))
39 d095a59e Shikhar Bhushan
    
40 d095a59e Shikhar Bhushan
    def _post_connect(self):
41 41e2ed46 Shikhar Bhushan
        "Greeting stuff"
42 d095a59e Shikhar Bhushan
        init_event = Event()
43 1d540e60 Shikhar Bhushan
        error = [None] # so that err_cb can bind error[0]. just how it is.
44 94265508 Shikhar Bhushan
        # callbacks
45 d095a59e Shikhar Bhushan
        def ok_cb(id, capabilities):
46 1d540e60 Shikhar Bhushan
            self._id = id
47 1d540e60 Shikhar Bhushan
            self._server_capabilities = Capabilities(capabilities)
48 d095a59e Shikhar Bhushan
            init_event.set()
49 d095a59e Shikhar Bhushan
        def err_cb(err):
50 1d540e60 Shikhar Bhushan
            error[0] = err
51 d095a59e Shikhar Bhushan
            init_event.set()
52 c35cebbf Shikhar Bhushan
        listener = HelloHandler(ok_cb, err_cb)
53 d095a59e Shikhar Bhushan
        self.add_listener(listener)
54 1d540e60 Shikhar Bhushan
        self.send(HelloHandler.build(self._client_capabilities))
55 41e2ed46 Shikhar Bhushan
        logger.debug('starting main loop')
56 94265508 Shikhar Bhushan
        self.start()
57 d095a59e Shikhar Bhushan
        # we expect server's hello message
58 d095a59e Shikhar Bhushan
        init_event.wait()
59 d095a59e Shikhar Bhushan
        # received hello message or an error happened
60 d095a59e Shikhar Bhushan
        self.remove_listener(listener)
61 1d540e60 Shikhar Bhushan
        if error[0]:
62 1d540e60 Shikhar Bhushan
            raise error[0]
63 94265508 Shikhar Bhushan
        logger.info('initialized: session-id=%s | server_capabilities=%s' %
64 1d540e60 Shikhar Bhushan
                     (self._id, self._server_capabilities))
65 d095a59e Shikhar Bhushan
    
66 6625258b Shikhar Bhushan
    def connect(self, *args, **kwds):
67 41e2ed46 Shikhar Bhushan
        "Subclass implements"
68 d095a59e Shikhar Bhushan
        raise NotImplementedError
69 d095a59e Shikhar Bhushan
70 d095a59e Shikhar Bhushan
    def run(self):
71 41e2ed46 Shikhar Bhushan
        "Subclass implements"
72 d095a59e Shikhar Bhushan
        raise NotImplementedError
73 d095a59e Shikhar Bhushan
    
74 d095a59e Shikhar Bhushan
    ### Properties
75 d095a59e Shikhar Bhushan
    
76 d095a59e Shikhar Bhushan
    @property
77 d095a59e Shikhar Bhushan
    def client_capabilities(self):
78 d095a59e Shikhar Bhushan
        return self._client_capabilities
79 d095a59e Shikhar Bhushan
    
80 d095a59e Shikhar Bhushan
    @property
81 d095a59e Shikhar Bhushan
    def server_capabilities(self):
82 d095a59e Shikhar Bhushan
        return self._server_capabilities
83 d095a59e Shikhar Bhushan
    
84 d095a59e Shikhar Bhushan
    @property
85 d095a59e Shikhar Bhushan
    def connected(self):
86 d095a59e Shikhar Bhushan
        return self._connected
87 d095a59e Shikhar Bhushan
    
88 d095a59e Shikhar Bhushan
    @property
89 d095a59e Shikhar Bhushan
    def id(self):
90 d095a59e Shikhar Bhushan
        return self._id