summaryrefslogtreecommitdiff
path: root/src/leap/bitmask/services/connections.py
blob: 8aeb4e0c4d0eb97023dc8ca36e100b9811362d62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# -*- coding: utf-8 -*-
# connections.py
# Copyright (C) 2013 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""
Abstract LEAP connections.
"""
# TODO use zope.interface instead
from abc import ABCMeta

from PySide import QtCore

from leap.common.check import leap_assert

_tr = QtCore.QObject().tr


class State(object):
    """
    Abstract state class
    """
    __metaclass__ = ABCMeta

    label = None
    short_label = None

"""
The different services should declare a ServiceConnection class that
inherits from AbstractLEAPConnection, so an instance of such class
can be used to inform the StateMachineBuilder of the particularities
of the state transitions for each particular connection.

In the future, we will extend this class to allow composites in connections,
so we can apply conditional logic to the transitions.
"""


class AbstractLEAPConnection(object):
    """
    Abstract LEAP Connection class.

    This class is likely to undergo heavy transformations
    in the coming releases, to better accomodate the use cases
    of the different connections that we use in the Bitmask
    client.
    """
    __metaclass__ = ABCMeta

    _connection_name = None

    @property
    def name(self):
        """
        Name of the connection
        """
        con_name = self._connection_name
        leap_assert(con_name is not None)
        return con_name

    _qtsigs = None

    @property
    def qtsigs(self):
        """
        Object that encapsulates the Qt Signals emitted
        by this connection.
        """
        return self._qtsigs

    # XXX for conditional transitions with composites,
    #     we might want to add
    #     a field with dependencies: what this connection
    #     needs for (ON) state.
    # XXX Look also at child states in the state machine.
    #depends = ()

    # Signals that derived classes
    # have to implement.

    # Commands
    do_connect_signal = None
    do_disconnect_signal = None

    # Intermediate stages
    connecting_signal = None
    disconnecting_signal = None

    # Complete stages
    connected_signal = None
    disconnected_signal = None

    # Bypass stages
    connection_died_signal = None
    connection_aborted_signal = None

    class Disconnected(State):
        """Disconnected state"""
        label = _tr("Disconnected")
        short_label = _tr("OFF")

    class Connected(State):
        """Connected state"""
        label = _tr("Connected")
        short_label = _tr("ON")

    class Connecting(State):
        """Connecting state"""
        label = _tr("Connecting")
        short_label = _tr("...")

    class Disconnecting(State):
        """Disconnecting state"""
        label = _tr("Disconnecting")
        short_label = _tr("...")