| # Copyright 2015 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 collections |
| import dbus.service |
| |
| from autotest_lib.client.cros.tendo import peerd_dbus_helper |
| from autotest_lib.client.cros.tendo.n_faced_peerd import dbus_property_exposer |
| |
| IpInfo = collections.namedtuple('IpInfo', ['addr', 'port']) |
| |
| class Service(dbus_property_exposer.DBusPropertyExposer): |
| """Represents local and remote services.""" |
| |
| |
| def __init__(self, bus, path, peer_id, service_id, service_info, ip_info, |
| object_manager): |
| """Construct a org.chromium.peerd.Service DBus object. |
| |
| @param bus: dbus.Bus object to export this object on. |
| @param path: string object path to export this object at. |
| @param service_id: string peerd service ID. |
| @param service_info: dictionary of string,string items comprising |
| the metadata for the service. |
| @param ip_info: an instance of IpInfo defined above. |
| @param object_manager: an instance of ObjectManager. |
| |
| """ |
| super(Service, self).__init__( |
| bus, path, peerd_dbus_helper.DBUS_INTERFACE_SERVICE) |
| self.peer_id = peer_id |
| self.service_id = service_id |
| self.service_info = service_info |
| self.ip_info = ip_info |
| # Register properties with the property exposer. |
| self.register_property(peerd_dbus_helper.SERVICE_PROPERTY_PEER_ID, |
| self._get_peer_id) |
| self.register_property(peerd_dbus_helper.SERVICE_PROPERTY_ID, |
| self._get_service_id) |
| self.register_property(peerd_dbus_helper.SERVICE_PROPERTY_INFO, |
| self._get_service_info) |
| self.register_property(peerd_dbus_helper.SERVICE_PROPERTY_IPS, |
| self._get_ip_info) |
| # Claim the service interface. |
| self._object_manager = object_manager |
| self._path = path |
| self._object_manager.claim_interface( |
| path, peerd_dbus_helper.DBUS_INTERFACE_SERVICE, |
| self.property_getter) |
| |
| |
| def _get_peer_id(self): |
| """Getter for SERVICE_PROPERTY_PEER_ID. |
| |
| @return dbus.String containing this service's peer_id. |
| |
| """ |
| return dbus.String(self.peer_id) |
| |
| |
| def _get_service_id(self): |
| """Getter for SERVICE_PROPERTY_ID. |
| |
| @return dbus.String containing this service's service_id. |
| |
| """ |
| return dbus.String(self.service_id) |
| |
| |
| def _get_service_info(self): |
| """Getter for SERVICE_PROPERTY_INFO. |
| |
| @return dbus.Dictionary containing this service's metadata. |
| |
| """ |
| return dbus.Dictionary(self.service_info, 'ss') |
| |
| |
| def _get_ip_info(self): |
| """Getter for SERVICE_PROPERTY_IPS. |
| |
| @return dbus.Array of dbus.Struct objects containing an array of bytes |
| and a port number. See DBus API documentation. |
| |
| """ |
| dbus_port = dbus.UInt16(self.ip_info.port) |
| dbus_ip = dbus.Array([dbus.Byte(int(octet)) |
| for octet in self.ip_info.addr.split('.')]) |
| ip_info = dbus.Struct((dbus_ip, dbus_port), signature='ayq') |
| return dbus.Array([ip_info], signature='(ayq)') |
| |
| |
| def update(self, service_info, ip_info): |
| """Update service metadata and trigger DBus signals. |
| |
| @param service_info: see constructor. |
| @param ip_info: see constructor. |
| |
| """ |
| if service_info != self.service_info: |
| self.service_info = service_info |
| self.on_property_changed(peerd_dbus_helper.SERVICE_PROPERTY_INFO) |
| if ip_info != self.ip_info: |
| self.ip_info = ip_info |
| self.on_property_changed(peerd_dbus_helper.SERVICE_PROPERTY_IPS) |
| |
| |
| def close(self): |
| """Release interfaces claimed by this object.""" |
| self._object_manager.release_interface( |
| self._path, peerd_dbus_helper.DBUS_INTERFACE_SERVICE) |