Statistics
| Branch: | Tag: | Revision:

root / ncclient / transport / session.py @ c35cebbf

History | View | Annotate | Download (2.5 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 68006767 Shikhar Bhushan
from threading import Thread, 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 . import logger
21 c35cebbf Shikhar Bhushan
from hello import HelloHandler
22 d095a59e Shikhar Bhushan
23 d095a59e Shikhar Bhushan
class Session(Thread, Subject):
24 d095a59e Shikhar Bhushan
    
25 68006767 Shikhar Bhushan
    "TODO: docstring"
26 68006767 Shikhar Bhushan
    
27 d095a59e Shikhar Bhushan
    def __init__(self):
28 68006767 Shikhar Bhushan
        "TODO: docstring"
29 d095a59e Shikhar Bhushan
        Subject.__init__(self)
30 68006767 Shikhar Bhushan
        Thread.__init__(self, name='session')
31 68006767 Shikhar Bhushan
        self.setDaemon(True)
32 d095a59e Shikhar Bhushan
        self._client_capabilities = CAPABILITIES
33 d095a59e Shikhar Bhushan
        self._server_capabilities = None # yet
34 d095a59e Shikhar Bhushan
        self._id = None # session-id
35 d095a59e Shikhar Bhushan
        self._connected = False # to be set/cleared by subclass implementation
36 d095a59e Shikhar Bhushan
    
37 d095a59e Shikhar Bhushan
    def _post_connect(self):
38 68006767 Shikhar Bhushan
        "TODO: docstring"
39 c35cebbf Shikhar Bhushan
        self.send(HelloHandler.build(self._client_capabilities))
40 d095a59e Shikhar Bhushan
        error = None
41 d095a59e Shikhar Bhushan
        init_event = Event()
42 94265508 Shikhar Bhushan
        # callbacks
43 d095a59e Shikhar Bhushan
        def ok_cb(id, capabilities):
44 94265508 Shikhar Bhushan
            self._id, self._server_capabilities = id, Capabilities(capabilities)
45 d095a59e Shikhar Bhushan
            init_event.set()
46 d095a59e Shikhar Bhushan
        def err_cb(err):
47 d095a59e Shikhar Bhushan
            error = err
48 d095a59e Shikhar Bhushan
            init_event.set()
49 c35cebbf Shikhar Bhushan
        listener = HelloHandler(ok_cb, err_cb)
50 d095a59e Shikhar Bhushan
        self.add_listener(listener)
51 d095a59e Shikhar Bhushan
        # start the subclass' main loop
52 94265508 Shikhar Bhushan
        self.start()
53 d095a59e Shikhar Bhushan
        # we expect server's hello message
54 d095a59e Shikhar Bhushan
        init_event.wait()
55 d095a59e Shikhar Bhushan
        # received hello message or an error happened
56 d095a59e Shikhar Bhushan
        self.remove_listener(listener)
57 d095a59e Shikhar Bhushan
        if error:
58 d095a59e Shikhar Bhushan
            raise error
59 94265508 Shikhar Bhushan
        logger.info('initialized: session-id=%s | server_capabilities=%s' %
60 94265508 Shikhar Bhushan
                     (self.id, self.server_capabilities))
61 d095a59e Shikhar Bhushan
    
62 6625258b Shikhar Bhushan
    def connect(self, *args, **kwds):
63 68006767 Shikhar Bhushan
        "TODO: docstring"
64 d095a59e Shikhar Bhushan
        raise NotImplementedError
65 d095a59e Shikhar Bhushan
66 d095a59e Shikhar Bhushan
    def run(self):
67 d095a59e Shikhar Bhushan
        raise NotImplementedError
68 d095a59e Shikhar Bhushan
    
69 d095a59e Shikhar Bhushan
    ### Properties
70 d095a59e Shikhar Bhushan
    
71 d095a59e Shikhar Bhushan
    @property
72 d095a59e Shikhar Bhushan
    def client_capabilities(self):
73 d095a59e Shikhar Bhushan
        return self._client_capabilities
74 d095a59e Shikhar Bhushan
    
75 d095a59e Shikhar Bhushan
    @property
76 d095a59e Shikhar Bhushan
    def server_capabilities(self):
77 d095a59e Shikhar Bhushan
        return self._server_capabilities
78 d095a59e Shikhar Bhushan
    
79 d095a59e Shikhar Bhushan
    @property
80 d095a59e Shikhar Bhushan
    def connected(self):
81 d095a59e Shikhar Bhushan
        return self._connected
82 d095a59e Shikhar Bhushan
    
83 d095a59e Shikhar Bhushan
    @property
84 d095a59e Shikhar Bhushan
    def id(self):
85 d095a59e Shikhar Bhushan
        return self._id