~ubuntu-branches/ubuntu/wily/blueman/wily

« back to all changes in this revision

Viewing changes to blueman/ods/OdsManager.py

  • Committer: Package Import Robot
  • Author(s): Sean Davis
  • Date: 2015-09-07 12:48:18 UTC
  • mfrom: (2.3.11 sid)
  • Revision ID: package-import@ubuntu.com-20150907124818-evulc0mhjotz8q29
Tags: 2.0-1ubuntu1
* Merge from Debian unstable (LP: #1482626). Remaining changes:
  - debian/patches/03_filemanage_fix.patch:
    + Dropped, no longer needed.
  - debian/patches/dhcpclient_priority
  - debian/patches/01_dont_autostart_lxde.patch
    + Refreshed patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008 Valmantas Paliksa <walmis at balticum-tv dot lt>
2
 
# Copyright (C) 2008 Tadas Dailyda <tadas at dailyda dot com>
3
 
#
4
 
# Licensed under the GNU General Public License Version 3
5
 
#
6
 
# This program is free software: you can redistribute it and/or modify
7
 
# it under the terms of the GNU General Public License as published by
8
 
# the Free Software Foundation, either version 3 of the License, or
9
 
# (at your option) any later version.
10
 
#
11
 
# This program is distributed in the hope that it will be useful,
12
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
# GNU General Public License for more details.
15
 
#
16
 
# You should have received a copy of the GNU General Public License
17
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 
19
 
from gi.repository import GObject
20
 
import os
21
 
from blueman.ods.OdsBase import OdsBase
22
 
from blueman.ods.OdsServer import OdsServer
23
 
from blueman.ods.OdsSession import OdsSession
24
 
from blueman.main.SignalTracker import SignalTracker
25
 
import weakref
26
 
 
27
 
class OdsManager(OdsBase):
28
 
        __gsignals__ = {
29
 
                'server-created' : (GObject.SignalFlags.NO_HOOKS, None, (GObject.TYPE_PYOBJECT,GObject.TYPE_STRING,)),
30
 
                'server-destroyed' : (GObject.SignalFlags.NO_HOOKS, None, (GObject.TYPE_PYOBJECT,)),
31
 
                'session-created' : (GObject.SignalFlags.NO_HOOKS, None, (GObject.TYPE_PYOBJECT,)),
32
 
                'session-destroyed' : (GObject.SignalFlags.NO_HOOKS, None, (GObject.TYPE_PYOBJECT,)),
33
 
        }
34
 
        
35
 
        def __del__(self):
36
 
                dprint("deleting OdsManager instance")
37
 
                        
38
 
        def __init__(self):
39
 
                OdsBase.__init__(self, "org.openobex.Manager", "/org/openobex")
40
 
                
41
 
                self.Servers = {}
42
 
                self.Sessions = {}
43
 
                
44
 
                self.Handle("SessionClosed", self.on_session_closed)
45
 
                self.Handle("SessionConnectError", self.on_session_error)
46
 
                self.Handle("SessionConnected", self.on_session_connected)
47
 
                
48
 
        def on_session_closed(self, session_path):
49
 
                dprint("__Session Closed__")
50
 
                #session_path = os.path.basename(session_path)
51
 
                if session_path in self.Sessions:
52
 
                        self.Sessions[session_path].DisconnectAll()
53
 
                        del self.Sessions[session_path]
54
 
                        self.emit("session-destroyed", session_path)
55
 
        
56
 
        def on_session_connected(self, session_path):
57
 
                dprint("session_connected")
58
 
                #session_path = os.path.basename(session_path)
59
 
                if session_path in self.Sessions:
60
 
                        session = self.Sessions[session_path]
61
 
                        if not session.Connected:
62
 
                                session.emit("connected")
63
 
        
64
 
        def on_session_error(self, session_path, err_name, err_msg):
65
 
                dprint("__error__")
66
 
                #session_path = os.path.basename(session_path)
67
 
                if session_path in self.Sessions:
68
 
                        session = self.Sessions[session_path]
69
 
                        session.emit("error-occurred", err_name, err_msg)
70
 
                
71
 
                #self.on_session_closed(session_path)
72
 
 
73
 
                
74
 
        def DisconnectAll(self, *args):
75
 
                def on_destroyed(inst, path):
76
 
                        
77
 
                        if len(self.Servers)-1 == 0:
78
 
                                OdsBase.DisconnectAll(self, *args)
79
 
                
80
 
                OdsBase.GHandle(self, "server-destroyed", on_destroyed)
81
 
                if len(self.Servers) == 0:
82
 
                        on_destroyed(None)
83
 
                else:   
84
 
                        for k,v in self.Servers.iteritems():
85
 
                                self.destroy_server(k)
86
 
 
87
 
        def get_server(self, pattern):
88
 
                try:
89
 
                        return self.Servers[pattern]
90
 
                except KeyError:
91
 
                        return None
92
 
        
93
 
        
94
 
        def create_session(self, dest_addr, source_addr="00:00:00:00:00:00", pattern="opp", error_handler=None):
95
 
                def reply(session_path):
96
 
                        session = OdsSession(session_path)
97
 
                        self.Sessions[session_path] = session
98
 
                        self.emit("session-created", session)
99
 
                def err(*args):
100
 
                        dprint("session err", args)
101
 
        
102
 
                if not error_handler:
103
 
                        error_handler=err
104
 
                self.CreateBluetoothSession(dest_addr, source_addr, pattern, reply_handler=reply, error_handler=error_handler)
105
 
        
106
 
        @staticmethod
107
 
        def __server_created(ref, path, pattern):
108
 
 
109
 
                server = OdsServer(path)
110
 
                ref().Servers[pattern] = server
111
 
                ref().emit("server-created", server, pattern)
112
 
                
113
 
        def create_server(self, source_addr="00:00:00:00:00:00", pattern="opp", require_pairing=False):
114
 
                ref = weakref.ref(self)
115
 
        
116
 
                def err(*args):
117
 
                        dprint("Couldn't create %s server" % pattern, args)
118
 
                
119
 
                self.CreateBluetoothServer(source_addr, pattern, require_pairing, reply_handler=lambda x: OdsManager.__server_created(ref, x, pattern), error_handler=err)
120
 
                
121
 
        def destroy_server(self, pattern="opp"):
122
 
                dprint("Destroy %s server" % pattern)
123
 
                def on_stopped(server):
124
 
                        dprint("server stopped")
125
 
                        try:
126
 
                                server.Close()
127
 
                        except:
128
 
                                #this is a workaround for lp:735068
129
 
                                dprint("DBus error on ODS server.Close()")
130
 
                                #force close locally
131
 
                                server.DisconnectAll()
132
 
                                
133
 
                        GObject.source_remove(timeout)
134
 
                
135
 
                def on_closed(server):
136
 
                        dprint("server closed")
137
 
                        self.emit("server-destroyed", self.Servers[pattern].object_path)
138
 
                        del self.Servers[pattern]
139
 
                
140
 
                try:
141
 
                        s = self.Servers[pattern]
142
 
                        s.GHandle("stopped", on_stopped)
143
 
                        s.GHandle("closed", on_closed)
144
 
                        try:
145
 
                                s.Stop()
146
 
                        except:
147
 
                                #ods probably died
148
 
                                GObject.idle_add(on_closed, s)
149
 
                                
150
 
                        timeout = GObject.timeout_add(1000, on_stopped, s)
151
 
                
152
 
                except KeyError:
153
 
                        pass
154