1
# Copyright (C) 2008 Valmantas Paliksa <walmis at balticum-tv dot lt>
2
# Copyright (C) 2008 Tadas Dailyda <tadas at dailyda dot com>
4
# Licensed under the GNU General Public License Version 3
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.
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.
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/>.
19
from gi.repository import GObject
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
27
class OdsManager(OdsBase):
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,)),
36
dprint("deleting OdsManager instance")
39
OdsBase.__init__(self, "org.openobex.Manager", "/org/openobex")
44
self.Handle("SessionClosed", self.on_session_closed)
45
self.Handle("SessionConnectError", self.on_session_error)
46
self.Handle("SessionConnected", self.on_session_connected)
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)
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")
64
def on_session_error(self, session_path, err_name, err_msg):
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)
71
#self.on_session_closed(session_path)
74
def DisconnectAll(self, *args):
75
def on_destroyed(inst, path):
77
if len(self.Servers)-1 == 0:
78
OdsBase.DisconnectAll(self, *args)
80
OdsBase.GHandle(self, "server-destroyed", on_destroyed)
81
if len(self.Servers) == 0:
84
for k,v in self.Servers.iteritems():
85
self.destroy_server(k)
87
def get_server(self, pattern):
89
return self.Servers[pattern]
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)
100
dprint("session err", args)
102
if not error_handler:
104
self.CreateBluetoothSession(dest_addr, source_addr, pattern, reply_handler=reply, error_handler=error_handler)
107
def __server_created(ref, path, pattern):
109
server = OdsServer(path)
110
ref().Servers[pattern] = server
111
ref().emit("server-created", server, pattern)
113
def create_server(self, source_addr="00:00:00:00:00:00", pattern="opp", require_pairing=False):
114
ref = weakref.ref(self)
117
dprint("Couldn't create %s server" % pattern, args)
119
self.CreateBluetoothServer(source_addr, pattern, require_pairing, reply_handler=lambda x: OdsManager.__server_created(ref, x, pattern), error_handler=err)
121
def destroy_server(self, pattern="opp"):
122
dprint("Destroy %s server" % pattern)
123
def on_stopped(server):
124
dprint("server stopped")
128
#this is a workaround for lp:735068
129
dprint("DBus error on ODS server.Close()")
131
server.DisconnectAll()
133
GObject.source_remove(timeout)
135
def on_closed(server):
136
dprint("server closed")
137
self.emit("server-destroyed", self.Servers[pattern].object_path)
138
del self.Servers[pattern]
141
s = self.Servers[pattern]
142
s.GHandle("stopped", on_stopped)
143
s.GHandle("closed", on_closed)
148
GObject.idle_add(on_closed, s)
150
timeout = GObject.timeout_add(1000, on_stopped, s)