示例#1
0
def run(
        write_pipe1=None,  # write pipe to systemtray
        write_pipe2=None,  # write pipe to hpdio
        read_pipe3=None):  # read pipe from hpdio

    global dbus_loop, main_loop
    global system_bus, session_bus
    global w1, w2, r3

    log.set_module("hp-systray(hpssd)")
    log.debug("PID=%d" % os.getpid())
    w1, w2, r3 = write_pipe1, write_pipe2, read_pipe3

    dbus_loop = DBusGMainLoop(set_as_default=True)
    main_loop = MainLoop()

    try:
        system_bus = SystemBus(mainloop=dbus_loop)
    except dbus.exceptions.DBusException as e:
        log.error("Unable to connect to dbus system bus. Exiting.")
        sys.exit(1)

    try:
        session_bus = dbus.SessionBus()
    except dbus.exceptions.DBusException as e:
        if os.getuid() != 0:
            log.error("Unable to connect to dbus session bus. Exiting.")
            sys.exit(1)
        else:
            log.error(
                "Unable to connect to dbus session bus (running as root?)")
            sys.exit(1)

    # Receive events from the system bus
    system_bus.add_signal_receiver(handle_system_signal,
                                   sender_keyword='sender',
                                   destination_keyword='dest',
                                   interface_keyword='interface',
                                   member_keyword='member',
                                   path_keyword='path')

    # Receive events from the session bus
    session_bus.add_signal_receiver(handle_session_signal,
                                    sender_keyword='sender',
                                    destination_keyword='dest',
                                    interface_keyword='interface',
                                    member_keyword='member',
                                    path_keyword='path')

    # Export an object on the session bus
    session_name = dbus.service.BusName("com.hplip.StatusService", session_bus)
    status_service = StatusService(session_name, "/com/hplip/StatusService")

    log.debug("Entering main dbus loop...")
    try:
        main_loop.run()
    except KeyboardInterrupt:
        log.debug("Ctrl-C: Exiting...")
	def install_signal_handlers(self):
		"""Hooks to some d-bus signals that are of interest to us"""
		
		bus = SystemBus()
		
		bus.add_signal_receiver(
			self.handle_incoming_message,
			'IncomingMessage',
			'org.freesmartphone.GSM.SIM'
			)
示例#3
0
def run(write_pipe1=None,  # write pipe to systemtray
        write_pipe2=None,  # write pipe to hpdio
        read_pipe3=None):  # read pipe from hpdio

    global dbus_loop, main_loop
    global system_bus, session_bus
    global w1, w2, r3

    log.set_module("hp-systray(hpssd)")
    log.debug("PID=%d" % os.getpid())
    w1, w2, r3 = write_pipe1, write_pipe2, read_pipe3

    dbus_loop = DBusGMainLoop(set_as_default=True)
    main_loop = MainLoop()

    try:
        system_bus = SystemBus(mainloop=dbus_loop)
    except dbus.exceptions.DBusException as e:
        log.error("Unable to connect to dbus system bus. Exiting.")
        sys.exit(1)

    try:
        session_bus = dbus.SessionBus()
    except dbus.exceptions.DBusException as e:
        if os.getuid() != 0:
            log.error("Unable to connect to dbus session bus. Exiting.")
            sys.exit(1)
        else:
            log.error("Unable to connect to dbus session bus (running as root?)")
            sys.exit(1)

    # Receive events from the system bus
    system_bus.add_signal_receiver(handle_system_signal, sender_keyword='sender',
        destination_keyword='dest', interface_keyword='interface',
        member_keyword='member', path_keyword='path')

    # Receive events from the session bus
    session_bus.add_signal_receiver(handle_session_signal, sender_keyword='sender',
        destination_keyword='dest', interface_keyword='interface',
        member_keyword='member', path_keyword='path')

    # Export an object on the session bus
    session_name = dbus.service.BusName("com.hplip.StatusService", session_bus)
    status_service = StatusService(session_name, "/com/hplip/StatusService")

    log.debug("Entering main dbus loop...")
    try:
        main_loop.run()
    except KeyboardInterrupt:
        log.debug("Ctrl-C: Exiting...")
示例#4
0
 def enable(self):
     bus = SystemBus()
     if not self.handler:
         self.signal = bus.add_signal_receiver(
             self.handle_call_status,
             signal_name='CallStatus',
             dbus_interface='org.freesmartphone.GSM.Call',
             bus_name='org.freesmartphone.ogsmd')
         self.handler = True
     self._initialized = True
示例#5
0
class AutoPlayer:
    def __init__(self):
        # Diccionario para evitar los dobles escaneos producto de la emisión
        # de señales repetidas. Pasa porque Rhythmbox vuelve a escanear todos
        # los dispositivos cuando levanta por primera vez.
        self._already_scanned = {}

        # Se obtiene una conexión al bus de sistema
        self._system_bus = SystemBus()

        # Se obtiene una conexión al bus de sesión
        self._session_bus = SessionBus()

        # Conectar a las señales que emite de UDisks
        self._connect_to_udisks()

    def _connect_to_udisks(self):
        # Información de D-Bus para UDisks
        udisks_bus_name = 'org.freedesktop.UDisks'
        udisks_object_path = '/org/freedesktop/UDisks'
        udisks_dbus_interface = 'org.freedesktop.UDisks'

        # Se conecta la señal 'DeviceChanged' exportada por el objeto remoto
        # al manejador local de señales '_onDeviceChanged'.
        self._system_bus.add_signal_receiver(
            self._onDeviceChanged,
            signal_name='DeviceChanged',
            dbus_interface=udisks_dbus_interface,
            bus_name=udisks_bus_name,
            path=udisks_object_path)

        # Se conecta la señal 'DeviceRemoved' exportada por el objeto remoto
        # al manejador local de señales '_onDeviceRemoved'.
        self._system_bus.add_signal_receiver(
            self._onDeviceRemoved,
            signal_name='DeviceRemoved',
            dbus_interface=udisks_dbus_interface,
            bus_name=udisks_bus_name,
            path=udisks_object_path)

    def _onDeviceChanged(self, device_object_path):
        " La señal 'DeviceChanged' es emitida cuando se cambia el estado de un"
        " dispositivo (por ejemplo, cuando se monta o desmonta). UDisks envía "
        " el camino del objeto remoto del dispositivo que cambió de estado.   "
        print u'Un dispositivo cambió: %s' % device_object_path
        mount_path = self._get_device_mount_path(device_object_path)
        # Si no está montado o ya fue escaneado, no hacer nada y retornar
        if not mount_path:
            return
        playlist = self._get_playlist(mount_path)
        # Si no hay música en el dispositivo, no hacer nada y retornar
        if not playlist:
            return
        self._play(playlist)

    def _onDeviceRemoved(self, device_object_path):
        " La señal 'DeviceRemoved' es emitida cuando un dispositivo es   "
        " desconectado por hardware de la PC. UDisks envía el camino del "
        " objeto remoto del dispositivo."
        print u'Un dispositivo fue desconectado: %s' % device_object_path
        if device_object_path in self._already_scanned:
            del self._already_scanned[device_object_path]

    def _get_device_mount_path(self, device_object_path):
        # Información necesaria para procesar los dispositivos de UDisks
        udisks_bus_name = 'org.freedesktop.UDisks'
        device_dbus_interface = 'org.freedesktop.UDisks.Device'

        # Se obtiene el objeto remoto del dispositivo insertado a través
        # de la conexión al bus de sistema del demonio UDisks.
        device_object = self._system_bus.get_object(udisks_bus_name,
                                                    device_object_path)

        # Para acceder a las propiedades de un objeto FreeDesktop.org
        # establece una interfaz estándar: 'org.freedesktop.DBus.Properties'
        device = Interface(device_object, 'org.freedesktop.DBus.Properties')

        # Con el método 'Get' de la interfaz 'org.freedesktop.DBus.Properties'
        # se obtiene el valor de una propiedad en una interfaz determinada.

        # La propiedad 'DeviceFile' devuelve el archivo de dispositivo en /dev
        # En nuestro caso no lo necesitamos, se pone a modo de enseñanza.
        dev_file = device.Get(device_dbus_interface, 'DeviceFile')

        # La propiedad 'DeviceIsMounted' devuelve si está montado
        is_mounted = device.Get(device_dbus_interface, 'DeviceIsMounted')
        print u'¿Está montado %s? : %s' % (dev_file, str(bool(is_mounted)))

        # Si el dispositivo ya fue escaneado y no está montado, significa que
        # recién se desmontó, hay que olvidarlo.
        mount_path = None
        if device_object_path in self._already_scanned:
            if not is_mounted:
                del self._already_scanned[device_object_path]
        # Si no ha sido escaneado y está montado, significa que recién se
        # ha montado y hay que escanearlo y recordarlo, se devuelve el punto
        # de montaje. En otros casos, no se hace nada y no se devuelve nada.
        elif is_mounted:
            self._already_scanned[device_object_path] = True
            # La propiedad 'DeviceMountPaths' devuelve todos los directorios
            # del sistema de archivos donde se ha montado este dispositivo.
            mount_paths = device.Get(device_dbus_interface, 'DeviceMountPaths')
            mount_path = mount_paths[0]
        return mount_path

    def _get_playlist(self, directory_path):
        print u'Buscando música en el directorio %s' % directory_path
        playlist = []
        filenames = listdir(directory_path)
        for filename in filenames:
            path = join(directory_path, filename)
            if isfile(path):
                # Se obtiene el tipo MIME, ejemplo "audio/mpeg"
                mime_type = guess_type(path)[0]
                # Lo que interesa es la primera parte del tipo MIME
                category = mime_type.split('/')[0]
                if category == 'audio':
                    # El Playlist Manager de Rhythmbox espera URIs, por tanto..
                    uri = urljoin('file:', pathname2url(path))
                    playlist.append(uri)
        return playlist

    def _get_rhythmbox_playlist_manager(self):
        # Para modificar la lista de reproducción no hay MPRIS que valga :-(
        # Información de D-Bus para el Playlist Manager de Rhythmbox
        rhythmbox_bus_name = 'org.gnome.Rhythmbox3'
        playlist_mgr_object_path = '/org/gnome/Rhythmbox3/PlaylistManager'
        playlist_mgr_dbus_interface = 'org.gnome.Rhythmbox3.PlaylistManager'

        # Se obtiene el objeto remoto de Rhythmbox desde el bus de sesión
        playlist_mgr_obj = self._session_bus.get_object(
            rhythmbox_bus_name, playlist_mgr_object_path)

        # Esperar a que levante Rhythmbox... sí, ok, ya sé que esto es una
        # mala práctica. Lo correcto sería conectar a alguna señal remota que
        # avise de que está listo el reproductor, pero mejor no complicarse :-P
        sleep(5)

        playlist_manager = Interface(playlist_mgr_obj,
                                     playlist_mgr_dbus_interface)
        return playlist_manager

    def _get_rhythmbox_player(self):
        # Para controlar el reproductor, usaremos la interfaz estándar que
        # define FreeDestkop.org, es decir MPRIS

        # Información de D-Bus para Rhythmbox usando interfaz estándar MPRIS
        rhythmbox_bus_name = 'org.mpris.MediaPlayer2.rhythmbox'
        rhythmbox_object_path = '/org/mpris/MediaPlayer2'
        rhythmbox_dbus_interface_player = 'org.mpris.MediaPlayer2.Player'
        rhythmbox_dbus_interface_playlists = 'org.mpris.MediaPlayer2.Playlists'

        # Se obtiene el objeto remoto de Rhythmbox desde el bus de sesión
        rhythmbox_object = self._session_bus.get_object(
            rhythmbox_bus_name, rhythmbox_object_path)

        # Se obtiene la interfaz Player del objeto remoto del reproductor
        rhythmbox_player = Interface(rhythmbox_object,
                                     rhythmbox_dbus_interface_player)

        # Se obtiene la interfaz Playerlists del objeto remoto del reproductor
        rhythmbox_playlists = Interface(rhythmbox_object,
                                        rhythmbox_dbus_interface_playlists)

        # Se necesita obtener la cantidad de listas de reproducción contenidas
        # en el reproductor. Eso lo devuelve la propiedad "PlaylistCount"
        playlists_properties = Interface(rhythmbox_object,
                                         'org.freedesktop.DBus.Properties')
        pl_count = playlists_properties.Get(rhythmbox_dbus_interface_playlists,
                                            'PlaylistCount')

        return rhythmbox_player, rhythmbox_playlists, pl_count

    def _play(self, playlist):
        # Obtener el Playlist Manager de Rhythmbox
        playlist_manager = self._get_rhythmbox_playlist_manager()

        # Nombre estático para la lista de reproducción,
        # se llamará siempre "Autoplayer"
        playlist_name = 'Autoplayer'
        try:
            # Borrar la lista de reproducción si ya existe
            playlist_manager.DeletePlaylist(playlist_name)
        except:
            # Si no existe levanta excepción, la ignoramos
            pass
        # Crear una lista de reproducción nueva
        playlist_manager.CreatePlaylist(playlist_name)

        # Se adiciona cada archivo de música obtenido del dispositvo
        # de almacenamiento a la nueva lista de reproducción
        for uri in playlist:
            playlist_manager.AddToPlaylist(playlist_name, uri)

        # Obtenemos el reproductor y sus listas desde la interfaz MPRIS
        (rhythmbox_player, playlists_interface,
         playlists_count) = self._get_rhythmbox_player()

        # En un mundo ideal, Rhythmbox sería buenito y ordenaría las listas de
        # reproducción por fecha de creación en orden reverso como indica el
        # API de MPRIS, pero desgraciadamente no soporta esta funcionalidad,
        # así que hay que buscar a lo bestia... :-P :-(
        playlists = playlists_interface.GetPlaylists(0, playlists_count,
                                                     'CreationDate', True)

        # Buscando nuestra lista de reproducción a lo bestia... :-P
        i = 0
        while i < playlists_count and playlists[i][1] != playlist_name:
            i += 1
        if i < playlists_count:
            playlist_id = playlists[i][0]
        else:
            print >> stderr, u'Rhythmbox no cargó la lista correctamente.'
            return

        # Si se llega aquí, es que se encontró nuestra lista de reproducción
        # Detenemos cualquier reproducción previa para evitar mareadera :-P
        rhythmbox_player.Stop()

        # Activar la lista de reproducción como lista de reproducción actual
        playlists_interface.ActivatePlaylist(playlist_id)

        # Reproducir... :-)
        rhythmbox_player.Play()
示例#6
0
class MessagesFSO(object):
    #----------------------------------------------------------------------------#
    name = 'FSO-Messages-Handler'

    _gsm_sim_iface = None

    _UNAVAILABLE_PART = '<???>'
    domain = None

    #----------------------------------------------------------------------------#

    def __init__(self, domain):
        self.domain = domain

        self.signals = False
        self.ready_signal = False
        self.enable()

    def __repr__(self):
        return self.name

    def dbus_ok(self, *args, **kargs):
        pass

    def dbus_err(self, *args, **kargs):
        pass

    def process_single_entry(self, data):
        (status, number, text, props) = data
        entry = {}
        #FIXME: removing status and sanitize this function remove seq/etc after getting second message

        logger.debug("Processing entry \"%s\"...", text)

        entry['New'] = 1
        if status in ('read', 'unread'):
            entry['Direction'] = 'in'
        else:
            entry['Direction'] = 'out'

        if status in ('read', 'sent'):
            entry['New'] = 0

        entry['Peer'] = number

        # TODO Handle text properly, i.e. make it on-demand if >1KiB
        entry['Content'] = text

        entry['Source'] = 'SMS'

        entry['SMS-combined_message'] = 0

        if props.has_key('timestamp'):
            try:
                timestamp = props['timestamp'][:len(props['timestamp']) - 6]
                entry['Timezone'] = props['timestamp'][len(props['timestamp']
                                                           ) - 5:]
                entry['Timestamp'] = int(time.mktime(time.strptime(timestamp)))
            except ValueError:
                logger.error("Couldn't handle timestamp!")

        if props.has_key('csm_seq'):
            entry['SMS-combined_message'] = 1
            entry['SMS-complete_message'] = 0
            entry['SMS-csm_seq' + str(props['csm_seq']) + '_content'] = text

        for field in props:
            entry['SMS-' + field] = props[field]

        logger.debug("Message is incoming!")
        if entry['SMS-combined_message']:
            logger.debug("It's CSM!")
            register = 0
            try:
                path = self.domain.GetSingleEntrySingleField(
                    {
                        'Direction': 'in',
                        'SMS-combined_message': 1,
                        'SMS-complete_message': 0,
                        'SMS-csm_num': entry['SMS-csm_num'],
                        'SMS-csm_id': entry['SMS-csm_id'],
                        'Source': 'SMS'
                    }, 'Path')
                if path:
                    id = self.domain.path_to_id(path)
                    result = self.domain.get_content(id)
                    new_content = ''
                    complete = 1
                    edit_data = {}
                    # Make the whole content
                    for i in range(1, entry['SMS-csm_num'] + 1):
                        if i == entry['SMS-csm_seq']:
                            new_content += entry['Content']
                            edit_data['SMS-csm_seq' + str(i) +
                                      '_content'] = entry['Content']
                        else:
                            try:
                                new_content += result['SMS-csm_seq' + str(i) +
                                                      '_content']
                            except KeyError:
                                new_content += self._UNAVAILABLE_PART
                                complete = 0
                    if complete:
                        edit_data['SMS-complete_message'] = 1
                    edit_data['Content'] = new_content
                    edit_data['New'] = 1
                    self.domain.Update(edit_data, '/' + str(id))
                else:
                    register = 1
                    if entry['SMS-csm_seq'] > 1:
                        entry['Content'] = self._UNAVAILABLE_PART + entry[
                            'Content']
                    if entry['SMS-csm_seq'] < entry['SMS-csm_num']:
                        entry['Content'] = entry[
                            'Content'] + self._UNAVAILABLE_PART
                    logger.debug('CSM: first part')
            except:
                register = 1
                logger.error('%s: failed to handle CSM message!', self.name)
        else:
            register = 1

        #If needed to add, add.
        if register:
            self.domain.AddIncoming(entry)

    def disable(self):
        if self.ready_signal:
            self.readysignal.remove()
            self.authsignal.remove()
            self.ready_signal = False
        if self.signals:
            self.imsignal.remove()
            self.ismsignal.remove()
            self.imrsignal.remove()
            self.imrsignal2.remove()
            self.itmsignal.remove()
            self.signals = False

    def enable(self):
        self.bus = SystemBus()

        try:
            self.gsm = self.bus.get_object('org.freesmartphone.ogsmd',
                                           '/org/freesmartphone/GSM/Device',
                                           True, True)
            self.gsm_sim_iface = Interface(self.gsm,
                                           'org.freesmartphone.GSM.SIM')
            self.gsm_sms_iface = Interface(self.gsm,
                                           'org.freesmartphone.GSM.SMS')
            self.gsm_device_iface = Interface(self.gsm,
                                              'org.freesmartphone.GSM.Device')

            self.install_signal_handlers()
            self._initialized = True
        except DBusException, e:
            logger.warning(
                "%s: Could not request SIM messagebook from ogsmd (%s)",
                self.name, e)
            logger.info("%s: Waiting for SIM being ready...", self.name)
            if not self.ready_signal:
                try:
                    self.readysignal = self.bus.add_signal_receiver(
                        self.handle_sim_ready,
                        signal_name='ReadyStatus',
                        dbus_interface='org.freesmartphone.GSM.SIM',
                        bus_name='org.freesmartphone.ogsmd')
                    self.authsignal = self.bus.add_signal_receiver(
                        self.handle_auth_status,
                        signal_name='AuthStatus',
                        dbus_interface='org.freesmartphone.GSM.SIM',
                        bus_name='org.freesmartphone.ogsmd')
                    logger.info(
                        '%s: Signal listeners about SIM status installed',
                        self.name)
                    #self.gsm_sim_iface.connect_to_signal("ReadyStatus", self.handle_sim_ready)
                    self.ready_signal = True
                except:
                    logger.error("%s: Could not install signal handler!",
                                 self.name)