blob: decbad8242ac6cd07882e5bff28201e0898b61d4 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import dbus
import dbus.service
from swindle import entity
class Manager(entity.Entity):
_I_MANAGER = 'org.chromium.flimflam.Manager'
def __init__(self, bus):
entity.Entity.__init__(self, bus, '/')
self.active_profile = None
self.profiles = []
self.devices = []
self._services = []
self.bus = bus
self.state = 'online'
self.offline_mode = False
self.techs = []
self.agents = []
self.default_tech = None
self.service_order = 'ethernet,bluetooth,wifi,wimax,cellular'
self.debugtags = []
def profile(self):
return self.active_profile
def add_profile(self, obj):
self.profiles.append(obj)
if not self.active_profile:
self.active_profile = self.profiles[0]
def add_device(self, obj):
self.devices.append(obj)
if obj.technology() not in self.techs:
self.techs.append(obj.technology())
if not self.default_tech:
self.default_tech = self.techs[0]
def add_service(self, obj):
self._services.append(obj)
self.PropertyChanged('Services', self.services())
def del_service(self, obj):
self._services.remove(obj)
self.PropertyChanged('Services', self.services())
def services(self):
return dbus.Array([x.path() for x in self._services], variant_level=1)
def enabled_techs(self):
ts = [x.technology() for x in self.devices if x.enabled()]
if not ts:
return None
return dbus.Array(set(ts), variant_level=1)
@dbus.service.signal(_I_MANAGER, signature='sv')
def PropertyChanged(self, key, val):
self.log('PropertyChanged %s %s', key, val)
@dbus.service.method(_I_MANAGER, in_signature='', out_signature='a{sv}')
def GetProperties(self):
self.log('GetProperties')
r = {'ActiveProfile': self.active_profile.path()}
r['Profiles'] = dbus.Array([x.path() for x in self.profiles],
variant_level=1)
if self._services:
r['Services'] = self.services()
if self.devices:
r['Devices'] = dbus.Array([x.path() for x in self.devices],
variant_level=1)
r['State'] = dbus.String(self.state, variant_level=1)
r['OfflineMode'] = dbus.Boolean(self.offline_mode, variant_level=1)
techs = set([x.technology() for x in self.devices])
if techs:
r['AvailableTechnologies'] = dbus.Array(techs, variant_level=1)
ontechs = self.enabled_techs()
if ontechs:
r['EnabledTechnologies'] = ontechs
conntechs = set([x.technology() for x in self.devices if x.connected()])
if conntechs:
r['ConnectedTechnologies'] = dbus.Array(conntechs, variant_level=1)
return r
@dbus.service.method(_I_MANAGER, in_signature='sv', out_signature='')
def SetProperty(self, key, value):
self.log('SetProperty %s %s', key, val)
@dbus.service.method(_I_MANAGER, in_signature='', out_signature='s')
def GetState(self):
self.log('GetState')
return self.state
@dbus.service.method(_I_MANAGER, in_signature='s', out_signature='o')
def CreateProfile(self, name):
self.log('CreateProfile %s', name)
p = Profile(self.bus, name)
self.add_profile(p)
return p.path()
@dbus.service.method(_I_MANAGER, in_signature='o', out_signature='')
def RemoveProfile(self, obj):
self.log('RemoveProfile %s', name)
self.profiles = [x for x in self.profiles if x.path() != obj]
@dbus.service.method(_I_MANAGER, in_signature='s')
def RequestScan(self, scantype):
self.log('RequestScan %s', scantype)
@dbus.service.method(_I_MANAGER,
in_signature='s',
out_signature='')
def EnableTechnology(self, tech):
self.log('EnableTechnology %s', tech)
for d in self.devices:
if d.technology() == tech:
d.enable()
self.PropertyChanged('EnabledTechnologies', self.enabled_techs())
@dbus.service.method(_I_MANAGER,
in_signature='s',
out_signature='')
def DisableTechnology(self, tech):
self.log('DisableTechnology %s', tech)
for d in self.devices:
if d.technology() == tech:
d.disable()
self.PropertyChanged('EnabledTechnologies', self.enabled_techs())
@dbus.service.method(_I_MANAGER,
in_signature='a{sv}',
out_signature='o')
def GetService(self, service):
self.log('GetService %s', service)
@dbus.service.method(_I_MANAGER,
in_signature='a{sv}',
out_signature='o')
def GetWifiService(self, service):
self.log('GetWifiService %s', service)
@dbus.service.method(_I_MANAGER,
in_signature='a{sv}',
out_signature='')
def ConfigureWifiService(self, service):
self.log('ConfigureWifiService %s', service)
@dbus.service.method(_I_MANAGER, in_signature='o', out_signature='')
def RegisterAgent(self, obj):
self.log('RegisterAgent %s', obj)
self.agents.append(obj)
@dbus.service.method(_I_MANAGER, in_signature='o', out_signature='')
def UnregisterAgent(self, obj):
self.log('UnregisterAgent %s', obj)
self.agents.remove(obj)
@dbus.service.method(_I_MANAGER, in_signature='', out_signature='s')
def GetDebugTags(self):
self.log('GetDebugTags')
return ','.join(self.debugtags)
@dbus.service.method(_I_MANAGER, in_signature='s', out_signature='')
def SetDebugTags(self, tags):
self.log('SetDebugTags %s', tags)
@dbus.service.method(_I_MANAGER, in_signature='', out_signature='s')
def GetServiceOrder(self):
self.log('GetServiceOrder')
return self.service_order
@dbus.service.method(_I_MANAGER, in_signature='s', out_signature='')
def SetServiceOrder(self, order):
self.log('SetServiceOrder %s', order)
self.service_order = order