From: Jônatas Isvi Date: Thu, 4 Jun 2009 04:52:15 +0000 (-0400) Subject: pcremote-client-n8x0 -> client sources X-Git-Url: http://vcs.maemo.org/git/?p=remotepc;a=commitdiff_plain;h=8eeea3225c010dea378cdc71c4e91294e04a6e9c pcremote-client-n8x0 -> client sources pcremote-server-n8x0 -> server sources --- diff --git a/pcremote-client-n8x0-60/build-stamp b/pcremote-client-n8x0-60/build-stamp new file mode 100644 index 0000000..e69de29 diff --git a/pcremote-client-n8x0-60/configure-stamp b/pcremote-client-n8x0-60/configure-stamp new file mode 100644 index 0000000..e69de29 diff --git a/pcremote-client-n8x0-60/connection/__init__.py b/pcremote-client-n8x0-60/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0-60/connection/__init__.pyc b/pcremote-client-n8x0-60/connection/__init__.pyc new file mode 100755 index 0000000..1088a1f Binary files /dev/null and b/pcremote-client-n8x0-60/connection/__init__.pyc differ diff --git a/pcremote-client-n8x0-60/connection/bluetoothconnectionmanager.py b/pcremote-client-n8x0-60/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..dc23b72 --- /dev/null +++ b/pcremote-client-n8x0-60/connection/bluetoothconnectionmanager.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : BluetoothConnectionManager +# ============================================================================ + + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionError(Exception): + pass + +class BluetoothConnectionManager(GenericConnectionManager): + + def __init__(self): + GenericConnectionManager.__init__(self) + print "BluetoothConnectionManager iniciado." + # globals data variables + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + # returns all services + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + # returns only the device services indicated by name + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + # returns only the device services indicated by address + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + # returns only the device service indicated by address + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + # returns an object + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-client-n8x0-60/connection/bluetoothconnectionmanager.pyc b/pcremote-client-n8x0-60/connection/bluetoothconnectionmanager.pyc new file mode 100755 index 0000000..77e47d5 Binary files /dev/null and b/pcremote-client-n8x0-60/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0-60/connection/genericconnectionmanager.py b/pcremote-client-n8x0-60/connection/genericconnectionmanager.py new file mode 100755 index 0000000..9eb3f85 --- /dev/null +++ b/pcremote-client-n8x0-60/connection/genericconnectionmanager.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Version : 1.0 +# Description : GenericConnectionManager Class +# ============================================================================ + + +class GenericConnectionManager: + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + def identify_app(self): + print "identify_app" diff --git a/pcremote-client-n8x0-60/connection/genericconnectionmanager.pyc b/pcremote-client-n8x0-60/connection/genericconnectionmanager.pyc new file mode 100755 index 0000000..ec68e43 Binary files /dev/null and b/pcremote-client-n8x0-60/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0-60/connection/iconnection.py b/pcremote-client-n8x0-60/connection/iconnection.py new file mode 100755 index 0000000..118358d --- /dev/null +++ b/pcremote-client-n8x0-60/connection/iconnection.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Interface Class, connection manager +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # ******************************************************************************** + # Generic methods -> Wireless and Bluetooth * + # ******************************************************************************** + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # ************************************************************************************ + # Bluetooth methods - All methods for bluetooth services * + # ************************************************************************************ + + # fast way to create a simple server + def bt_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bt_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bt_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bt_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device port + def bt_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search device services + def bt_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bt_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # *********************************************************************************** + # Wireless method - All methods for wireless services * + # *********************************************************************************** diff --git a/pcremote-client-n8x0-60/connection/iconnection.pyc b/pcremote-client-n8x0-60/connection/iconnection.pyc new file mode 100755 index 0000000..2226bd9 Binary files /dev/null and b/pcremote-client-n8x0-60/connection/iconnection.pyc differ diff --git a/pcremote-client-n8x0-60/connection/wirelessconnectionmanager.py b/pcremote-client-n8x0-60/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..7b94774 --- /dev/null +++ b/pcremote-client-n8x0-60/connection/wirelessconnectionmanager.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Version : 0.1 +# Description : Tablet Application Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + def __init__(self): + GenericConnectionManager.__init__(self) + #para acessar facilmente qualquer metodo generico + #self.super = generico() + print "init do Wireless" + self.tipo = "wireless" + + def metodo(self): + print "(Wireless)Metodo do", self.tipo + + diff --git a/pcremote-client-n8x0-60/connection/wirelessconnectionmanager.pyc b/pcremote-client-n8x0-60/connection/wirelessconnectionmanager.pyc new file mode 100755 index 0000000..06563ae Binary files /dev/null and b/pcremote-client-n8x0-60/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0-60/debian/README.Debian b/pcremote-client-n8x0-60/debian/README.Debian new file mode 100755 index 0000000..fdaa542 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/README.Debian @@ -0,0 +1,6 @@ +pcremote-client for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-client-n8x0-60/debian/changelog b/pcremote-client-n8x0-60/debian/changelog new file mode 100755 index 0000000..b332888 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/changelog @@ -0,0 +1,6 @@ +pcremote-client (0.60-1) unstable; urgency=low + + * Initial release (Closes: #nnnn) + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 + diff --git a/pcremote-client-n8x0-60/debian/compat b/pcremote-client-n8x0-60/debian/compat new file mode 100755 index 0000000..7ed6ff8 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/compat @@ -0,0 +1 @@ +5 diff --git a/pcremote-client-n8x0-60/debian/control b/pcremote-client-n8x0-60/debian/control new file mode 100755 index 0000000..ccc90cd --- /dev/null +++ b/pcremote-client-n8x0-60/debian/control @@ -0,0 +1,11 @@ +Source: pcremote-client +Section: user/other +Priority: optional +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Build-Depends: debhelper (>= 5) +Standards-Version: 3.7.2 + +Package: pcremote-client +Architecture: armel +Depends: python2.5, python2.5-efl-utils (>=0.1.3), python2.5-efl-core (>=0.9.1), python2.5-bluez (>=0.9.1) +Description: A client application to let you control a mouse and keyboard of a desktop server diff --git a/pcremote-client-n8x0-60/debian/copyright b/pcremote-client-n8x0-60/debian/copyright new file mode 100755 index 0000000..63487d0 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Client + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-client-n8x0-60/debian/dirs b/pcremote-client-n8x0-60/debian/dirs new file mode 100755 index 0000000..3618ba5 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/dirs @@ -0,0 +1,5 @@ +usr/bin +usr/share/pcremote-client +usr/share/applications/hildon +usr/share/icons/hicolor/26x26/hildon + diff --git a/pcremote-client-n8x0-60/debian/docs b/pcremote-client-n8x0-60/debian/docs new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0-60/debian/files b/pcremote-client-n8x0-60/debian/files new file mode 100644 index 0000000..176ed73 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/files @@ -0,0 +1 @@ +pcremote-client_0.60-1_armel.deb user/other optional diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/control b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/control new file mode 100644 index 0000000..8aa4c87 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/control @@ -0,0 +1,9 @@ +Package: pcremote-client +Version: 0.60-1 +Architecture: armel +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Installed-Size: 1700 +Depends: python2.5, python2.5-bluez (>= 0.9.1), python2.5-efl-core (>= 0.9.1), python2.5-efl-utils (>= 0.1.3) +Section: user/other +Priority: optional +Description: A client application to let you control a mouse and keyboard of a desktop server diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/md5sums b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/md5sums new file mode 100644 index 0000000..245cab1 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/md5sums @@ -0,0 +1,25 @@ +3fd5b4d9e25d31363a8059d09c200f41 usr/share/applications/hildon/pcremote-client.desktop +58bf2e5a7c200824c5aeb54c62488405 usr/share/pcremote-client/pcremote-client.py +50a7074d0b24fa0252802218e950e628 usr/share/pcremote-client/kineticlist.py +ad592c024fc19766d7bcc5c37f98619b usr/share/pcremote-client/screenmanager.py +c550a42e4e4839bd5d2911e2792f0203 usr/share/pcremote-client/tablet.edj +03144240717eaaaf1b69cc63172dec10 usr/share/pcremote-client/connection/bluetoothconnectionmanager.py +49c1b5c3a6725fea02760a16fab55d6c usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc +70e8942077f305d0dc2efc6fd13a7d19 usr/share/pcremote-client/connection/iconnection.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-client/connection/__init__.py +cec93922a80076d075d473a671b1b32e usr/share/pcremote-client/connection/genericconnectionmanager.py +048e6ffb26374c4f80d7698dbad247a9 usr/share/pcremote-client/connection/__init__.pyc +2fa68f3f626f6da9ace3785a6fb8a843 usr/share/pcremote-client/connection/genericconnectionmanager.pyc +a9a199485e01894676c9c207c1d7ac7d usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc +71b6cd7b7f5a0f015ac3ea28c146dcfd usr/share/pcremote-client/connection/wirelessconnectionmanager.py +368ec39fb0bd97b83e676c5eb570a504 usr/share/pcremote-client/connection/iconnection.pyc +a29eb978df91c3c7bc9f880d9279fe18 usr/share/pcremote-client/edje_objects.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-client/utils/__init__.py +b3ce6c1b4dde39f132c6fea0c0f32812 usr/share/pcremote-client/utils/labels.py +8d63834377110f7cac90eef4b9b95e78 usr/share/pcremote-client/slide.edj +02a89fa5764dedbd7a3b24f17cdef5cc usr/share/pcremote-client/pcremote.edj +a45cefda3455e840e85003b8b01fab75 usr/share/doc/pcremote-client/README.Debian +05c8914575af590a1c2a0e0febed2903 usr/share/doc/pcremote-client/changelog.Debian.gz +002c11b08af0369742751c02cbf1fbe8 usr/share/doc/pcremote-client/copyright +194dc850c98759d2b2f4fa7faf62f37b usr/share/icons/hicolor/26x26/hildon/pcremote.png +432c8381b94e37a4a618c8930bce54e6 usr/bin/pcremote-client diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/postinst b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/postinst new file mode 100755 index 0000000..8204dd4 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/postinst @@ -0,0 +1,5 @@ +#!/bin/sh -e + +gtk-update-icon-cache -f /usr/share/icons/hicolor +maemo-select-menu-location pcremote-client.desktop + diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/prerm b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/prerm new file mode 100755 index 0000000..72123fe --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/DEBIAN/prerm @@ -0,0 +1,15 @@ +#!/bin/sh -e + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/hildon/pcremote-client.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-client + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-client + + +exit 0 diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/bin/pcremote-client b/pcremote-client-n8x0-60/debian/pcremote-client/usr/bin/pcremote-client new file mode 100755 index 0000000..b28bdfe --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/bin/pcremote-client @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-client/pcremote-client.py diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/applications/hildon/pcremote-client.desktop b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/applications/hildon/pcremote-client.desktop new file mode 100644 index 0000000..f712a0a --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/applications/hildon/pcremote-client.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.60 +Type=Application +Icon=pcremote +Name=PCRemote Client +Exec=pcremote-client +X-Window-Icon=pcremote +X-Window-Icon-Dimmed=pcremote +Terminal=false +Categories=Application;Network; +StartupNotify=false diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/README.Debian b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/README.Debian new file mode 100644 index 0000000..fdaa542 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/README.Debian @@ -0,0 +1,6 @@ +pcremote-client for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/changelog.Debian.gz b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/changelog.Debian.gz new file mode 100644 index 0000000..2cc3eef Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/changelog.Debian.gz differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/copyright b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/copyright new file mode 100644 index 0000000..63487d0 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/doc/pcremote-client/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Client + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png new file mode 100755 index 0000000..e5e8183 Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.pyc b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.pyc new file mode 100755 index 0000000..1088a1f Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.pyc differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..dc23b72 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : BluetoothConnectionManager +# ============================================================================ + + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionError(Exception): + pass + +class BluetoothConnectionManager(GenericConnectionManager): + + def __init__(self): + GenericConnectionManager.__init__(self) + print "BluetoothConnectionManager iniciado." + # globals data variables + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + # returns all services + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + # returns only the device services indicated by name + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + # returns only the device services indicated by address + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + # returns only the device service indicated by address + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + # returns an object + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc new file mode 100755 index 0000000..77e47d5 Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.py new file mode 100755 index 0000000..9eb3f85 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Version : 1.0 +# Description : GenericConnectionManager Class +# ============================================================================ + + +class GenericConnectionManager: + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + def identify_app(self): + print "identify_app" diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.pyc b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.pyc new file mode 100755 index 0000000..ec68e43 Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.py new file mode 100755 index 0000000..118358d --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Interface Class, connection manager +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # ******************************************************************************** + # Generic methods -> Wireless and Bluetooth * + # ******************************************************************************** + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # ************************************************************************************ + # Bluetooth methods - All methods for bluetooth services * + # ************************************************************************************ + + # fast way to create a simple server + def bt_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bt_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bt_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bt_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device port + def bt_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search device services + def bt_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bt_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # *********************************************************************************** + # Wireless method - All methods for wireless services * + # *********************************************************************************** diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.pyc b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.pyc new file mode 100755 index 0000000..2226bd9 Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.pyc differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..7b94774 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Version : 0.1 +# Description : Tablet Application Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + def __init__(self): + GenericConnectionManager.__init__(self) + #para acessar facilmente qualquer metodo generico + #self.super = generico() + print "init do Wireless" + self.tipo = "wireless" + + def metodo(self): + print "(Wireless)Metodo do", self.tipo + + diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc new file mode 100755 index 0000000..06563ae Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/edje_objects.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/edje_objects.py new file mode 100755 index 0000000..a60e663 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/edje_objects.py @@ -0,0 +1,320 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +import thread +import ecore +import ecore.evas +import evas.decorators +import edje +import edje.decorators +import time +from connection.iconnection import Iconnection +from kineticlist import * + +class EvasCanvas(object): + + def __init__(self, fullscreen, engine, size): + #f = ecore.evas.SoftwareX11 + self.evas_obj = engine(w=size[0], h=size[1]) + self.evas_obj.callback_delete_request = self.on_delete_request + self.evas_obj.callback_resize = self.on_resize + + self.evas_obj.title = "PCRemote" + self.evas_obj.name_class = ('PC Remote', 'main') + self.evas_obj.fullscreen = fullscreen + self.evas_obj.size = size + self.evas_obj.show() + + def on_resize(self, evas_obj): + x, y, w, h = evas_obj.evas.viewport + size = (w, h) + for key in evas_obj.data.keys(): + evas_obj.data[key].size = size + + def on_delete_request(self, evas_obj): + ecore.main_loop_quit() + + def show(self): + self.evas_obj.show() + +class EdjeObject(edje.Edje): + + def __init__(self, canvas_class, file, group='main',name='edje'): + self.canvas_class = canvas_class + self.x11 = canvas_class.evas_obj + self.canvas = self.x11.evas + edje.Edje.__init__(self, self.canvas, file = file, group = group) + self.size = self.canvas.size + self.x11.data[name] = self + +class MainScreen(EdjeObject): + + def __init__(self, canvas, file, group, name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + + self.file = file + self.on_key_down_add(self.key_down_cb, self.x11) + self.sock_address = None + #flag that sync the discovery device's thread + self.flag = False + #flag that sync the connecting device's thread + self.connecting_flag = False + #lista de dispositivos descobertos + self.lista_dispositivos = [] + #objeto que cria a conexao bluetooth + self.conexao = connection + self.kineticlist = False + #portela mock object + self.lista_teste = ['Andre Portela', 'Juliana Dias', 'Victor Hugo', 'Lucina Dias', 'Rosa Dias', 'James Italiano', 'Nona Izvi', 'Fergus Mao', 'Mauricio Brilhante', 'Edward Ordonez', 'Brankinhu', 'Banco Real', 'Banco Itaú', 'ABN-AMRO BANK'] + + def key_down_cb(self, bg, event, ee): + k = event.key + if k == "Escape": + ecore.main_loop_quit() + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + print "-" + elif k == "F7": + print "+" + + def mkKineticList(self): + #kinetic list (the item values are tied with the part "item_background" of the "list_item" group) + #self.kineticlist = KineticList(self.canvas, file=self.file, item_width=407, item_height=38, father=self) + self.kineticlist = KineticList(self.canvas, file=self.file, item_height=57, father=self) + self.kineticlist.freeze() + #portela - test kinetic list with several devices + #for item in self.lista_teste: + #populates the list with the device's names + for item in self.lista_dispositivos: + self.kineticlist.row_add(item) + #reorganize and draw the list + self.kineticlist.thaw() + #embed the list in the edje object + self.part_swallow("list", self.kineticlist); + + @edje.decorators.signal_callback("connect_to","choice") + def connect_to(self, emission, source): + self.sock_address = self.part_text_get(source) + #flag that sync the connecting device's thread + self.connecting_flag = False + self.signal_emit("start","device_connect") + thread.start_new_thread(MainScreen.threaded_connection,(self,)) + + def threaded_connection(self): + self.conexao.create_socket('l2cap') + print 'connecting to: %s' % self.sock_address + self.conexao.set_address(self.conexao.bt_find_device_address_by_name(self.sock_address)) + self.conexao.set_port(0x1001) + self.conexao.connect() + self.connecting_flag = True + + @edje.decorators.signal_callback("connecting","device") + def connecting_check(self, emission, source): + if self.connecting_flag: + self.connecting_flag = False + self.signal_emit("stop","device_connect") + #we are sending a signal to main edje (there is time to animate the device locking) + self.signal_emit("begin","init") + + @edje.decorators.signal_callback("animation_still_loading", "loading") + def still_loading_cb(self, emission, source): + if self.flag: + self.flag = False + self.signal_emit("program,stop","loading") + if self.lista_dispositivos != []: + self.mkKineticList() + else: + self.no_device_found() + + @edje.decorators.signal_callback("animation_sair_ended", "sair") + def saida(self, signal, source): + ecore.main_loop_quit() + + @edje.decorators.signal_callback("animation_rastrear_ended", "rastrear") + def rastrear_key_down(self, signal, source): + thread.start_new_thread(MainScreen.rastrear_dispositivos,(self,None)) + + @edje.decorators.signal_callback("program,start", "novodevice") + def search_devices_again(self, signal, source): + self.part_unswallow(self.kineticlist) + del self.kineticlist + MainScreen.rastrear_key_down(self, None, None) + + def rastrear_dispositivos(self,arg): + try: + self.lista_dispositivos = self.conexao.bt_find_devices_only_names() + except: + self.lista_dispositivos = [] + self.flag = True + + def no_device_found(self): + self.signal_emit("program,start","no_device") + +class TabletScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + self.key_flag = False + + @edje.decorators.signal_callback('mouse,down,1', 'tablet_bt-L_area') + def left_click_down(self, signal, source): + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-L_area') + def left_click_up(self, signal, source): + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-R_area') + def rigth_click(self, signal, source): + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Tablet:#stop") + self.sock.close() + ecore.main_loop_quit() + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + elif k == "Return": + self.sock.send_message("Keyboard:Alt+F1") + elif k == "ISO_Level3_Shift": + self.sock.send_message("Keyboard:Alt+F2") + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) + +class SlideScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #helps to coordenate presentation + self.keyboard_flag = True + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + + @edje.decorators.signal_callback('mouse,down,1', 'slide_bt-left_area') + def left_click_down(self, signal, source): + if self.keyboard_flag: + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-left_area') + def left_click_up(self, signal, source): + if self.keyboard_flag: + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + else: + self.sock.send_message("Keyboard:%s" % "Left") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-right_area') + def rigth_click(self, signal, source): + if self.keyboard_flag: + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + else: + self.sock.send_message("Keyboard:%s" % "Right") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Slideshow:#stop") + self.sock.close() + ecore.main_loop_quit() + elif k == "F6": + self.keyboard_flag = not self.keyboard_flag + self.sock.send_message("Keyboard:F5") + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/kineticlist.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/kineticlist.py new file mode 100755 index 0000000..4234176 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/kineticlist.py @@ -0,0 +1,400 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Gustavo Sverzut Barbieri ; André Luiz do Canto Portela +# Email :barbieri@gmail.com ; andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :This class are an adaptation of barbieri's demo 03 of edje +# :python-bindings +# ============================================================================ + +import evas +import edje +import ecore +import time + +class KineticList(evas.ClippedSmartObject): + ( + SCROLL_PAGE_FORWARD, + SCROLL_PAGE_BACKWARD, + SCROLL_STEP_FORWARD, + SCROLL_STEP_BACKWARD, + SCROLL_PIXELS_DOWN, + SCROLL_PIXELS_UP + ) = range(6) + + + def __init__(self, ecanvas, file, item_width=-1, item_height=-1, father=None): + ''' + if item_width or item_height is left out the width (resp. height) + of the List element is used. + ''' + self.father = father + evas.ClippedSmartObject.__init__(self, ecanvas) + self.elements = [] + self.objects = [] + self.w = 32 + self.h = 32 + + self.realized = False + + self.top_pos = 0 + self.last_top_pos = 0 + self.last_start_row = -1 + + self.canvas = ecanvas + self.edje_file = file + + self.row_width = item_width + self.row_height = item_height + + self.__manage_objects() + + self.mouse_down = False + self.last_y_pos = 0 + self.start_pos = 0 + self.mouse_moved = False + self.continue_scrolling = False + self.is_scrolling = False + self.do_freeze = False + + def freeze(self): + self.do_freeze = True + + def thaw(self): + self.do_freeze = False + if self.realized: + self.__update_variables_after_new_elements() + self.__update_screen() + + def scroll(self, scroll_type, amount=1): + self.continue_scrolling = False + + if scroll_type == self.SCROLL_PAGE_FORWARD: + self.top_pos += amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_PAGE_BACKWARD: + self.top_pos -= amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_STEP_FORWARD: + self.top_pos += amount * self.row_height + elif scroll_type == self.SCROLL_STEP_BACKWARD: + self.top_pos -= amount * self.row_height + elif scroll_type == self.SCROLL_PIXELS_DOWN: + self.top_pos += amount + elif scroll_type == self.SCROLL_PIXELS_UP: + self.top_pos -= amount + else: + return + + self.__update_screen() + + def __on_mouse_clicked(self, edje_obj, emission, source, data=None): + #for obj in self.objects: + # if obj != edje_obj: + # obj.signal_emit("fadeout", "") + + #edje_obj.signal_emit("open", "") + #TODO:portela - it works! :D + edje_obj.signal_emit("program,start","label") + #we are setting up the choice's text on the main edje object + self.parent_get().part_text_set("choice",edje_obj.part_text_get("label")) + + def __on_mouse_move(self, edje_obj, emission, source, data=None): + if self.mouse_down: + x_pos, y_pos = self.canvas.pointer_canvas_xy + diff = int(self.last_y_pos - y_pos) + + if diff == 0: + return + + self.mouse_moved = True + + # Reset the data if the direction of the mouse move is changed + if self.last_diff != -1 and (diff < 0) != (self.last_diff < 0): + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + + self.last_diff = diff + self.top_pos += diff + + self.last_y_pos = y_pos + self.__update_screen() + self.last_update_time = time.time() + + #TODO: portela mod + def __on_blink_ended(self, edje_obj, emission, source, data=None): + for obj in self.objects: + obj.signal_emit("program,start,fade,out","label") + #we are sending a signal for the application connect the target + self.parent_get().signal_emit("connect_to","choice") + + #TODO: portela mod + + def show_list(self): + for obj in self.objects: + obj.signal_emit("program,start,fade,in","label") + + def __on_mouse_down(self, edje_obj, emission, source, data=None): + if not self.is_scrolling: + self.mouse_moved = False + + self.continue_scrolling = False + self.mouse_down = True + + x_pos, y_pos = self.canvas.pointer_canvas_xy + + self.last_diff = -1 + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + self.last_update_time = time.time() + + def __on_mouse_up(self, edje_obj, emission, source, data=None): + if self.mouse_down: + self.mouse_down = False + + x_pos, end_pos = self.canvas.pointer_canvas_xy + + if not self.mouse_moved and not self.is_scrolling: + #self.__on_mouse_clicked(edje_obj, emission, source) + return + + self.mouse_moved = False + self.is_scrolling = False + + # do not scroll automatically if the finger was paused + if time.time() - self.last_update_time > 0.1: + return + + end_time = time.time() + + pos_diff = end_pos - self.start_pos + time_diff = end_time - self.start_time + + self.pixel_per_sec = pos_diff / time_diff + self.continue_scrolling = True + self.__do_scroll() + + def __do_scroll(self): + self.is_scrolling = True + + if self.continue_scrolling == False: + return + + diff = int(self.pixel_per_sec / 10) + + if abs(self.pixel_per_sec) - diff <= self.row_height: + offset = self.top_pos % self.row_height + + if offset >= self.row_height / 2: + self.sign = 1 + offset = self.row_height - offset + else: + self.sign = -1 + + self.pixels_left = offset + self.__do_magnetic_scroll() + + return + + if diff != 0: + self.top_pos -= diff + self.pixel_per_sec -= self.pixel_per_sec / 10 + self.__update_screen() + + ecore.timer_add(0.02, self.__do_scroll) + + def __do_magnetic_scroll(self): + if self.pixels_left <= 0 or abs(self.pixel_per_sec) < 1: + self.mouse_moved = False + self.is_scrolling = False + return + + self.pixel_per_sec -= (self.pixel_per_sec / 10) + + pixels_to_substract = int(abs(self.pixel_per_sec / 10)) + if abs(pixels_to_substract) < 1: + pixels_to_substract = 1 + + if self.pixels_left - pixels_to_substract > 0: + self.pixels_left -= pixels_to_substract + self.top_pos += self.sign * pixels_to_substract + else: + self.top_pos += self.sign * self.pixels_left + self.pixels_left = 0 + + self.__update_screen() + ecore.timer_add(0.1, self.__do_magnetic_scroll) + + def row_add(self, label): + self.elements.append(label) + + if not self.do_freeze: + self.__update_variables_after_new_elements() + self.__update_screen() + + def __manage_objects(self): + remain = (self.h % self.row_height) > 1 + needed_objects = ((self.h / self.row_height) + 1 + remain) * (self.w / self.row_width) + current_objects = len(self.objects) + + if current_objects < needed_objects: + for i in range(current_objects, needed_objects): + obj = edje.Edje(self.canvas); + obj.file_set(self.edje_file, "list_item"); + + obj.signal_callback_add("mouse,move", "*", + self.__on_mouse_move) + obj.signal_callback_add("mouse,down,*", "*", + self.__on_mouse_down) + obj.signal_callback_add("mouse,up,*", "*", + self.__on_mouse_up) + #TODO: portela mod + obj.signal_callback_add("animation_blink_ended", "label", + self.__on_blink_ended) + obj.signal_callback_add("mouse,clicked,*", "label", + self.__on_mouse_clicked) + obj.size = (self.row_width, self.row_height) + obj.clip = self + self.objects.append(obj) + + elif needed_objects < current_objects: + for i in range(needed_objects, current_objects): + pass # Make this work, it throws exception that makes + # things stop working properly + #del self.objects[i] + + def __update_variables_after_resize(self): + self.max_visible_rows = (self.h / self.row_height) + 1 + self.max_horiz_elements = (self.w / self.row_width) + self.max_visible_elements = self.max_visible_rows * \ + self.max_horiz_elements + + # Invalidate variable in order to repaint all rows + # Some might not have been painted before (Didn't + # fit on the screen + self.last_start_row = -1 + + self.__update_variables_after_new_elements() + + def __update_variables_after_new_elements(self): + if not self.realized: + return + + self.min_pos = 0 + remainer1 = (len(self.elements) % self.max_horiz_elements) > 0 + remainer2 = (self.h % self.row_height) > 0 + self.row_amount = (len(self.elements) / self.max_horiz_elements) + \ + remainer1 + remainer2 + self.max_pos = self.row_height * \ + (self.row_amount - self.max_visible_rows + 1) + + def __update_screen(self): + remainer = (self.h % self.row_height) > 0 + row_offset = (self.top_pos / self.row_height) + pixel_offset = - (self.top_pos % self.row_height) + start_row = row_offset + end_row = self.max_visible_rows + row_offset + remainer + + SCROLL_DOWN = self.top_pos > self.last_top_pos + SCROLL_UP = self.top_pos < self.last_top_pos + + # Let's not move over the last element + if SCROLL_DOWN and self.last_top_pos >= self.max_pos: + self.top_pos = self.max_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Let's not move over the first element + if SCROLL_UP and self.last_top_pos <= self.min_pos: + self.top_pos = self.min_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Overflow scrolling down + if SCROLL_DOWN and end_row > self.row_amount: + offset = end_row - self.row_amount + end_row -= offset + start_row -= offset + row_offset -= offset - 1 + self.top_pos = self.max_pos + pixel_offset = 0 + + # Overflow scrolling up + if SCROLL_UP and start_row < 0: + self.top_pos = self.min_pos + end_row -= start_row + start_row = 0 + row_offset = 0 + pixel_offset = 0 + + self.last_top_pos = self.top_pos + + if start_row != self.last_start_row: + for i in range(0, len(self.objects)): + self.objects[i].hide() + + for i in range(start_row, end_row): + row_iter = i - start_row + + for k in range(self.max_horiz_elements): + obj_iter = row_iter * self.max_horiz_elements + k + data_iter = i * self.max_horiz_elements + k + + try: + label = self.elements[data_iter] + except Exception, e: + break; + + offset = (self.w % + (self.row_width * self.max_horiz_elements)) / 2 + x = self.row_width * k + self.top_left[0] + offset + y = self.top_left[1] + self.row_height * (i - row_offset) - \ + 5 + pixel_offset + + self.objects[obj_iter].move(x, y) + + if start_row != self.last_start_row: + self.objects[obj_iter].part_text_set("label", label) + self.objects[obj_iter].show() + + self.last_start_row = start_row + + def resize(self, w, h): + if self.row_width == -1 or self.row_width == self.w: + self.row_width = w + + if self.row_height == -1 or self.row_height == self.h: + self.row_height = h + + self.w = w + self.h = h + + self.__manage_objects() + + for obj in self.objects: + obj.size = (self.row_width, self.row_height) + + self.realized = True + self.__update_variables_after_resize() + self.__update_screen() diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/pcremote-client.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/pcremote-client.py new file mode 100755 index 0000000..14e5a9e --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/pcremote-client.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 Zagaia - INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Andre Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +from ecore import main_loop_begin +import ecore.evas +import sys +import os +from edje_objects import * +from connection.iconnection import Iconnection +from screenmanager import ScreenManager + +width, height = 800, 480 + +#any argument deactivates fullscreen +if sys.argv.__len__() > 1: + screen = False +else: + screen = True +#if x11_16 is present, get it, otherwise get x11 +if ecore.evas.engine_type_supported_get("software_x11_16"): + engine = ecore.evas.SoftwareX11_16 +else: + engine = ecore.evas.SoftwareX11 +#create the evas canvas +canvas = EvasCanvas(fullscreen=screen,engine=engine,size=(width, height)) +#main .edj path +edje_file = os.path.join(os.path.dirname(sys.argv[0]), "pcremote.edj") +#the bluetooth socket object shared by all screens +sock = Iconnection('bluetooth') +#main edje object +main = MainScreen(canvas=canvas, file=edje_file, group="Main",name="Main", connection = sock) +main.show() +#future edje objects +tablet, slide, player, torrent = None, None, None, None +#focus on main edje object +main.focus = True +#this object connects all screens together +manager = ScreenManager(main, tablet, slide, player, torrent, sock) + +ecore.main_loop_begin() + diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/pcremote.edj b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/pcremote.edj new file mode 100755 index 0000000..ce5640f Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/pcremote.edj differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/screenmanager.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/screenmanager.py new file mode 100755 index 0000000..367f17b --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/screenmanager.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote ScreenManager handles the finite state machine which +# controls the navigation between screens. +# ============================================================================ + +from edje_objects import * +import os +import sys + +class ScreenManager(object): + ''' + classdocs + ''' + def __init__(self, main, tablet, slide, player, torrent,socket): + ''' + Constructor + ''' + self.main = main + self.tablet = tablet + self.slide = slide + self.player = player + self.torrent = torrent + self.sock = socket + main.signal_callback_add("mouse,up,1", "Tablet",self.run_tablet) + main.signal_callback_add("mouse,up,1", "Slideshow",self.run_slide) + main.signal_callback_add("mouse,up,1", "Player",self.run_player) + main.signal_callback_add("mouse,up,1", "Torrent",self.run_torrent) + + def run_tablet(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no tablet' + #main edje object + edje.focus_set(False) + edje.hide() + if self.tablet is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "tablet.edj") + self.tablet = TabletScreen(edje.canvas_class, edje_file, 'main', 'tablet', self.sock) + self.tablet.signal_callback_add("mouse,up,1","tablet_bt-voltar_area",self.tablet_back) + self.tablet.part_text_set('pc_name',edje.sock_address) + self.tablet.show() + self.tablet.focus_set(True) + + def tablet_back(self, edje, emission, source): + #tablet edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Tablet:#stop") + self.main.show() + self.main.focus_set(True) + + def run_slide(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no slide' + #main edje object + edje.focus_set(False) + edje.hide() + if self.slide is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "slide.edj") + self.slide = SlideScreen(edje.canvas_class, edje_file, 'main', 'slide', self.sock) + self.slide.signal_callback_add("unselected","slide_bt-voltar",self.slide_back) + #self.slide.part_text_set('pc_name',edje.sock_address) + #this rotates the screen 90 degrees (to fit text in vertical orientation) + #self.slide.x11.rotation_set(90) + self.slide.show() + self.slide.focus_set(True) + + def slide_back(self, edje, emission, source): + #slide edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Slideshow:#stop") + #this rotates the screen from 90 to 0 degrees (to fit text in horizontal orientation again) + #self.main.x11.rotation_set(0) + self.main.show() + self.main.focus_set(True) + + def run_player(self, edje, emission, source): + print 'not implemented yet' + + def player_back(self, edje, emission, source): + print 'not implemented yet' + + def run_torrent(self, edje, emission, source): + print 'not implemented yet' + + def torrent_back(self, edje, emission, source): + print 'not implemented yet' + diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/slide.edj b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/slide.edj new file mode 100755 index 0000000..d4e3119 Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/slide.edj differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/tablet.edj b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/tablet.edj new file mode 100755 index 0000000..b50a7e4 Binary files /dev/null and b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/tablet.edj differ diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/utils/__init__.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/utils/labels.py b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/utils/labels.py new file mode 100755 index 0000000..dd12186 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/pcremote-client/usr/share/pcremote-client/utils/labels.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + + +# GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + +PLAY = "#play" +STOP = "#stop" +PAUSE = "#pause" +NEXT = "#next" +PREVIOUS = "#previous" +VOL_UP = "#vol_up" +VOL_DOWN = "#vol_down" +TLINE_LEFT = "#tline_left" +TLINE_RIGHT = "#tline_right" +RECORD = "#record" +#------------------------------------------> + +# GENERIC LABELS FOR APPLICATIONS + +START = "#start" +CLOSE = "#close" +FULL = "#fullscreen" +UPLOAD = "#upload" +DOWNLOAD = "#download" +SAVE = "#save" +DELETE = "#delete" +#--------------------------------> + +# GENERAL MOUSE LABELS + +CLICK = "#click" +DOUBLE_CLICK = "#double_click" +TRIPLE_CLICK = "#triple_click" +LEFT_CLICK = "#left_click" +RIGHT_CLICK = "#right_click" +MIDDLE_CLICK = "#middle_click" +#--------------------------------> + + diff --git a/pcremote-client-n8x0-60/debian/postinst b/pcremote-client-n8x0-60/debian/postinst new file mode 100755 index 0000000..8204dd4 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/postinst @@ -0,0 +1,5 @@ +#!/bin/sh -e + +gtk-update-icon-cache -f /usr/share/icons/hicolor +maemo-select-menu-location pcremote-client.desktop + diff --git a/pcremote-client-n8x0-60/debian/prerm b/pcremote-client-n8x0-60/debian/prerm new file mode 100755 index 0000000..72123fe --- /dev/null +++ b/pcremote-client-n8x0-60/debian/prerm @@ -0,0 +1,15 @@ +#!/bin/sh -e + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/hildon/pcremote-client.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-client + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-client + + +exit 0 diff --git a/pcremote-client-n8x0-60/debian/rules b/pcremote-client-n8x0-60/debian/rules new file mode 100755 index 0000000..9e84358 --- /dev/null +++ b/pcremote-client-n8x0-60/debian/rules @@ -0,0 +1,90 @@ +#!/usr/bin/make -f + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + ##$(MAKE) + #docbook-to-man debian/pcremote-client.sgml > pcremote-client.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + dh_clean + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/pcremote-client. + #$(MAKE) install DESTDIR=$(CURDIR)/debian/pcremote-client + mkdir -p $(CURDIR)/debian/pcremote-client + + ###insert your commands here + cp *.py *.edj $(CURDIR)/debian/pcremote-client/usr/share/pcremote-client + cp -r connection/ $(CURDIR)/debian/pcremote-client/usr/share/pcremote-client + cp -r utils/ $(CURDIR)/debian/pcremote-client/usr/share/pcremote-client + cp pcremote26.png $(CURDIR)/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png + + ### Installing menufile + # copy the file with the menu entry into /usr/share/applications + cp pcremote-client.desktop $(CURDIR)/debian/pcremote-client/usr/share/applications/hildon + cp pcremote-client $(CURDIR)/debian/pcremote-client/usr/bin + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/pcremote-client-n8x0-60/edje_objects.py b/pcremote-client-n8x0-60/edje_objects.py new file mode 100755 index 0000000..1cd5244 --- /dev/null +++ b/pcremote-client-n8x0-60/edje_objects.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +import thread +import ecore +import ecore.evas +import evas.decorators +import edje +import edje.decorators +import time +from connection.iconnection import Iconnection +from kineticlist import * + +class EvasCanvas(object): + + def __init__(self, fullscreen, engine, size): + #f = ecore.evas.SoftwareX11 + self.evas_obj = engine(w=size[0], h=size[1]) + self.evas_obj.callback_delete_request = self.on_delete_request + self.evas_obj.callback_resize = self.on_resize + + self.evas_obj.title = "PCRemote" + self.evas_obj.name_class = ('PC Remote', 'main') + self.evas_obj.fullscreen = fullscreen + self.evas_obj.size = size + self.evas_obj.show() + + def on_resize(self, evas_obj): + x, y, w, h = evas_obj.evas.viewport + size = (w, h) + for key in evas_obj.data.keys(): + evas_obj.data[key].size = size + + def on_delete_request(self, evas_obj): + ecore.main_loop_quit() + + def show(self): + self.evas_obj.show() + +class EdjeObject(edje.Edje): + + def __init__(self, canvas_class, file, group='main',name='edje'): + self.canvas_class = canvas_class + self.x11 = canvas_class.evas_obj + self.canvas = self.x11.evas + edje.Edje.__init__(self, self.canvas, file = file, group = group) + self.size = self.canvas.size + self.x11.data[name] = self + +class MainScreen(EdjeObject): + + def __init__(self, canvas, file, group, name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + + self.file = file + self.on_key_down_add(self.key_down_cb, self.x11) + self.sock_address = None + #flag that sync the discovery device's thread + self.flag = False + #flag that sync the connecting device's thread + self.connecting_flag = False + #lista de dispositivos descobertos + self.lista_dispositivos = [] + #objeto que cria a conexao bluetooth + self.conexao = connection + self.kineticlist = False + #portela mock object + self.lista_teste = ['Andre Portela', 'Juliana Dias', 'Victor Hugo', 'Lucina Dias', 'Rosa Dias', 'James Italiano', 'Nona Izvi', 'Fergus Mao', 'Mauricio Brilhante', 'Edward Ordonez', 'Brankinhu', 'Banco Real', 'Banco Itaú', 'ABN-AMRO BANK'] + + def key_down_cb(self, bg, event, ee): + k = event.key + if k == "Escape": + ecore.main_loop_quit() + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + print "-" + elif k == "F7": + print "+" + + def mkKineticList(self): + #kinetic list (the item values are tied with the part "item_background" of the "list_item" group) + #self.kineticlist = KineticList(self.canvas, file=self.file, item_width=407, item_height=38, father=self) + self.kineticlist = KineticList(self.canvas, file=self.file, item_height=57, father=self) + self.kineticlist.freeze() + #portela - test kinetic list with several devices + #for item in self.lista_teste: + #populates the list with the device's names + for item in self.lista_dispositivos: + self.kineticlist.row_add(item) + #reorganize and draw the list + self.kineticlist.thaw() + #embed the list in the edje object + self.part_swallow("list", self.kineticlist); + + @edje.decorators.signal_callback("connect_to","choice") + def connect_to(self, emission, source): + self.sock_address = self.part_text_get(source) + #flag that sync the connecting device's thread + self.connecting_flag = False + self.signal_emit("start","device_connect") + thread.start_new_thread(MainScreen.threaded_connection,(self,)) + + def threaded_connection(self): + self.conexao.create_socket('l2cap') + print 'connecting to: %s' % self.sock_address + self.conexao.set_address(self.conexao.bt_find_device_address_by_name(self.sock_address)) + self.conexao.set_port(0x1001) + self.conexao.connect() + self.connecting_flag = True + + @edje.decorators.signal_callback("connecting","device") + def connecting_check(self, emission, source): + if self.connecting_flag: + self.connecting_flag = False + self.signal_emit("stop","device_connect") + #we are sending a signal to main edje (there is time to animate the device locking) + self.signal_emit("begin","init") + + @edje.decorators.signal_callback("animation_still_loading", "loading") + def still_loading_cb(self, emission, source): + if self.flag: + self.flag = False + self.signal_emit("program,stop","loading") + if self.lista_dispositivos != []: + self.mkKineticList() + else: + self.no_device_found() + + @edje.decorators.signal_callback("animation_sair_ended", "sair") + def saida(self, signal, source): + ecore.main_loop_quit() + + @edje.decorators.signal_callback("animation_rastrear_ended", "rastrear") + def rastrear_key_down(self, signal, source): + thread.start_new_thread(MainScreen.rastrear_dispositivos,(self,None)) + + @edje.decorators.signal_callback("program,start", "novodevice") + def search_devices_again(self, signal, source): + self.part_unswallow(self.kineticlist) + del self.kineticlist + MainScreen.rastrear_key_down(self, None, None) + + def rastrear_dispositivos(self,arg): + try: + self.lista_dispositivos = self.conexao.bt_find_devices_only_names() + except: + self.lista_dispositivos = [] + self.flag = True + + def no_device_found(self): + self.signal_emit("program,start","no_device") + +class TabletScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + #tecla alt + self.alt_flag = False + #tecla shift + self.iso_shift_flag = False + #lista de aliases das teclas de comando Alt+F(x) + #self.fletters = ['p', 'q', 'w', '', 'r', '', '', '', '', 'o'] + self.keys_dict = {'q':1, 'w':2, 'e':3, 'r':4, 't':5, 'y':6, 'u':7, 'i':8, 'o':9, 'p':0, \ + 'a':'Shift_L+1', 's':'', 'd':'Shift_L+2', 'f':'Shift_L+3', 'g':'backslash', \ + 'h':'slash', 'j':'Shift_L+9', 'k': 'Shift_L+0', 'l':'Shift_L+8', '\'':'Shift_L+slash',\ + 'z':'', 'x':'Shift_L+6', 'c':'', 'v':'Shift_L+5', 'b':'Shift_L+7', 'n':'Shift_L+4', \ + 'm':'', ';':'', '-':'Shift_L+minus', '+':'equal'} + + @edje.decorators.signal_callback('mouse,down,1', 'tablet_bt-L_area') + def left_click_down(self, signal, source): + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-L_area') + def left_click_up(self, signal, source): + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-R_area') + def rigth_click(self, signal, source): + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Keyboard:Escape") + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + elif k == "Return": + self.alt_flag = True + elif k == "ISO_Level3_Shift": + self.iso_shift_flag = True + else: + if self.alt_flag: + #if k in self.fletters: + # self.sock.send_message("Keyboard:Alt+F%s" % (self.fletters.index(k))) + # self.alt_flag = False + #elif k == 'space': + # self.sock.send_message("Keyboard:Alt+Space") + # self.alt_flag = False + #else: + # self.alt_flag = False + if self.keys_dict.has_key(k) and isinstance(self.keys_dict[k], int): + self.sock.send_message("Keyboard:Alt_L") + self.sock.send_message("Keyboard:F%s" % (self.keys_dict[k])) + self.alt_flag = False + elif k == 'space': + self.sock.send_message("Keyboard:Alt_L") + self.sock.send_message("Keyboard:space") + self.alt_flag = False + else: + self.alt_flag = False + #else: + #self.sock.send_message("Keyboard:%s" % k) + elif self.iso_shift_flag: + if self.keys_dict.has_key(k) and self.keys_dict[k] and isinstance(self.keys_dict[k], str): + lst = self.keys_dict[k].split('+') + for cmd in lst: + self.sock.send_message("Keyboard:%s" % cmd) + self.iso_shift_flag = False + elif self.keys_dict.has_key(k) and self.keys_dict and isinstance(self.keys_dict[k], int): + self.sock.send_message("Keyboard:%s" % self.keys_dict[k]) + self.iso_shift_flag = False + else: + self.iso_shift_flag = False + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) + +class SlideScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #helps to coordenate presentation + self.keyboard_flag = True + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + + @edje.decorators.signal_callback('mouse,down,1', 'slide_bt-left_area') + def left_click_down(self, signal, source): + if self.keyboard_flag: + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-left_area') + def left_click_up(self, signal, source): + if self.keyboard_flag: + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + else: + self.sock.send_message("Keyboard:%s" % "Left") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-right_area') + def rigth_click(self, signal, source): + if self.keyboard_flag: + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + else: + self.sock.send_message("Keyboard:%s" % "Right") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Keyboard:Escape") + elif k == "F6": + self.keyboard_flag = not self.keyboard_flag + self.sock.send_message("Keyboard:F5") + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) diff --git a/pcremote-client-n8x0-60/kineticlist.py b/pcremote-client-n8x0-60/kineticlist.py new file mode 100755 index 0000000..4234176 --- /dev/null +++ b/pcremote-client-n8x0-60/kineticlist.py @@ -0,0 +1,400 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Gustavo Sverzut Barbieri ; André Luiz do Canto Portela +# Email :barbieri@gmail.com ; andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :This class are an adaptation of barbieri's demo 03 of edje +# :python-bindings +# ============================================================================ + +import evas +import edje +import ecore +import time + +class KineticList(evas.ClippedSmartObject): + ( + SCROLL_PAGE_FORWARD, + SCROLL_PAGE_BACKWARD, + SCROLL_STEP_FORWARD, + SCROLL_STEP_BACKWARD, + SCROLL_PIXELS_DOWN, + SCROLL_PIXELS_UP + ) = range(6) + + + def __init__(self, ecanvas, file, item_width=-1, item_height=-1, father=None): + ''' + if item_width or item_height is left out the width (resp. height) + of the List element is used. + ''' + self.father = father + evas.ClippedSmartObject.__init__(self, ecanvas) + self.elements = [] + self.objects = [] + self.w = 32 + self.h = 32 + + self.realized = False + + self.top_pos = 0 + self.last_top_pos = 0 + self.last_start_row = -1 + + self.canvas = ecanvas + self.edje_file = file + + self.row_width = item_width + self.row_height = item_height + + self.__manage_objects() + + self.mouse_down = False + self.last_y_pos = 0 + self.start_pos = 0 + self.mouse_moved = False + self.continue_scrolling = False + self.is_scrolling = False + self.do_freeze = False + + def freeze(self): + self.do_freeze = True + + def thaw(self): + self.do_freeze = False + if self.realized: + self.__update_variables_after_new_elements() + self.__update_screen() + + def scroll(self, scroll_type, amount=1): + self.continue_scrolling = False + + if scroll_type == self.SCROLL_PAGE_FORWARD: + self.top_pos += amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_PAGE_BACKWARD: + self.top_pos -= amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_STEP_FORWARD: + self.top_pos += amount * self.row_height + elif scroll_type == self.SCROLL_STEP_BACKWARD: + self.top_pos -= amount * self.row_height + elif scroll_type == self.SCROLL_PIXELS_DOWN: + self.top_pos += amount + elif scroll_type == self.SCROLL_PIXELS_UP: + self.top_pos -= amount + else: + return + + self.__update_screen() + + def __on_mouse_clicked(self, edje_obj, emission, source, data=None): + #for obj in self.objects: + # if obj != edje_obj: + # obj.signal_emit("fadeout", "") + + #edje_obj.signal_emit("open", "") + #TODO:portela - it works! :D + edje_obj.signal_emit("program,start","label") + #we are setting up the choice's text on the main edje object + self.parent_get().part_text_set("choice",edje_obj.part_text_get("label")) + + def __on_mouse_move(self, edje_obj, emission, source, data=None): + if self.mouse_down: + x_pos, y_pos = self.canvas.pointer_canvas_xy + diff = int(self.last_y_pos - y_pos) + + if diff == 0: + return + + self.mouse_moved = True + + # Reset the data if the direction of the mouse move is changed + if self.last_diff != -1 and (diff < 0) != (self.last_diff < 0): + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + + self.last_diff = diff + self.top_pos += diff + + self.last_y_pos = y_pos + self.__update_screen() + self.last_update_time = time.time() + + #TODO: portela mod + def __on_blink_ended(self, edje_obj, emission, source, data=None): + for obj in self.objects: + obj.signal_emit("program,start,fade,out","label") + #we are sending a signal for the application connect the target + self.parent_get().signal_emit("connect_to","choice") + + #TODO: portela mod + + def show_list(self): + for obj in self.objects: + obj.signal_emit("program,start,fade,in","label") + + def __on_mouse_down(self, edje_obj, emission, source, data=None): + if not self.is_scrolling: + self.mouse_moved = False + + self.continue_scrolling = False + self.mouse_down = True + + x_pos, y_pos = self.canvas.pointer_canvas_xy + + self.last_diff = -1 + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + self.last_update_time = time.time() + + def __on_mouse_up(self, edje_obj, emission, source, data=None): + if self.mouse_down: + self.mouse_down = False + + x_pos, end_pos = self.canvas.pointer_canvas_xy + + if not self.mouse_moved and not self.is_scrolling: + #self.__on_mouse_clicked(edje_obj, emission, source) + return + + self.mouse_moved = False + self.is_scrolling = False + + # do not scroll automatically if the finger was paused + if time.time() - self.last_update_time > 0.1: + return + + end_time = time.time() + + pos_diff = end_pos - self.start_pos + time_diff = end_time - self.start_time + + self.pixel_per_sec = pos_diff / time_diff + self.continue_scrolling = True + self.__do_scroll() + + def __do_scroll(self): + self.is_scrolling = True + + if self.continue_scrolling == False: + return + + diff = int(self.pixel_per_sec / 10) + + if abs(self.pixel_per_sec) - diff <= self.row_height: + offset = self.top_pos % self.row_height + + if offset >= self.row_height / 2: + self.sign = 1 + offset = self.row_height - offset + else: + self.sign = -1 + + self.pixels_left = offset + self.__do_magnetic_scroll() + + return + + if diff != 0: + self.top_pos -= diff + self.pixel_per_sec -= self.pixel_per_sec / 10 + self.__update_screen() + + ecore.timer_add(0.02, self.__do_scroll) + + def __do_magnetic_scroll(self): + if self.pixels_left <= 0 or abs(self.pixel_per_sec) < 1: + self.mouse_moved = False + self.is_scrolling = False + return + + self.pixel_per_sec -= (self.pixel_per_sec / 10) + + pixels_to_substract = int(abs(self.pixel_per_sec / 10)) + if abs(pixels_to_substract) < 1: + pixels_to_substract = 1 + + if self.pixels_left - pixels_to_substract > 0: + self.pixels_left -= pixels_to_substract + self.top_pos += self.sign * pixels_to_substract + else: + self.top_pos += self.sign * self.pixels_left + self.pixels_left = 0 + + self.__update_screen() + ecore.timer_add(0.1, self.__do_magnetic_scroll) + + def row_add(self, label): + self.elements.append(label) + + if not self.do_freeze: + self.__update_variables_after_new_elements() + self.__update_screen() + + def __manage_objects(self): + remain = (self.h % self.row_height) > 1 + needed_objects = ((self.h / self.row_height) + 1 + remain) * (self.w / self.row_width) + current_objects = len(self.objects) + + if current_objects < needed_objects: + for i in range(current_objects, needed_objects): + obj = edje.Edje(self.canvas); + obj.file_set(self.edje_file, "list_item"); + + obj.signal_callback_add("mouse,move", "*", + self.__on_mouse_move) + obj.signal_callback_add("mouse,down,*", "*", + self.__on_mouse_down) + obj.signal_callback_add("mouse,up,*", "*", + self.__on_mouse_up) + #TODO: portela mod + obj.signal_callback_add("animation_blink_ended", "label", + self.__on_blink_ended) + obj.signal_callback_add("mouse,clicked,*", "label", + self.__on_mouse_clicked) + obj.size = (self.row_width, self.row_height) + obj.clip = self + self.objects.append(obj) + + elif needed_objects < current_objects: + for i in range(needed_objects, current_objects): + pass # Make this work, it throws exception that makes + # things stop working properly + #del self.objects[i] + + def __update_variables_after_resize(self): + self.max_visible_rows = (self.h / self.row_height) + 1 + self.max_horiz_elements = (self.w / self.row_width) + self.max_visible_elements = self.max_visible_rows * \ + self.max_horiz_elements + + # Invalidate variable in order to repaint all rows + # Some might not have been painted before (Didn't + # fit on the screen + self.last_start_row = -1 + + self.__update_variables_after_new_elements() + + def __update_variables_after_new_elements(self): + if not self.realized: + return + + self.min_pos = 0 + remainer1 = (len(self.elements) % self.max_horiz_elements) > 0 + remainer2 = (self.h % self.row_height) > 0 + self.row_amount = (len(self.elements) / self.max_horiz_elements) + \ + remainer1 + remainer2 + self.max_pos = self.row_height * \ + (self.row_amount - self.max_visible_rows + 1) + + def __update_screen(self): + remainer = (self.h % self.row_height) > 0 + row_offset = (self.top_pos / self.row_height) + pixel_offset = - (self.top_pos % self.row_height) + start_row = row_offset + end_row = self.max_visible_rows + row_offset + remainer + + SCROLL_DOWN = self.top_pos > self.last_top_pos + SCROLL_UP = self.top_pos < self.last_top_pos + + # Let's not move over the last element + if SCROLL_DOWN and self.last_top_pos >= self.max_pos: + self.top_pos = self.max_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Let's not move over the first element + if SCROLL_UP and self.last_top_pos <= self.min_pos: + self.top_pos = self.min_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Overflow scrolling down + if SCROLL_DOWN and end_row > self.row_amount: + offset = end_row - self.row_amount + end_row -= offset + start_row -= offset + row_offset -= offset - 1 + self.top_pos = self.max_pos + pixel_offset = 0 + + # Overflow scrolling up + if SCROLL_UP and start_row < 0: + self.top_pos = self.min_pos + end_row -= start_row + start_row = 0 + row_offset = 0 + pixel_offset = 0 + + self.last_top_pos = self.top_pos + + if start_row != self.last_start_row: + for i in range(0, len(self.objects)): + self.objects[i].hide() + + for i in range(start_row, end_row): + row_iter = i - start_row + + for k in range(self.max_horiz_elements): + obj_iter = row_iter * self.max_horiz_elements + k + data_iter = i * self.max_horiz_elements + k + + try: + label = self.elements[data_iter] + except Exception, e: + break; + + offset = (self.w % + (self.row_width * self.max_horiz_elements)) / 2 + x = self.row_width * k + self.top_left[0] + offset + y = self.top_left[1] + self.row_height * (i - row_offset) - \ + 5 + pixel_offset + + self.objects[obj_iter].move(x, y) + + if start_row != self.last_start_row: + self.objects[obj_iter].part_text_set("label", label) + self.objects[obj_iter].show() + + self.last_start_row = start_row + + def resize(self, w, h): + if self.row_width == -1 or self.row_width == self.w: + self.row_width = w + + if self.row_height == -1 or self.row_height == self.h: + self.row_height = h + + self.w = w + self.h = h + + self.__manage_objects() + + for obj in self.objects: + obj.size = (self.row_width, self.row_height) + + self.realized = True + self.__update_variables_after_resize() + self.__update_screen() diff --git a/pcremote-client-n8x0-60/pcremote-client b/pcremote-client-n8x0-60/pcremote-client new file mode 100755 index 0000000..b28bdfe --- /dev/null +++ b/pcremote-client-n8x0-60/pcremote-client @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-client/pcremote-client.py diff --git a/pcremote-client-n8x0-60/pcremote-client.desktop b/pcremote-client-n8x0-60/pcremote-client.desktop new file mode 100755 index 0000000..f712a0a --- /dev/null +++ b/pcremote-client-n8x0-60/pcremote-client.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.60 +Type=Application +Icon=pcremote +Name=PCRemote Client +Exec=pcremote-client +X-Window-Icon=pcremote +X-Window-Icon-Dimmed=pcremote +Terminal=false +Categories=Application;Network; +StartupNotify=false diff --git a/pcremote-client-n8x0-60/pcremote-client.py b/pcremote-client-n8x0-60/pcremote-client.py new file mode 100755 index 0000000..14e5a9e --- /dev/null +++ b/pcremote-client-n8x0-60/pcremote-client.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 Zagaia - INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Andre Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +from ecore import main_loop_begin +import ecore.evas +import sys +import os +from edje_objects import * +from connection.iconnection import Iconnection +from screenmanager import ScreenManager + +width, height = 800, 480 + +#any argument deactivates fullscreen +if sys.argv.__len__() > 1: + screen = False +else: + screen = True +#if x11_16 is present, get it, otherwise get x11 +if ecore.evas.engine_type_supported_get("software_x11_16"): + engine = ecore.evas.SoftwareX11_16 +else: + engine = ecore.evas.SoftwareX11 +#create the evas canvas +canvas = EvasCanvas(fullscreen=screen,engine=engine,size=(width, height)) +#main .edj path +edje_file = os.path.join(os.path.dirname(sys.argv[0]), "pcremote.edj") +#the bluetooth socket object shared by all screens +sock = Iconnection('bluetooth') +#main edje object +main = MainScreen(canvas=canvas, file=edje_file, group="Main",name="Main", connection = sock) +main.show() +#future edje objects +tablet, slide, player, torrent = None, None, None, None +#focus on main edje object +main.focus = True +#this object connects all screens together +manager = ScreenManager(main, tablet, slide, player, torrent, sock) + +ecore.main_loop_begin() + diff --git a/pcremote-client-n8x0-60/pcremote.edj b/pcremote-client-n8x0-60/pcremote.edj new file mode 100755 index 0000000..ce5640f Binary files /dev/null and b/pcremote-client-n8x0-60/pcremote.edj differ diff --git a/pcremote-client-n8x0-60/pcremote26.png b/pcremote-client-n8x0-60/pcremote26.png new file mode 100755 index 0000000..e5e8183 Binary files /dev/null and b/pcremote-client-n8x0-60/pcremote26.png differ diff --git a/pcremote-client-n8x0-60/pcremote40.png b/pcremote-client-n8x0-60/pcremote40.png new file mode 100755 index 0000000..22b5640 Binary files /dev/null and b/pcremote-client-n8x0-60/pcremote40.png differ diff --git a/pcremote-client-n8x0-60/pcremote64.png b/pcremote-client-n8x0-60/pcremote64.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-client-n8x0-60/pcremote64.png differ diff --git a/pcremote-client-n8x0-60/pcremote_client_50.tar.gz b/pcremote-client-n8x0-60/pcremote_client_50.tar.gz new file mode 100755 index 0000000..94af7ff Binary files /dev/null and b/pcremote-client-n8x0-60/pcremote_client_50.tar.gz differ diff --git a/pcremote-client-n8x0-60/screenmanager.py b/pcremote-client-n8x0-60/screenmanager.py new file mode 100755 index 0000000..367f17b --- /dev/null +++ b/pcremote-client-n8x0-60/screenmanager.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote ScreenManager handles the finite state machine which +# controls the navigation between screens. +# ============================================================================ + +from edje_objects import * +import os +import sys + +class ScreenManager(object): + ''' + classdocs + ''' + def __init__(self, main, tablet, slide, player, torrent,socket): + ''' + Constructor + ''' + self.main = main + self.tablet = tablet + self.slide = slide + self.player = player + self.torrent = torrent + self.sock = socket + main.signal_callback_add("mouse,up,1", "Tablet",self.run_tablet) + main.signal_callback_add("mouse,up,1", "Slideshow",self.run_slide) + main.signal_callback_add("mouse,up,1", "Player",self.run_player) + main.signal_callback_add("mouse,up,1", "Torrent",self.run_torrent) + + def run_tablet(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no tablet' + #main edje object + edje.focus_set(False) + edje.hide() + if self.tablet is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "tablet.edj") + self.tablet = TabletScreen(edje.canvas_class, edje_file, 'main', 'tablet', self.sock) + self.tablet.signal_callback_add("mouse,up,1","tablet_bt-voltar_area",self.tablet_back) + self.tablet.part_text_set('pc_name',edje.sock_address) + self.tablet.show() + self.tablet.focus_set(True) + + def tablet_back(self, edje, emission, source): + #tablet edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Tablet:#stop") + self.main.show() + self.main.focus_set(True) + + def run_slide(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no slide' + #main edje object + edje.focus_set(False) + edje.hide() + if self.slide is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "slide.edj") + self.slide = SlideScreen(edje.canvas_class, edje_file, 'main', 'slide', self.sock) + self.slide.signal_callback_add("unselected","slide_bt-voltar",self.slide_back) + #self.slide.part_text_set('pc_name',edje.sock_address) + #this rotates the screen 90 degrees (to fit text in vertical orientation) + #self.slide.x11.rotation_set(90) + self.slide.show() + self.slide.focus_set(True) + + def slide_back(self, edje, emission, source): + #slide edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Slideshow:#stop") + #this rotates the screen from 90 to 0 degrees (to fit text in horizontal orientation again) + #self.main.x11.rotation_set(0) + self.main.show() + self.main.focus_set(True) + + def run_player(self, edje, emission, source): + print 'not implemented yet' + + def player_back(self, edje, emission, source): + print 'not implemented yet' + + def run_torrent(self, edje, emission, source): + print 'not implemented yet' + + def torrent_back(self, edje, emission, source): + print 'not implemented yet' + diff --git a/pcremote-client-n8x0-60/slide.edj b/pcremote-client-n8x0-60/slide.edj new file mode 100755 index 0000000..d4e3119 Binary files /dev/null and b/pcremote-client-n8x0-60/slide.edj differ diff --git a/pcremote-client-n8x0-60/tablet.edj b/pcremote-client-n8x0-60/tablet.edj new file mode 100755 index 0000000..b50a7e4 Binary files /dev/null and b/pcremote-client-n8x0-60/tablet.edj differ diff --git a/pcremote-client-n8x0-60/utils/__init__.py b/pcremote-client-n8x0-60/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0-60/utils/labels.py b/pcremote-client-n8x0-60/utils/labels.py new file mode 100755 index 0000000..dd12186 --- /dev/null +++ b/pcremote-client-n8x0-60/utils/labels.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + + +# GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + +PLAY = "#play" +STOP = "#stop" +PAUSE = "#pause" +NEXT = "#next" +PREVIOUS = "#previous" +VOL_UP = "#vol_up" +VOL_DOWN = "#vol_down" +TLINE_LEFT = "#tline_left" +TLINE_RIGHT = "#tline_right" +RECORD = "#record" +#------------------------------------------> + +# GENERIC LABELS FOR APPLICATIONS + +START = "#start" +CLOSE = "#close" +FULL = "#fullscreen" +UPLOAD = "#upload" +DOWNLOAD = "#download" +SAVE = "#save" +DELETE = "#delete" +#--------------------------------> + +# GENERAL MOUSE LABELS + +CLICK = "#click" +DOUBLE_CLICK = "#double_click" +TRIPLE_CLICK = "#triple_click" +LEFT_CLICK = "#left_click" +RIGHT_CLICK = "#right_click" +MIDDLE_CLICK = "#middle_click" +#--------------------------------> + + diff --git a/pcremote-client-n8x0/build-stamp b/pcremote-client-n8x0/build-stamp new file mode 100644 index 0000000..e69de29 diff --git a/pcremote-client-n8x0/configure-stamp b/pcremote-client-n8x0/configure-stamp new file mode 100644 index 0000000..e69de29 diff --git a/pcremote-client-n8x0/connection/__init__.py b/pcremote-client-n8x0/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0/connection/__init__.pyc b/pcremote-client-n8x0/connection/__init__.pyc new file mode 100755 index 0000000..1088a1f Binary files /dev/null and b/pcremote-client-n8x0/connection/__init__.pyc differ diff --git a/pcremote-client-n8x0/connection/bluetoothconnectionmanager.py b/pcremote-client-n8x0/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..dc23b72 --- /dev/null +++ b/pcremote-client-n8x0/connection/bluetoothconnectionmanager.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : BluetoothConnectionManager +# ============================================================================ + + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionError(Exception): + pass + +class BluetoothConnectionManager(GenericConnectionManager): + + def __init__(self): + GenericConnectionManager.__init__(self) + print "BluetoothConnectionManager iniciado." + # globals data variables + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + # returns all services + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + # returns only the device services indicated by name + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + # returns only the device services indicated by address + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + # returns only the device service indicated by address + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + # returns an object + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-client-n8x0/connection/bluetoothconnectionmanager.pyc b/pcremote-client-n8x0/connection/bluetoothconnectionmanager.pyc new file mode 100755 index 0000000..77e47d5 Binary files /dev/null and b/pcremote-client-n8x0/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0/connection/genericconnectionmanager.py b/pcremote-client-n8x0/connection/genericconnectionmanager.py new file mode 100755 index 0000000..9eb3f85 --- /dev/null +++ b/pcremote-client-n8x0/connection/genericconnectionmanager.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Version : 1.0 +# Description : GenericConnectionManager Class +# ============================================================================ + + +class GenericConnectionManager: + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + def identify_app(self): + print "identify_app" diff --git a/pcremote-client-n8x0/connection/genericconnectionmanager.pyc b/pcremote-client-n8x0/connection/genericconnectionmanager.pyc new file mode 100755 index 0000000..ec68e43 Binary files /dev/null and b/pcremote-client-n8x0/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0/connection/iconnection.py b/pcremote-client-n8x0/connection/iconnection.py new file mode 100755 index 0000000..118358d --- /dev/null +++ b/pcremote-client-n8x0/connection/iconnection.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Interface Class, connection manager +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # ******************************************************************************** + # Generic methods -> Wireless and Bluetooth * + # ******************************************************************************** + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # ************************************************************************************ + # Bluetooth methods - All methods for bluetooth services * + # ************************************************************************************ + + # fast way to create a simple server + def bt_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bt_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bt_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bt_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device port + def bt_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search device services + def bt_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bt_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # *********************************************************************************** + # Wireless method - All methods for wireless services * + # *********************************************************************************** diff --git a/pcremote-client-n8x0/connection/iconnection.pyc b/pcremote-client-n8x0/connection/iconnection.pyc new file mode 100755 index 0000000..2226bd9 Binary files /dev/null and b/pcremote-client-n8x0/connection/iconnection.pyc differ diff --git a/pcremote-client-n8x0/connection/wirelessconnectionmanager.py b/pcremote-client-n8x0/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..7b94774 --- /dev/null +++ b/pcremote-client-n8x0/connection/wirelessconnectionmanager.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Version : 0.1 +# Description : Tablet Application Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + def __init__(self): + GenericConnectionManager.__init__(self) + #para acessar facilmente qualquer metodo generico + #self.super = generico() + print "init do Wireless" + self.tipo = "wireless" + + def metodo(self): + print "(Wireless)Metodo do", self.tipo + + diff --git a/pcremote-client-n8x0/connection/wirelessconnectionmanager.pyc b/pcremote-client-n8x0/connection/wirelessconnectionmanager.pyc new file mode 100755 index 0000000..06563ae Binary files /dev/null and b/pcremote-client-n8x0/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0/debian/README.Debian b/pcremote-client-n8x0/debian/README.Debian new file mode 100755 index 0000000..fdaa542 --- /dev/null +++ b/pcremote-client-n8x0/debian/README.Debian @@ -0,0 +1,6 @@ +pcremote-client for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-client-n8x0/debian/changelog b/pcremote-client-n8x0/debian/changelog new file mode 100755 index 0000000..b332888 --- /dev/null +++ b/pcremote-client-n8x0/debian/changelog @@ -0,0 +1,6 @@ +pcremote-client (0.60-1) unstable; urgency=low + + * Initial release (Closes: #nnnn) + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 + diff --git a/pcremote-client-n8x0/debian/compat b/pcremote-client-n8x0/debian/compat new file mode 100755 index 0000000..7ed6ff8 --- /dev/null +++ b/pcremote-client-n8x0/debian/compat @@ -0,0 +1 @@ +5 diff --git a/pcremote-client-n8x0/debian/control b/pcremote-client-n8x0/debian/control new file mode 100755 index 0000000..ccc90cd --- /dev/null +++ b/pcremote-client-n8x0/debian/control @@ -0,0 +1,11 @@ +Source: pcremote-client +Section: user/other +Priority: optional +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Build-Depends: debhelper (>= 5) +Standards-Version: 3.7.2 + +Package: pcremote-client +Architecture: armel +Depends: python2.5, python2.5-efl-utils (>=0.1.3), python2.5-efl-core (>=0.9.1), python2.5-bluez (>=0.9.1) +Description: A client application to let you control a mouse and keyboard of a desktop server diff --git a/pcremote-client-n8x0/debian/copyright b/pcremote-client-n8x0/debian/copyright new file mode 100755 index 0000000..63487d0 --- /dev/null +++ b/pcremote-client-n8x0/debian/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Client + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-client-n8x0/debian/dirs b/pcremote-client-n8x0/debian/dirs new file mode 100755 index 0000000..3618ba5 --- /dev/null +++ b/pcremote-client-n8x0/debian/dirs @@ -0,0 +1,5 @@ +usr/bin +usr/share/pcremote-client +usr/share/applications/hildon +usr/share/icons/hicolor/26x26/hildon + diff --git a/pcremote-client-n8x0/debian/docs b/pcremote-client-n8x0/debian/docs new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0/debian/files b/pcremote-client-n8x0/debian/files new file mode 100644 index 0000000..176ed73 --- /dev/null +++ b/pcremote-client-n8x0/debian/files @@ -0,0 +1 @@ +pcremote-client_0.60-1_armel.deb user/other optional diff --git a/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/control b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/control new file mode 100644 index 0000000..8aa4c87 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/control @@ -0,0 +1,9 @@ +Package: pcremote-client +Version: 0.60-1 +Architecture: armel +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Installed-Size: 1700 +Depends: python2.5, python2.5-bluez (>= 0.9.1), python2.5-efl-core (>= 0.9.1), python2.5-efl-utils (>= 0.1.3) +Section: user/other +Priority: optional +Description: A client application to let you control a mouse and keyboard of a desktop server diff --git a/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/md5sums b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/md5sums new file mode 100644 index 0000000..245cab1 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/md5sums @@ -0,0 +1,25 @@ +3fd5b4d9e25d31363a8059d09c200f41 usr/share/applications/hildon/pcremote-client.desktop +58bf2e5a7c200824c5aeb54c62488405 usr/share/pcremote-client/pcremote-client.py +50a7074d0b24fa0252802218e950e628 usr/share/pcremote-client/kineticlist.py +ad592c024fc19766d7bcc5c37f98619b usr/share/pcremote-client/screenmanager.py +c550a42e4e4839bd5d2911e2792f0203 usr/share/pcremote-client/tablet.edj +03144240717eaaaf1b69cc63172dec10 usr/share/pcremote-client/connection/bluetoothconnectionmanager.py +49c1b5c3a6725fea02760a16fab55d6c usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc +70e8942077f305d0dc2efc6fd13a7d19 usr/share/pcremote-client/connection/iconnection.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-client/connection/__init__.py +cec93922a80076d075d473a671b1b32e usr/share/pcremote-client/connection/genericconnectionmanager.py +048e6ffb26374c4f80d7698dbad247a9 usr/share/pcremote-client/connection/__init__.pyc +2fa68f3f626f6da9ace3785a6fb8a843 usr/share/pcremote-client/connection/genericconnectionmanager.pyc +a9a199485e01894676c9c207c1d7ac7d usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc +71b6cd7b7f5a0f015ac3ea28c146dcfd usr/share/pcremote-client/connection/wirelessconnectionmanager.py +368ec39fb0bd97b83e676c5eb570a504 usr/share/pcremote-client/connection/iconnection.pyc +a29eb978df91c3c7bc9f880d9279fe18 usr/share/pcremote-client/edje_objects.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-client/utils/__init__.py +b3ce6c1b4dde39f132c6fea0c0f32812 usr/share/pcremote-client/utils/labels.py +8d63834377110f7cac90eef4b9b95e78 usr/share/pcremote-client/slide.edj +02a89fa5764dedbd7a3b24f17cdef5cc usr/share/pcremote-client/pcremote.edj +a45cefda3455e840e85003b8b01fab75 usr/share/doc/pcremote-client/README.Debian +05c8914575af590a1c2a0e0febed2903 usr/share/doc/pcremote-client/changelog.Debian.gz +002c11b08af0369742751c02cbf1fbe8 usr/share/doc/pcremote-client/copyright +194dc850c98759d2b2f4fa7faf62f37b usr/share/icons/hicolor/26x26/hildon/pcremote.png +432c8381b94e37a4a618c8930bce54e6 usr/bin/pcremote-client diff --git a/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/postinst b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/postinst new file mode 100755 index 0000000..8204dd4 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/postinst @@ -0,0 +1,5 @@ +#!/bin/sh -e + +gtk-update-icon-cache -f /usr/share/icons/hicolor +maemo-select-menu-location pcremote-client.desktop + diff --git a/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/prerm b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/prerm new file mode 100755 index 0000000..72123fe --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/DEBIAN/prerm @@ -0,0 +1,15 @@ +#!/bin/sh -e + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/hildon/pcremote-client.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-client + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-client + + +exit 0 diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/bin/pcremote-client b/pcremote-client-n8x0/debian/pcremote-client/usr/bin/pcremote-client new file mode 100755 index 0000000..b28bdfe --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/bin/pcremote-client @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-client/pcremote-client.py diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/applications/hildon/pcremote-client.desktop b/pcremote-client-n8x0/debian/pcremote-client/usr/share/applications/hildon/pcremote-client.desktop new file mode 100644 index 0000000..f712a0a --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/applications/hildon/pcremote-client.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.60 +Type=Application +Icon=pcremote +Name=PCRemote Client +Exec=pcremote-client +X-Window-Icon=pcremote +X-Window-Icon-Dimmed=pcremote +Terminal=false +Categories=Application;Network; +StartupNotify=false diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/README.Debian b/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/README.Debian new file mode 100644 index 0000000..fdaa542 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/README.Debian @@ -0,0 +1,6 @@ +pcremote-client for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/changelog.Debian.gz b/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/changelog.Debian.gz new file mode 100644 index 0000000..2cc3eef Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/changelog.Debian.gz differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/copyright b/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/copyright new file mode 100644 index 0000000..63487d0 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/doc/pcremote-client/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Client + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png b/pcremote-client-n8x0/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png new file mode 100755 index 0000000..e5e8183 Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.pyc b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.pyc new file mode 100755 index 0000000..1088a1f Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/__init__.pyc differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..dc23b72 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : BluetoothConnectionManager +# ============================================================================ + + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionError(Exception): + pass + +class BluetoothConnectionManager(GenericConnectionManager): + + def __init__(self): + GenericConnectionManager.__init__(self) + print "BluetoothConnectionManager iniciado." + # globals data variables + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + # returns all services + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + # returns only the device services indicated by name + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + # returns only the device services indicated by address + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + # returns only the device service indicated by address + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + # returns an object + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc new file mode 100755 index 0000000..77e47d5 Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.py new file mode 100755 index 0000000..9eb3f85 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Version : 1.0 +# Description : GenericConnectionManager Class +# ============================================================================ + + +class GenericConnectionManager: + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + def identify_app(self): + print "identify_app" diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.pyc b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.pyc new file mode 100755 index 0000000..ec68e43 Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.py new file mode 100755 index 0000000..118358d --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Interface Class, connection manager +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # ******************************************************************************** + # Generic methods -> Wireless and Bluetooth * + # ******************************************************************************** + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # ************************************************************************************ + # Bluetooth methods - All methods for bluetooth services * + # ************************************************************************************ + + # fast way to create a simple server + def bt_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bt_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bt_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bt_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device port + def bt_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search device services + def bt_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bt_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # *********************************************************************************** + # Wireless method - All methods for wireless services * + # *********************************************************************************** diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.pyc b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.pyc new file mode 100755 index 0000000..2226bd9 Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/iconnection.pyc differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..7b94774 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Version : 0.1 +# Description : Tablet Application Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + def __init__(self): + GenericConnectionManager.__init__(self) + #para acessar facilmente qualquer metodo generico + #self.super = generico() + print "init do Wireless" + self.tipo = "wireless" + + def metodo(self): + print "(Wireless)Metodo do", self.tipo + + diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc new file mode 100755 index 0000000..06563ae Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/edje_objects.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/edje_objects.py new file mode 100755 index 0000000..a60e663 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/edje_objects.py @@ -0,0 +1,320 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +import thread +import ecore +import ecore.evas +import evas.decorators +import edje +import edje.decorators +import time +from connection.iconnection import Iconnection +from kineticlist import * + +class EvasCanvas(object): + + def __init__(self, fullscreen, engine, size): + #f = ecore.evas.SoftwareX11 + self.evas_obj = engine(w=size[0], h=size[1]) + self.evas_obj.callback_delete_request = self.on_delete_request + self.evas_obj.callback_resize = self.on_resize + + self.evas_obj.title = "PCRemote" + self.evas_obj.name_class = ('PC Remote', 'main') + self.evas_obj.fullscreen = fullscreen + self.evas_obj.size = size + self.evas_obj.show() + + def on_resize(self, evas_obj): + x, y, w, h = evas_obj.evas.viewport + size = (w, h) + for key in evas_obj.data.keys(): + evas_obj.data[key].size = size + + def on_delete_request(self, evas_obj): + ecore.main_loop_quit() + + def show(self): + self.evas_obj.show() + +class EdjeObject(edje.Edje): + + def __init__(self, canvas_class, file, group='main',name='edje'): + self.canvas_class = canvas_class + self.x11 = canvas_class.evas_obj + self.canvas = self.x11.evas + edje.Edje.__init__(self, self.canvas, file = file, group = group) + self.size = self.canvas.size + self.x11.data[name] = self + +class MainScreen(EdjeObject): + + def __init__(self, canvas, file, group, name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + + self.file = file + self.on_key_down_add(self.key_down_cb, self.x11) + self.sock_address = None + #flag that sync the discovery device's thread + self.flag = False + #flag that sync the connecting device's thread + self.connecting_flag = False + #lista de dispositivos descobertos + self.lista_dispositivos = [] + #objeto que cria a conexao bluetooth + self.conexao = connection + self.kineticlist = False + #portela mock object + self.lista_teste = ['Andre Portela', 'Juliana Dias', 'Victor Hugo', 'Lucina Dias', 'Rosa Dias', 'James Italiano', 'Nona Izvi', 'Fergus Mao', 'Mauricio Brilhante', 'Edward Ordonez', 'Brankinhu', 'Banco Real', 'Banco Itaú', 'ABN-AMRO BANK'] + + def key_down_cb(self, bg, event, ee): + k = event.key + if k == "Escape": + ecore.main_loop_quit() + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + print "-" + elif k == "F7": + print "+" + + def mkKineticList(self): + #kinetic list (the item values are tied with the part "item_background" of the "list_item" group) + #self.kineticlist = KineticList(self.canvas, file=self.file, item_width=407, item_height=38, father=self) + self.kineticlist = KineticList(self.canvas, file=self.file, item_height=57, father=self) + self.kineticlist.freeze() + #portela - test kinetic list with several devices + #for item in self.lista_teste: + #populates the list with the device's names + for item in self.lista_dispositivos: + self.kineticlist.row_add(item) + #reorganize and draw the list + self.kineticlist.thaw() + #embed the list in the edje object + self.part_swallow("list", self.kineticlist); + + @edje.decorators.signal_callback("connect_to","choice") + def connect_to(self, emission, source): + self.sock_address = self.part_text_get(source) + #flag that sync the connecting device's thread + self.connecting_flag = False + self.signal_emit("start","device_connect") + thread.start_new_thread(MainScreen.threaded_connection,(self,)) + + def threaded_connection(self): + self.conexao.create_socket('l2cap') + print 'connecting to: %s' % self.sock_address + self.conexao.set_address(self.conexao.bt_find_device_address_by_name(self.sock_address)) + self.conexao.set_port(0x1001) + self.conexao.connect() + self.connecting_flag = True + + @edje.decorators.signal_callback("connecting","device") + def connecting_check(self, emission, source): + if self.connecting_flag: + self.connecting_flag = False + self.signal_emit("stop","device_connect") + #we are sending a signal to main edje (there is time to animate the device locking) + self.signal_emit("begin","init") + + @edje.decorators.signal_callback("animation_still_loading", "loading") + def still_loading_cb(self, emission, source): + if self.flag: + self.flag = False + self.signal_emit("program,stop","loading") + if self.lista_dispositivos != []: + self.mkKineticList() + else: + self.no_device_found() + + @edje.decorators.signal_callback("animation_sair_ended", "sair") + def saida(self, signal, source): + ecore.main_loop_quit() + + @edje.decorators.signal_callback("animation_rastrear_ended", "rastrear") + def rastrear_key_down(self, signal, source): + thread.start_new_thread(MainScreen.rastrear_dispositivos,(self,None)) + + @edje.decorators.signal_callback("program,start", "novodevice") + def search_devices_again(self, signal, source): + self.part_unswallow(self.kineticlist) + del self.kineticlist + MainScreen.rastrear_key_down(self, None, None) + + def rastrear_dispositivos(self,arg): + try: + self.lista_dispositivos = self.conexao.bt_find_devices_only_names() + except: + self.lista_dispositivos = [] + self.flag = True + + def no_device_found(self): + self.signal_emit("program,start","no_device") + +class TabletScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + self.key_flag = False + + @edje.decorators.signal_callback('mouse,down,1', 'tablet_bt-L_area') + def left_click_down(self, signal, source): + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-L_area') + def left_click_up(self, signal, source): + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-R_area') + def rigth_click(self, signal, source): + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Tablet:#stop") + self.sock.close() + ecore.main_loop_quit() + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + elif k == "Return": + self.sock.send_message("Keyboard:Alt+F1") + elif k == "ISO_Level3_Shift": + self.sock.send_message("Keyboard:Alt+F2") + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) + +class SlideScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #helps to coordenate presentation + self.keyboard_flag = True + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + + @edje.decorators.signal_callback('mouse,down,1', 'slide_bt-left_area') + def left_click_down(self, signal, source): + if self.keyboard_flag: + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-left_area') + def left_click_up(self, signal, source): + if self.keyboard_flag: + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + else: + self.sock.send_message("Keyboard:%s" % "Left") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-right_area') + def rigth_click(self, signal, source): + if self.keyboard_flag: + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + else: + self.sock.send_message("Keyboard:%s" % "Right") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Slideshow:#stop") + self.sock.close() + ecore.main_loop_quit() + elif k == "F6": + self.keyboard_flag = not self.keyboard_flag + self.sock.send_message("Keyboard:F5") + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/kineticlist.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/kineticlist.py new file mode 100755 index 0000000..4234176 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/kineticlist.py @@ -0,0 +1,400 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Gustavo Sverzut Barbieri ; André Luiz do Canto Portela +# Email :barbieri@gmail.com ; andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :This class are an adaptation of barbieri's demo 03 of edje +# :python-bindings +# ============================================================================ + +import evas +import edje +import ecore +import time + +class KineticList(evas.ClippedSmartObject): + ( + SCROLL_PAGE_FORWARD, + SCROLL_PAGE_BACKWARD, + SCROLL_STEP_FORWARD, + SCROLL_STEP_BACKWARD, + SCROLL_PIXELS_DOWN, + SCROLL_PIXELS_UP + ) = range(6) + + + def __init__(self, ecanvas, file, item_width=-1, item_height=-1, father=None): + ''' + if item_width or item_height is left out the width (resp. height) + of the List element is used. + ''' + self.father = father + evas.ClippedSmartObject.__init__(self, ecanvas) + self.elements = [] + self.objects = [] + self.w = 32 + self.h = 32 + + self.realized = False + + self.top_pos = 0 + self.last_top_pos = 0 + self.last_start_row = -1 + + self.canvas = ecanvas + self.edje_file = file + + self.row_width = item_width + self.row_height = item_height + + self.__manage_objects() + + self.mouse_down = False + self.last_y_pos = 0 + self.start_pos = 0 + self.mouse_moved = False + self.continue_scrolling = False + self.is_scrolling = False + self.do_freeze = False + + def freeze(self): + self.do_freeze = True + + def thaw(self): + self.do_freeze = False + if self.realized: + self.__update_variables_after_new_elements() + self.__update_screen() + + def scroll(self, scroll_type, amount=1): + self.continue_scrolling = False + + if scroll_type == self.SCROLL_PAGE_FORWARD: + self.top_pos += amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_PAGE_BACKWARD: + self.top_pos -= amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_STEP_FORWARD: + self.top_pos += amount * self.row_height + elif scroll_type == self.SCROLL_STEP_BACKWARD: + self.top_pos -= amount * self.row_height + elif scroll_type == self.SCROLL_PIXELS_DOWN: + self.top_pos += amount + elif scroll_type == self.SCROLL_PIXELS_UP: + self.top_pos -= amount + else: + return + + self.__update_screen() + + def __on_mouse_clicked(self, edje_obj, emission, source, data=None): + #for obj in self.objects: + # if obj != edje_obj: + # obj.signal_emit("fadeout", "") + + #edje_obj.signal_emit("open", "") + #TODO:portela - it works! :D + edje_obj.signal_emit("program,start","label") + #we are setting up the choice's text on the main edje object + self.parent_get().part_text_set("choice",edje_obj.part_text_get("label")) + + def __on_mouse_move(self, edje_obj, emission, source, data=None): + if self.mouse_down: + x_pos, y_pos = self.canvas.pointer_canvas_xy + diff = int(self.last_y_pos - y_pos) + + if diff == 0: + return + + self.mouse_moved = True + + # Reset the data if the direction of the mouse move is changed + if self.last_diff != -1 and (diff < 0) != (self.last_diff < 0): + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + + self.last_diff = diff + self.top_pos += diff + + self.last_y_pos = y_pos + self.__update_screen() + self.last_update_time = time.time() + + #TODO: portela mod + def __on_blink_ended(self, edje_obj, emission, source, data=None): + for obj in self.objects: + obj.signal_emit("program,start,fade,out","label") + #we are sending a signal for the application connect the target + self.parent_get().signal_emit("connect_to","choice") + + #TODO: portela mod + + def show_list(self): + for obj in self.objects: + obj.signal_emit("program,start,fade,in","label") + + def __on_mouse_down(self, edje_obj, emission, source, data=None): + if not self.is_scrolling: + self.mouse_moved = False + + self.continue_scrolling = False + self.mouse_down = True + + x_pos, y_pos = self.canvas.pointer_canvas_xy + + self.last_diff = -1 + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + self.last_update_time = time.time() + + def __on_mouse_up(self, edje_obj, emission, source, data=None): + if self.mouse_down: + self.mouse_down = False + + x_pos, end_pos = self.canvas.pointer_canvas_xy + + if not self.mouse_moved and not self.is_scrolling: + #self.__on_mouse_clicked(edje_obj, emission, source) + return + + self.mouse_moved = False + self.is_scrolling = False + + # do not scroll automatically if the finger was paused + if time.time() - self.last_update_time > 0.1: + return + + end_time = time.time() + + pos_diff = end_pos - self.start_pos + time_diff = end_time - self.start_time + + self.pixel_per_sec = pos_diff / time_diff + self.continue_scrolling = True + self.__do_scroll() + + def __do_scroll(self): + self.is_scrolling = True + + if self.continue_scrolling == False: + return + + diff = int(self.pixel_per_sec / 10) + + if abs(self.pixel_per_sec) - diff <= self.row_height: + offset = self.top_pos % self.row_height + + if offset >= self.row_height / 2: + self.sign = 1 + offset = self.row_height - offset + else: + self.sign = -1 + + self.pixels_left = offset + self.__do_magnetic_scroll() + + return + + if diff != 0: + self.top_pos -= diff + self.pixel_per_sec -= self.pixel_per_sec / 10 + self.__update_screen() + + ecore.timer_add(0.02, self.__do_scroll) + + def __do_magnetic_scroll(self): + if self.pixels_left <= 0 or abs(self.pixel_per_sec) < 1: + self.mouse_moved = False + self.is_scrolling = False + return + + self.pixel_per_sec -= (self.pixel_per_sec / 10) + + pixels_to_substract = int(abs(self.pixel_per_sec / 10)) + if abs(pixels_to_substract) < 1: + pixels_to_substract = 1 + + if self.pixels_left - pixels_to_substract > 0: + self.pixels_left -= pixels_to_substract + self.top_pos += self.sign * pixels_to_substract + else: + self.top_pos += self.sign * self.pixels_left + self.pixels_left = 0 + + self.__update_screen() + ecore.timer_add(0.1, self.__do_magnetic_scroll) + + def row_add(self, label): + self.elements.append(label) + + if not self.do_freeze: + self.__update_variables_after_new_elements() + self.__update_screen() + + def __manage_objects(self): + remain = (self.h % self.row_height) > 1 + needed_objects = ((self.h / self.row_height) + 1 + remain) * (self.w / self.row_width) + current_objects = len(self.objects) + + if current_objects < needed_objects: + for i in range(current_objects, needed_objects): + obj = edje.Edje(self.canvas); + obj.file_set(self.edje_file, "list_item"); + + obj.signal_callback_add("mouse,move", "*", + self.__on_mouse_move) + obj.signal_callback_add("mouse,down,*", "*", + self.__on_mouse_down) + obj.signal_callback_add("mouse,up,*", "*", + self.__on_mouse_up) + #TODO: portela mod + obj.signal_callback_add("animation_blink_ended", "label", + self.__on_blink_ended) + obj.signal_callback_add("mouse,clicked,*", "label", + self.__on_mouse_clicked) + obj.size = (self.row_width, self.row_height) + obj.clip = self + self.objects.append(obj) + + elif needed_objects < current_objects: + for i in range(needed_objects, current_objects): + pass # Make this work, it throws exception that makes + # things stop working properly + #del self.objects[i] + + def __update_variables_after_resize(self): + self.max_visible_rows = (self.h / self.row_height) + 1 + self.max_horiz_elements = (self.w / self.row_width) + self.max_visible_elements = self.max_visible_rows * \ + self.max_horiz_elements + + # Invalidate variable in order to repaint all rows + # Some might not have been painted before (Didn't + # fit on the screen + self.last_start_row = -1 + + self.__update_variables_after_new_elements() + + def __update_variables_after_new_elements(self): + if not self.realized: + return + + self.min_pos = 0 + remainer1 = (len(self.elements) % self.max_horiz_elements) > 0 + remainer2 = (self.h % self.row_height) > 0 + self.row_amount = (len(self.elements) / self.max_horiz_elements) + \ + remainer1 + remainer2 + self.max_pos = self.row_height * \ + (self.row_amount - self.max_visible_rows + 1) + + def __update_screen(self): + remainer = (self.h % self.row_height) > 0 + row_offset = (self.top_pos / self.row_height) + pixel_offset = - (self.top_pos % self.row_height) + start_row = row_offset + end_row = self.max_visible_rows + row_offset + remainer + + SCROLL_DOWN = self.top_pos > self.last_top_pos + SCROLL_UP = self.top_pos < self.last_top_pos + + # Let's not move over the last element + if SCROLL_DOWN and self.last_top_pos >= self.max_pos: + self.top_pos = self.max_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Let's not move over the first element + if SCROLL_UP and self.last_top_pos <= self.min_pos: + self.top_pos = self.min_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Overflow scrolling down + if SCROLL_DOWN and end_row > self.row_amount: + offset = end_row - self.row_amount + end_row -= offset + start_row -= offset + row_offset -= offset - 1 + self.top_pos = self.max_pos + pixel_offset = 0 + + # Overflow scrolling up + if SCROLL_UP and start_row < 0: + self.top_pos = self.min_pos + end_row -= start_row + start_row = 0 + row_offset = 0 + pixel_offset = 0 + + self.last_top_pos = self.top_pos + + if start_row != self.last_start_row: + for i in range(0, len(self.objects)): + self.objects[i].hide() + + for i in range(start_row, end_row): + row_iter = i - start_row + + for k in range(self.max_horiz_elements): + obj_iter = row_iter * self.max_horiz_elements + k + data_iter = i * self.max_horiz_elements + k + + try: + label = self.elements[data_iter] + except Exception, e: + break; + + offset = (self.w % + (self.row_width * self.max_horiz_elements)) / 2 + x = self.row_width * k + self.top_left[0] + offset + y = self.top_left[1] + self.row_height * (i - row_offset) - \ + 5 + pixel_offset + + self.objects[obj_iter].move(x, y) + + if start_row != self.last_start_row: + self.objects[obj_iter].part_text_set("label", label) + self.objects[obj_iter].show() + + self.last_start_row = start_row + + def resize(self, w, h): + if self.row_width == -1 or self.row_width == self.w: + self.row_width = w + + if self.row_height == -1 or self.row_height == self.h: + self.row_height = h + + self.w = w + self.h = h + + self.__manage_objects() + + for obj in self.objects: + obj.size = (self.row_width, self.row_height) + + self.realized = True + self.__update_variables_after_resize() + self.__update_screen() diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/pcremote-client.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/pcremote-client.py new file mode 100755 index 0000000..14e5a9e --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/pcremote-client.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 Zagaia - INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Andre Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +from ecore import main_loop_begin +import ecore.evas +import sys +import os +from edje_objects import * +from connection.iconnection import Iconnection +from screenmanager import ScreenManager + +width, height = 800, 480 + +#any argument deactivates fullscreen +if sys.argv.__len__() > 1: + screen = False +else: + screen = True +#if x11_16 is present, get it, otherwise get x11 +if ecore.evas.engine_type_supported_get("software_x11_16"): + engine = ecore.evas.SoftwareX11_16 +else: + engine = ecore.evas.SoftwareX11 +#create the evas canvas +canvas = EvasCanvas(fullscreen=screen,engine=engine,size=(width, height)) +#main .edj path +edje_file = os.path.join(os.path.dirname(sys.argv[0]), "pcremote.edj") +#the bluetooth socket object shared by all screens +sock = Iconnection('bluetooth') +#main edje object +main = MainScreen(canvas=canvas, file=edje_file, group="Main",name="Main", connection = sock) +main.show() +#future edje objects +tablet, slide, player, torrent = None, None, None, None +#focus on main edje object +main.focus = True +#this object connects all screens together +manager = ScreenManager(main, tablet, slide, player, torrent, sock) + +ecore.main_loop_begin() + diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/pcremote.edj b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/pcremote.edj new file mode 100755 index 0000000..ce5640f Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/pcremote.edj differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/screenmanager.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/screenmanager.py new file mode 100755 index 0000000..367f17b --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/screenmanager.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote ScreenManager handles the finite state machine which +# controls the navigation between screens. +# ============================================================================ + +from edje_objects import * +import os +import sys + +class ScreenManager(object): + ''' + classdocs + ''' + def __init__(self, main, tablet, slide, player, torrent,socket): + ''' + Constructor + ''' + self.main = main + self.tablet = tablet + self.slide = slide + self.player = player + self.torrent = torrent + self.sock = socket + main.signal_callback_add("mouse,up,1", "Tablet",self.run_tablet) + main.signal_callback_add("mouse,up,1", "Slideshow",self.run_slide) + main.signal_callback_add("mouse,up,1", "Player",self.run_player) + main.signal_callback_add("mouse,up,1", "Torrent",self.run_torrent) + + def run_tablet(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no tablet' + #main edje object + edje.focus_set(False) + edje.hide() + if self.tablet is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "tablet.edj") + self.tablet = TabletScreen(edje.canvas_class, edje_file, 'main', 'tablet', self.sock) + self.tablet.signal_callback_add("mouse,up,1","tablet_bt-voltar_area",self.tablet_back) + self.tablet.part_text_set('pc_name',edje.sock_address) + self.tablet.show() + self.tablet.focus_set(True) + + def tablet_back(self, edje, emission, source): + #tablet edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Tablet:#stop") + self.main.show() + self.main.focus_set(True) + + def run_slide(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no slide' + #main edje object + edje.focus_set(False) + edje.hide() + if self.slide is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "slide.edj") + self.slide = SlideScreen(edje.canvas_class, edje_file, 'main', 'slide', self.sock) + self.slide.signal_callback_add("unselected","slide_bt-voltar",self.slide_back) + #self.slide.part_text_set('pc_name',edje.sock_address) + #this rotates the screen 90 degrees (to fit text in vertical orientation) + #self.slide.x11.rotation_set(90) + self.slide.show() + self.slide.focus_set(True) + + def slide_back(self, edje, emission, source): + #slide edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Slideshow:#stop") + #this rotates the screen from 90 to 0 degrees (to fit text in horizontal orientation again) + #self.main.x11.rotation_set(0) + self.main.show() + self.main.focus_set(True) + + def run_player(self, edje, emission, source): + print 'not implemented yet' + + def player_back(self, edje, emission, source): + print 'not implemented yet' + + def run_torrent(self, edje, emission, source): + print 'not implemented yet' + + def torrent_back(self, edje, emission, source): + print 'not implemented yet' + diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/slide.edj b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/slide.edj new file mode 100755 index 0000000..d4e3119 Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/slide.edj differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/tablet.edj b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/tablet.edj new file mode 100755 index 0000000..b50a7e4 Binary files /dev/null and b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/tablet.edj differ diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/utils/__init__.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/utils/labels.py b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/utils/labels.py new file mode 100755 index 0000000..dd12186 --- /dev/null +++ b/pcremote-client-n8x0/debian/pcremote-client/usr/share/pcremote-client/utils/labels.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + + +# GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + +PLAY = "#play" +STOP = "#stop" +PAUSE = "#pause" +NEXT = "#next" +PREVIOUS = "#previous" +VOL_UP = "#vol_up" +VOL_DOWN = "#vol_down" +TLINE_LEFT = "#tline_left" +TLINE_RIGHT = "#tline_right" +RECORD = "#record" +#------------------------------------------> + +# GENERIC LABELS FOR APPLICATIONS + +START = "#start" +CLOSE = "#close" +FULL = "#fullscreen" +UPLOAD = "#upload" +DOWNLOAD = "#download" +SAVE = "#save" +DELETE = "#delete" +#--------------------------------> + +# GENERAL MOUSE LABELS + +CLICK = "#click" +DOUBLE_CLICK = "#double_click" +TRIPLE_CLICK = "#triple_click" +LEFT_CLICK = "#left_click" +RIGHT_CLICK = "#right_click" +MIDDLE_CLICK = "#middle_click" +#--------------------------------> + + diff --git a/pcremote-client-n8x0/debian/postinst b/pcremote-client-n8x0/debian/postinst new file mode 100755 index 0000000..8204dd4 --- /dev/null +++ b/pcremote-client-n8x0/debian/postinst @@ -0,0 +1,5 @@ +#!/bin/sh -e + +gtk-update-icon-cache -f /usr/share/icons/hicolor +maemo-select-menu-location pcremote-client.desktop + diff --git a/pcremote-client-n8x0/debian/prerm b/pcremote-client-n8x0/debian/prerm new file mode 100755 index 0000000..72123fe --- /dev/null +++ b/pcremote-client-n8x0/debian/prerm @@ -0,0 +1,15 @@ +#!/bin/sh -e + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/hildon/pcremote-client.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-client + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-client + + +exit 0 diff --git a/pcremote-client-n8x0/debian/rules b/pcremote-client-n8x0/debian/rules new file mode 100755 index 0000000..9e84358 --- /dev/null +++ b/pcremote-client-n8x0/debian/rules @@ -0,0 +1,90 @@ +#!/usr/bin/make -f + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + ##$(MAKE) + #docbook-to-man debian/pcremote-client.sgml > pcremote-client.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + dh_clean + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/pcremote-client. + #$(MAKE) install DESTDIR=$(CURDIR)/debian/pcremote-client + mkdir -p $(CURDIR)/debian/pcremote-client + + ###insert your commands here + cp *.py *.edj $(CURDIR)/debian/pcremote-client/usr/share/pcremote-client + cp -r connection/ $(CURDIR)/debian/pcremote-client/usr/share/pcremote-client + cp -r utils/ $(CURDIR)/debian/pcremote-client/usr/share/pcremote-client + cp pcremote26.png $(CURDIR)/debian/pcremote-client/usr/share/icons/hicolor/26x26/hildon/pcremote.png + + ### Installing menufile + # copy the file with the menu entry into /usr/share/applications + cp pcremote-client.desktop $(CURDIR)/debian/pcremote-client/usr/share/applications/hildon + cp pcremote-client $(CURDIR)/debian/pcremote-client/usr/bin + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/pcremote-client-n8x0/edje_objects.py b/pcremote-client-n8x0/edje_objects.py new file mode 100755 index 0000000..1cd5244 --- /dev/null +++ b/pcremote-client-n8x0/edje_objects.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +import thread +import ecore +import ecore.evas +import evas.decorators +import edje +import edje.decorators +import time +from connection.iconnection import Iconnection +from kineticlist import * + +class EvasCanvas(object): + + def __init__(self, fullscreen, engine, size): + #f = ecore.evas.SoftwareX11 + self.evas_obj = engine(w=size[0], h=size[1]) + self.evas_obj.callback_delete_request = self.on_delete_request + self.evas_obj.callback_resize = self.on_resize + + self.evas_obj.title = "PCRemote" + self.evas_obj.name_class = ('PC Remote', 'main') + self.evas_obj.fullscreen = fullscreen + self.evas_obj.size = size + self.evas_obj.show() + + def on_resize(self, evas_obj): + x, y, w, h = evas_obj.evas.viewport + size = (w, h) + for key in evas_obj.data.keys(): + evas_obj.data[key].size = size + + def on_delete_request(self, evas_obj): + ecore.main_loop_quit() + + def show(self): + self.evas_obj.show() + +class EdjeObject(edje.Edje): + + def __init__(self, canvas_class, file, group='main',name='edje'): + self.canvas_class = canvas_class + self.x11 = canvas_class.evas_obj + self.canvas = self.x11.evas + edje.Edje.__init__(self, self.canvas, file = file, group = group) + self.size = self.canvas.size + self.x11.data[name] = self + +class MainScreen(EdjeObject): + + def __init__(self, canvas, file, group, name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + + self.file = file + self.on_key_down_add(self.key_down_cb, self.x11) + self.sock_address = None + #flag that sync the discovery device's thread + self.flag = False + #flag that sync the connecting device's thread + self.connecting_flag = False + #lista de dispositivos descobertos + self.lista_dispositivos = [] + #objeto que cria a conexao bluetooth + self.conexao = connection + self.kineticlist = False + #portela mock object + self.lista_teste = ['Andre Portela', 'Juliana Dias', 'Victor Hugo', 'Lucina Dias', 'Rosa Dias', 'James Italiano', 'Nona Izvi', 'Fergus Mao', 'Mauricio Brilhante', 'Edward Ordonez', 'Brankinhu', 'Banco Real', 'Banco Itaú', 'ABN-AMRO BANK'] + + def key_down_cb(self, bg, event, ee): + k = event.key + if k == "Escape": + ecore.main_loop_quit() + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + print "-" + elif k == "F7": + print "+" + + def mkKineticList(self): + #kinetic list (the item values are tied with the part "item_background" of the "list_item" group) + #self.kineticlist = KineticList(self.canvas, file=self.file, item_width=407, item_height=38, father=self) + self.kineticlist = KineticList(self.canvas, file=self.file, item_height=57, father=self) + self.kineticlist.freeze() + #portela - test kinetic list with several devices + #for item in self.lista_teste: + #populates the list with the device's names + for item in self.lista_dispositivos: + self.kineticlist.row_add(item) + #reorganize and draw the list + self.kineticlist.thaw() + #embed the list in the edje object + self.part_swallow("list", self.kineticlist); + + @edje.decorators.signal_callback("connect_to","choice") + def connect_to(self, emission, source): + self.sock_address = self.part_text_get(source) + #flag that sync the connecting device's thread + self.connecting_flag = False + self.signal_emit("start","device_connect") + thread.start_new_thread(MainScreen.threaded_connection,(self,)) + + def threaded_connection(self): + self.conexao.create_socket('l2cap') + print 'connecting to: %s' % self.sock_address + self.conexao.set_address(self.conexao.bt_find_device_address_by_name(self.sock_address)) + self.conexao.set_port(0x1001) + self.conexao.connect() + self.connecting_flag = True + + @edje.decorators.signal_callback("connecting","device") + def connecting_check(self, emission, source): + if self.connecting_flag: + self.connecting_flag = False + self.signal_emit("stop","device_connect") + #we are sending a signal to main edje (there is time to animate the device locking) + self.signal_emit("begin","init") + + @edje.decorators.signal_callback("animation_still_loading", "loading") + def still_loading_cb(self, emission, source): + if self.flag: + self.flag = False + self.signal_emit("program,stop","loading") + if self.lista_dispositivos != []: + self.mkKineticList() + else: + self.no_device_found() + + @edje.decorators.signal_callback("animation_sair_ended", "sair") + def saida(self, signal, source): + ecore.main_loop_quit() + + @edje.decorators.signal_callback("animation_rastrear_ended", "rastrear") + def rastrear_key_down(self, signal, source): + thread.start_new_thread(MainScreen.rastrear_dispositivos,(self,None)) + + @edje.decorators.signal_callback("program,start", "novodevice") + def search_devices_again(self, signal, source): + self.part_unswallow(self.kineticlist) + del self.kineticlist + MainScreen.rastrear_key_down(self, None, None) + + def rastrear_dispositivos(self,arg): + try: + self.lista_dispositivos = self.conexao.bt_find_devices_only_names() + except: + self.lista_dispositivos = [] + self.flag = True + + def no_device_found(self): + self.signal_emit("program,start","no_device") + +class TabletScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + #tecla alt + self.alt_flag = False + #tecla shift + self.iso_shift_flag = False + #lista de aliases das teclas de comando Alt+F(x) + #self.fletters = ['p', 'q', 'w', '', 'r', '', '', '', '', 'o'] + self.keys_dict = {'q':1, 'w':2, 'e':3, 'r':4, 't':5, 'y':6, 'u':7, 'i':8, 'o':9, 'p':0, \ + 'a':'Shift_L+1', 's':'', 'd':'Shift_L+2', 'f':'Shift_L+3', 'g':'backslash', \ + 'h':'slash', 'j':'Shift_L+9', 'k': 'Shift_L+0', 'l':'Shift_L+8', '\'':'Shift_L+slash',\ + 'z':'', 'x':'Shift_L+6', 'c':'', 'v':'Shift_L+5', 'b':'Shift_L+7', 'n':'Shift_L+4', \ + 'm':'', ';':'', '-':'Shift_L+minus', '+':'equal'} + + @edje.decorators.signal_callback('mouse,down,1', 'tablet_bt-L_area') + def left_click_down(self, signal, source): + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-L_area') + def left_click_up(self, signal, source): + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + + @edje.decorators.signal_callback('mouse,up,1', 'tablet_bt-R_area') + def rigth_click(self, signal, source): + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Keyboard:Escape") + elif k == "F6": + ee.fullscreen = not ee.fullscreen + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + elif k == "Return": + self.alt_flag = True + elif k == "ISO_Level3_Shift": + self.iso_shift_flag = True + else: + if self.alt_flag: + #if k in self.fletters: + # self.sock.send_message("Keyboard:Alt+F%s" % (self.fletters.index(k))) + # self.alt_flag = False + #elif k == 'space': + # self.sock.send_message("Keyboard:Alt+Space") + # self.alt_flag = False + #else: + # self.alt_flag = False + if self.keys_dict.has_key(k) and isinstance(self.keys_dict[k], int): + self.sock.send_message("Keyboard:Alt_L") + self.sock.send_message("Keyboard:F%s" % (self.keys_dict[k])) + self.alt_flag = False + elif k == 'space': + self.sock.send_message("Keyboard:Alt_L") + self.sock.send_message("Keyboard:space") + self.alt_flag = False + else: + self.alt_flag = False + #else: + #self.sock.send_message("Keyboard:%s" % k) + elif self.iso_shift_flag: + if self.keys_dict.has_key(k) and self.keys_dict[k] and isinstance(self.keys_dict[k], str): + lst = self.keys_dict[k].split('+') + for cmd in lst: + self.sock.send_message("Keyboard:%s" % cmd) + self.iso_shift_flag = False + elif self.keys_dict.has_key(k) and self.keys_dict and isinstance(self.keys_dict[k], int): + self.sock.send_message("Keyboard:%s" % self.keys_dict[k]) + self.iso_shift_flag = False + else: + self.iso_shift_flag = False + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) + +class SlideScreen(EdjeObject): + + def __init__(self, canvas, file, group,name, connection): + EdjeObject.__init__(self, canvas, file = file, group = group,name = name) + self.on_key_down_add(self.key_down_cb, self.x11) + #emitt events only if the mouse is inside the touch object area + (self.part_object_get('touch')).pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB) + #assign the mouse_move_cb method as a mouse move callback for the touch part of the edje object + (self.part_object_get('touch')).on_mouse_move_add(self.mouse_move_cb) + #self.on_mouse_move_add(TabletScreen.mouse_move_cb) + self.sock = connection + #this flag indicates either the user are grabing something or not on the target + self.drag_flag = False + #helps to coordenate presentation + self.keyboard_flag = True + #this float indicates the wich the method left_click_down was called, and will be + #calculated against lcu_time in left_click_up method + self.lcd_time = 0.0 + + @edje.decorators.signal_callback('mouse,down,1', 'slide_bt-left_area') + def left_click_down(self, signal, source): + if self.keyboard_flag: + self.lcd_time = time.time() + #if the user are grabing something, release it + if self.drag_flag: + self.drag_flag = False + self.sock.send_message("Mouse:#left_click") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-left_area') + def left_click_up(self, signal, source): + if self.keyboard_flag: + lcu_time = time.time() + #threshold of 0.5 seconds to grab something on the target + elapsed_time = lcu_time - self.lcd_time + if elapsed_time < 0.5: + #do a simple click + self.sock.send_message("Mouse:#left_click") + self.sock.send_message("Mouse:#left_click") + else: + #do mouse grab + self.sock.send_message("Mouse:#left_click") + self.drag_flag = True + else: + self.sock.send_message("Keyboard:%s" % "Left") + + @edje.decorators.signal_callback('mouse,up,1', 'slide_bt-right_area') + def rigth_click(self, signal, source): + if self.keyboard_flag: + self.sock.send_message("Mouse:#right_click") + self.sock.send_message("Mouse:#right_click") + else: + self.sock.send_message("Keyboard:%s" % "Right") + + def key_down_cb(self, bg, event, ee): + k = event.key + print k + if k == "Escape": + self.sock.send_message("Keyboard:Escape") + elif k == "F6": + self.keyboard_flag = not self.keyboard_flag + self.sock.send_message("Keyboard:F5") + elif k == "F8": + self.sock.send_message("Keyboard:Up") + elif k == "F7": + self.sock.send_message("Keyboard:Down") + else: + self.sock.send_message("Keyboard:%s" % k) + + def mouse_move_cb(self, part, event): + x, y = event.position.output[0], event.position.output[1] + self.sock.send_message("Mouse:"+str(x)+","+str(y)) diff --git a/pcremote-client-n8x0/kineticlist.py b/pcremote-client-n8x0/kineticlist.py new file mode 100755 index 0000000..4234176 --- /dev/null +++ b/pcremote-client-n8x0/kineticlist.py @@ -0,0 +1,400 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Gustavo Sverzut Barbieri ; André Luiz do Canto Portela +# Email :barbieri@gmail.com ; andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :This class are an adaptation of barbieri's demo 03 of edje +# :python-bindings +# ============================================================================ + +import evas +import edje +import ecore +import time + +class KineticList(evas.ClippedSmartObject): + ( + SCROLL_PAGE_FORWARD, + SCROLL_PAGE_BACKWARD, + SCROLL_STEP_FORWARD, + SCROLL_STEP_BACKWARD, + SCROLL_PIXELS_DOWN, + SCROLL_PIXELS_UP + ) = range(6) + + + def __init__(self, ecanvas, file, item_width=-1, item_height=-1, father=None): + ''' + if item_width or item_height is left out the width (resp. height) + of the List element is used. + ''' + self.father = father + evas.ClippedSmartObject.__init__(self, ecanvas) + self.elements = [] + self.objects = [] + self.w = 32 + self.h = 32 + + self.realized = False + + self.top_pos = 0 + self.last_top_pos = 0 + self.last_start_row = -1 + + self.canvas = ecanvas + self.edje_file = file + + self.row_width = item_width + self.row_height = item_height + + self.__manage_objects() + + self.mouse_down = False + self.last_y_pos = 0 + self.start_pos = 0 + self.mouse_moved = False + self.continue_scrolling = False + self.is_scrolling = False + self.do_freeze = False + + def freeze(self): + self.do_freeze = True + + def thaw(self): + self.do_freeze = False + if self.realized: + self.__update_variables_after_new_elements() + self.__update_screen() + + def scroll(self, scroll_type, amount=1): + self.continue_scrolling = False + + if scroll_type == self.SCROLL_PAGE_FORWARD: + self.top_pos += amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_PAGE_BACKWARD: + self.top_pos -= amount * self.row_height * self.max_visible_rows + elif scroll_type == self.SCROLL_STEP_FORWARD: + self.top_pos += amount * self.row_height + elif scroll_type == self.SCROLL_STEP_BACKWARD: + self.top_pos -= amount * self.row_height + elif scroll_type == self.SCROLL_PIXELS_DOWN: + self.top_pos += amount + elif scroll_type == self.SCROLL_PIXELS_UP: + self.top_pos -= amount + else: + return + + self.__update_screen() + + def __on_mouse_clicked(self, edje_obj, emission, source, data=None): + #for obj in self.objects: + # if obj != edje_obj: + # obj.signal_emit("fadeout", "") + + #edje_obj.signal_emit("open", "") + #TODO:portela - it works! :D + edje_obj.signal_emit("program,start","label") + #we are setting up the choice's text on the main edje object + self.parent_get().part_text_set("choice",edje_obj.part_text_get("label")) + + def __on_mouse_move(self, edje_obj, emission, source, data=None): + if self.mouse_down: + x_pos, y_pos = self.canvas.pointer_canvas_xy + diff = int(self.last_y_pos - y_pos) + + if diff == 0: + return + + self.mouse_moved = True + + # Reset the data if the direction of the mouse move is changed + if self.last_diff != -1 and (diff < 0) != (self.last_diff < 0): + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + + self.last_diff = diff + self.top_pos += diff + + self.last_y_pos = y_pos + self.__update_screen() + self.last_update_time = time.time() + + #TODO: portela mod + def __on_blink_ended(self, edje_obj, emission, source, data=None): + for obj in self.objects: + obj.signal_emit("program,start,fade,out","label") + #we are sending a signal for the application connect the target + self.parent_get().signal_emit("connect_to","choice") + + #TODO: portela mod + + def show_list(self): + for obj in self.objects: + obj.signal_emit("program,start,fade,in","label") + + def __on_mouse_down(self, edje_obj, emission, source, data=None): + if not self.is_scrolling: + self.mouse_moved = False + + self.continue_scrolling = False + self.mouse_down = True + + x_pos, y_pos = self.canvas.pointer_canvas_xy + + self.last_diff = -1 + self.last_y_pos = y_pos + self.start_pos = y_pos + self.start_time = time.time() + self.last_update_time = time.time() + + def __on_mouse_up(self, edje_obj, emission, source, data=None): + if self.mouse_down: + self.mouse_down = False + + x_pos, end_pos = self.canvas.pointer_canvas_xy + + if not self.mouse_moved and not self.is_scrolling: + #self.__on_mouse_clicked(edje_obj, emission, source) + return + + self.mouse_moved = False + self.is_scrolling = False + + # do not scroll automatically if the finger was paused + if time.time() - self.last_update_time > 0.1: + return + + end_time = time.time() + + pos_diff = end_pos - self.start_pos + time_diff = end_time - self.start_time + + self.pixel_per_sec = pos_diff / time_diff + self.continue_scrolling = True + self.__do_scroll() + + def __do_scroll(self): + self.is_scrolling = True + + if self.continue_scrolling == False: + return + + diff = int(self.pixel_per_sec / 10) + + if abs(self.pixel_per_sec) - diff <= self.row_height: + offset = self.top_pos % self.row_height + + if offset >= self.row_height / 2: + self.sign = 1 + offset = self.row_height - offset + else: + self.sign = -1 + + self.pixels_left = offset + self.__do_magnetic_scroll() + + return + + if diff != 0: + self.top_pos -= diff + self.pixel_per_sec -= self.pixel_per_sec / 10 + self.__update_screen() + + ecore.timer_add(0.02, self.__do_scroll) + + def __do_magnetic_scroll(self): + if self.pixels_left <= 0 or abs(self.pixel_per_sec) < 1: + self.mouse_moved = False + self.is_scrolling = False + return + + self.pixel_per_sec -= (self.pixel_per_sec / 10) + + pixels_to_substract = int(abs(self.pixel_per_sec / 10)) + if abs(pixels_to_substract) < 1: + pixels_to_substract = 1 + + if self.pixels_left - pixels_to_substract > 0: + self.pixels_left -= pixels_to_substract + self.top_pos += self.sign * pixels_to_substract + else: + self.top_pos += self.sign * self.pixels_left + self.pixels_left = 0 + + self.__update_screen() + ecore.timer_add(0.1, self.__do_magnetic_scroll) + + def row_add(self, label): + self.elements.append(label) + + if not self.do_freeze: + self.__update_variables_after_new_elements() + self.__update_screen() + + def __manage_objects(self): + remain = (self.h % self.row_height) > 1 + needed_objects = ((self.h / self.row_height) + 1 + remain) * (self.w / self.row_width) + current_objects = len(self.objects) + + if current_objects < needed_objects: + for i in range(current_objects, needed_objects): + obj = edje.Edje(self.canvas); + obj.file_set(self.edje_file, "list_item"); + + obj.signal_callback_add("mouse,move", "*", + self.__on_mouse_move) + obj.signal_callback_add("mouse,down,*", "*", + self.__on_mouse_down) + obj.signal_callback_add("mouse,up,*", "*", + self.__on_mouse_up) + #TODO: portela mod + obj.signal_callback_add("animation_blink_ended", "label", + self.__on_blink_ended) + obj.signal_callback_add("mouse,clicked,*", "label", + self.__on_mouse_clicked) + obj.size = (self.row_width, self.row_height) + obj.clip = self + self.objects.append(obj) + + elif needed_objects < current_objects: + for i in range(needed_objects, current_objects): + pass # Make this work, it throws exception that makes + # things stop working properly + #del self.objects[i] + + def __update_variables_after_resize(self): + self.max_visible_rows = (self.h / self.row_height) + 1 + self.max_horiz_elements = (self.w / self.row_width) + self.max_visible_elements = self.max_visible_rows * \ + self.max_horiz_elements + + # Invalidate variable in order to repaint all rows + # Some might not have been painted before (Didn't + # fit on the screen + self.last_start_row = -1 + + self.__update_variables_after_new_elements() + + def __update_variables_after_new_elements(self): + if not self.realized: + return + + self.min_pos = 0 + remainer1 = (len(self.elements) % self.max_horiz_elements) > 0 + remainer2 = (self.h % self.row_height) > 0 + self.row_amount = (len(self.elements) / self.max_horiz_elements) + \ + remainer1 + remainer2 + self.max_pos = self.row_height * \ + (self.row_amount - self.max_visible_rows + 1) + + def __update_screen(self): + remainer = (self.h % self.row_height) > 0 + row_offset = (self.top_pos / self.row_height) + pixel_offset = - (self.top_pos % self.row_height) + start_row = row_offset + end_row = self.max_visible_rows + row_offset + remainer + + SCROLL_DOWN = self.top_pos > self.last_top_pos + SCROLL_UP = self.top_pos < self.last_top_pos + + # Let's not move over the last element + if SCROLL_DOWN and self.last_top_pos >= self.max_pos: + self.top_pos = self.max_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Let's not move over the first element + if SCROLL_UP and self.last_top_pos <= self.min_pos: + self.top_pos = self.min_pos + self.last_top_pos = self.top_pos + self.continue_scrolling = False + return + + # Overflow scrolling down + if SCROLL_DOWN and end_row > self.row_amount: + offset = end_row - self.row_amount + end_row -= offset + start_row -= offset + row_offset -= offset - 1 + self.top_pos = self.max_pos + pixel_offset = 0 + + # Overflow scrolling up + if SCROLL_UP and start_row < 0: + self.top_pos = self.min_pos + end_row -= start_row + start_row = 0 + row_offset = 0 + pixel_offset = 0 + + self.last_top_pos = self.top_pos + + if start_row != self.last_start_row: + for i in range(0, len(self.objects)): + self.objects[i].hide() + + for i in range(start_row, end_row): + row_iter = i - start_row + + for k in range(self.max_horiz_elements): + obj_iter = row_iter * self.max_horiz_elements + k + data_iter = i * self.max_horiz_elements + k + + try: + label = self.elements[data_iter] + except Exception, e: + break; + + offset = (self.w % + (self.row_width * self.max_horiz_elements)) / 2 + x = self.row_width * k + self.top_left[0] + offset + y = self.top_left[1] + self.row_height * (i - row_offset) - \ + 5 + pixel_offset + + self.objects[obj_iter].move(x, y) + + if start_row != self.last_start_row: + self.objects[obj_iter].part_text_set("label", label) + self.objects[obj_iter].show() + + self.last_start_row = start_row + + def resize(self, w, h): + if self.row_width == -1 or self.row_width == self.w: + self.row_width = w + + if self.row_height == -1 or self.row_height == self.h: + self.row_height = h + + self.w = w + self.h = h + + self.__manage_objects() + + for obj in self.objects: + obj.size = (self.row_width, self.row_height) + + self.realized = True + self.__update_variables_after_resize() + self.__update_screen() diff --git a/pcremote-client-n8x0/pcremote-client b/pcremote-client-n8x0/pcremote-client new file mode 100755 index 0000000..b28bdfe --- /dev/null +++ b/pcremote-client-n8x0/pcremote-client @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-client/pcremote-client.py diff --git a/pcremote-client-n8x0/pcremote-client.desktop b/pcremote-client-n8x0/pcremote-client.desktop new file mode 100755 index 0000000..f712a0a --- /dev/null +++ b/pcremote-client-n8x0/pcremote-client.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.60 +Type=Application +Icon=pcremote +Name=PCRemote Client +Exec=pcremote-client +X-Window-Icon=pcremote +X-Window-Icon-Dimmed=pcremote +Terminal=false +Categories=Application;Network; +StartupNotify=false diff --git a/pcremote-client-n8x0/pcremote-client.py b/pcremote-client-n8x0/pcremote-client.py new file mode 100755 index 0000000..14e5a9e --- /dev/null +++ b/pcremote-client-n8x0/pcremote-client.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 Zagaia - INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :Andre Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote custom Edje object with it's own call backs for the +# main screen +# ============================================================================ + +from ecore import main_loop_begin +import ecore.evas +import sys +import os +from edje_objects import * +from connection.iconnection import Iconnection +from screenmanager import ScreenManager + +width, height = 800, 480 + +#any argument deactivates fullscreen +if sys.argv.__len__() > 1: + screen = False +else: + screen = True +#if x11_16 is present, get it, otherwise get x11 +if ecore.evas.engine_type_supported_get("software_x11_16"): + engine = ecore.evas.SoftwareX11_16 +else: + engine = ecore.evas.SoftwareX11 +#create the evas canvas +canvas = EvasCanvas(fullscreen=screen,engine=engine,size=(width, height)) +#main .edj path +edje_file = os.path.join(os.path.dirname(sys.argv[0]), "pcremote.edj") +#the bluetooth socket object shared by all screens +sock = Iconnection('bluetooth') +#main edje object +main = MainScreen(canvas=canvas, file=edje_file, group="Main",name="Main", connection = sock) +main.show() +#future edje objects +tablet, slide, player, torrent = None, None, None, None +#focus on main edje object +main.focus = True +#this object connects all screens together +manager = ScreenManager(main, tablet, slide, player, torrent, sock) + +ecore.main_loop_begin() + diff --git a/pcremote-client-n8x0/pcremote.edj b/pcremote-client-n8x0/pcremote.edj new file mode 100755 index 0000000..ce5640f Binary files /dev/null and b/pcremote-client-n8x0/pcremote.edj differ diff --git a/pcremote-client-n8x0/pcremote26.png b/pcremote-client-n8x0/pcremote26.png new file mode 100755 index 0000000..e5e8183 Binary files /dev/null and b/pcremote-client-n8x0/pcremote26.png differ diff --git a/pcremote-client-n8x0/pcremote40.png b/pcremote-client-n8x0/pcremote40.png new file mode 100755 index 0000000..22b5640 Binary files /dev/null and b/pcremote-client-n8x0/pcremote40.png differ diff --git a/pcremote-client-n8x0/pcremote64.png b/pcremote-client-n8x0/pcremote64.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-client-n8x0/pcremote64.png differ diff --git a/pcremote-client-n8x0/pcremote_client_50.tar.gz b/pcremote-client-n8x0/pcremote_client_50.tar.gz new file mode 100755 index 0000000..94af7ff Binary files /dev/null and b/pcremote-client-n8x0/pcremote_client_50.tar.gz differ diff --git a/pcremote-client-n8x0/screenmanager.py b/pcremote-client-n8x0/screenmanager.py new file mode 100755 index 0000000..367f17b --- /dev/null +++ b/pcremote-client-n8x0/screenmanager.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name :PC Remote +# Author :André Portela +# Email :andre_portela_@hotmail.com +# Version :1.0 +# Module :main +# Class :PCRemote ScreenManager handles the finite state machine which +# controls the navigation between screens. +# ============================================================================ + +from edje_objects import * +import os +import sys + +class ScreenManager(object): + ''' + classdocs + ''' + def __init__(self, main, tablet, slide, player, torrent,socket): + ''' + Constructor + ''' + self.main = main + self.tablet = tablet + self.slide = slide + self.player = player + self.torrent = torrent + self.sock = socket + main.signal_callback_add("mouse,up,1", "Tablet",self.run_tablet) + main.signal_callback_add("mouse,up,1", "Slideshow",self.run_slide) + main.signal_callback_add("mouse,up,1", "Player",self.run_player) + main.signal_callback_add("mouse,up,1", "Torrent",self.run_torrent) + + def run_tablet(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no tablet' + #main edje object + edje.focus_set(False) + edje.hide() + if self.tablet is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "tablet.edj") + self.tablet = TabletScreen(edje.canvas_class, edje_file, 'main', 'tablet', self.sock) + self.tablet.signal_callback_add("mouse,up,1","tablet_bt-voltar_area",self.tablet_back) + self.tablet.part_text_set('pc_name',edje.sock_address) + self.tablet.show() + self.tablet.focus_set(True) + + def tablet_back(self, edje, emission, source): + #tablet edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Tablet:#stop") + self.main.show() + self.main.focus_set(True) + + def run_slide(self, edje, emission, source): + self.sock.send_message(source+":#start") + print 'entrou no slide' + #main edje object + edje.focus_set(False) + edje.hide() + if self.slide is None: + edje_file = os.path.join(os.path.dirname(sys.argv[0]), "slide.edj") + self.slide = SlideScreen(edje.canvas_class, edje_file, 'main', 'slide', self.sock) + self.slide.signal_callback_add("unselected","slide_bt-voltar",self.slide_back) + #self.slide.part_text_set('pc_name',edje.sock_address) + #this rotates the screen 90 degrees (to fit text in vertical orientation) + #self.slide.x11.rotation_set(90) + self.slide.show() + self.slide.focus_set(True) + + def slide_back(self, edje, emission, source): + #slide edje object + edje.focus_set(False) + edje.hide() + self.sock.send_message("Slideshow:#stop") + #this rotates the screen from 90 to 0 degrees (to fit text in horizontal orientation again) + #self.main.x11.rotation_set(0) + self.main.show() + self.main.focus_set(True) + + def run_player(self, edje, emission, source): + print 'not implemented yet' + + def player_back(self, edje, emission, source): + print 'not implemented yet' + + def run_torrent(self, edje, emission, source): + print 'not implemented yet' + + def torrent_back(self, edje, emission, source): + print 'not implemented yet' + diff --git a/pcremote-client-n8x0/slide.edj b/pcremote-client-n8x0/slide.edj new file mode 100755 index 0000000..d4e3119 Binary files /dev/null and b/pcremote-client-n8x0/slide.edj differ diff --git a/pcremote-client-n8x0/tablet.edj b/pcremote-client-n8x0/tablet.edj new file mode 100755 index 0000000..b50a7e4 Binary files /dev/null and b/pcremote-client-n8x0/tablet.edj differ diff --git a/pcremote-client-n8x0/utils/__init__.py b/pcremote-client-n8x0/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-client-n8x0/utils/labels.py b/pcremote-client-n8x0/utils/labels.py new file mode 100755 index 0000000..dd12186 --- /dev/null +++ b/pcremote-client-n8x0/utils/labels.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + + +# GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + +PLAY = "#play" +STOP = "#stop" +PAUSE = "#pause" +NEXT = "#next" +PREVIOUS = "#previous" +VOL_UP = "#vol_up" +VOL_DOWN = "#vol_down" +TLINE_LEFT = "#tline_left" +TLINE_RIGHT = "#tline_right" +RECORD = "#record" +#------------------------------------------> + +# GENERIC LABELS FOR APPLICATIONS + +START = "#start" +CLOSE = "#close" +FULL = "#fullscreen" +UPLOAD = "#upload" +DOWNLOAD = "#download" +SAVE = "#save" +DELETE = "#delete" +#--------------------------------> + +# GENERAL MOUSE LABELS + +CLICK = "#click" +DOUBLE_CLICK = "#double_click" +TRIPLE_CLICK = "#triple_click" +LEFT_CLICK = "#left_click" +RIGHT_CLICK = "#right_click" +MIDDLE_CLICK = "#middle_click" +#--------------------------------> + + diff --git a/pcremote-server-desktop-60/connection/.svn/entries b/pcremote-server-desktop-60/connection/.svn/entries new file mode 100755 index 0000000..e1ea3e5 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/entries @@ -0,0 +1,93 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/connection +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:21:45.815695Z +31 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +iconnection.py +file + + + + +2008-11-24T19:10:09.000000Z +5a23a701cbe84644991072a94b636f35 +2008-11-24T19:08:20.539642Z +24 +aportela +has-props + +wirelessconnectionmanager.py +file + + + + +2008-11-24T19:21:26.000000Z +518124236f6ddf6a0c67621853cd7229 +2008-11-24T19:21:45.815695Z +31 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +bluetoothconnectionmanager.py +file + + + + +2008-11-24T19:09:16.000000Z +67af5797d41770d8801ca335f011ea7f +2008-11-24T19:09:43.908566Z +25 +aportela +has-props + +genericconnectionmanager.py +file + + + + +2008-11-24T19:11:06.000000Z +159366919bc6213b7f6fae65dc603afa +2008-11-24T19:11:23.207768Z +26 +aportela +has-props + diff --git a/pcremote-server-desktop-60/connection/.svn/format b/pcremote-server-desktop-60/connection/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/connection/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/connection/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop-60/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..085986a --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,9 @@ +K 14 +svn:executable +V 1 +* +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/connection/.svn/prop-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop-60/connection/.svn/prop-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/prop-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/connection/.svn/prop-base/iconnection.py.svn-base b/pcremote-server-desktop-60/connection/.svn/prop-base/iconnection.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/prop-base/iconnection.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop-60/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/connection/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/connection/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop-60/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..bda3c98 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop-60/connection/.svn/text-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop-60/connection/.svn/text-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/text-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop-60/connection/.svn/text-base/iconnection.py.svn-base b/pcremote-server-desktop-60/connection/.svn/text-base/iconnection.py.svn-base new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/text-base/iconnection.py.svn-base @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop-60/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop-60/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop-60/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop-60/connection/__init__.py b/pcremote-server-desktop-60/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/connection/__init__.pyc b/pcremote-server-desktop-60/connection/__init__.pyc new file mode 100644 index 0000000..e8fac67 Binary files /dev/null and b/pcremote-server-desktop-60/connection/__init__.pyc differ diff --git a/pcremote-server-desktop-60/connection/bluetoothconnectionmanager.py b/pcremote-server-desktop-60/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..581b0f8 --- /dev/null +++ b/pcremote-server-desktop-60/connection/bluetoothconnectionmanager.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + print list_devices + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop-60/connection/bluetoothconnectionmanager.pyc b/pcremote-server-desktop-60/connection/bluetoothconnectionmanager.pyc new file mode 100644 index 0000000..1d789c6 Binary files /dev/null and b/pcremote-server-desktop-60/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-server-desktop-60/connection/genericconnectionmanager.py b/pcremote-server-desktop-60/connection/genericconnectionmanager.py new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop-60/connection/genericconnectionmanager.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop-60/connection/genericconnectionmanager.pyc b/pcremote-server-desktop-60/connection/genericconnectionmanager.pyc new file mode 100644 index 0000000..46c403d Binary files /dev/null and b/pcremote-server-desktop-60/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-server-desktop-60/connection/iconnection.py b/pcremote-server-desktop-60/connection/iconnection.py new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop-60/connection/iconnection.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop-60/connection/iconnection.pyc b/pcremote-server-desktop-60/connection/iconnection.pyc new file mode 100644 index 0000000..11df774 Binary files /dev/null and b/pcremote-server-desktop-60/connection/iconnection.pyc differ diff --git a/pcremote-server-desktop-60/connection/wirelessconnectionmanager.py b/pcremote-server-desktop-60/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop-60/connection/wirelessconnectionmanager.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop-60/connection/wirelessconnectionmanager.pyc b/pcremote-server-desktop-60/connection/wirelessconnectionmanager.pyc new file mode 100644 index 0000000..b5f907c Binary files /dev/null and b/pcremote-server-desktop-60/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-server-desktop-60/debian/README.Debian b/pcremote-server-desktop-60/debian/README.Debian new file mode 100755 index 0000000..dddb9de --- /dev/null +++ b/pcremote-server-desktop-60/debian/README.Debian @@ -0,0 +1,6 @@ +pcremote-server for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-server-desktop-60/debian/changelog b/pcremote-server-desktop-60/debian/changelog new file mode 100755 index 0000000..9cc4a68 --- /dev/null +++ b/pcremote-server-desktop-60/debian/changelog @@ -0,0 +1,6 @@ +pcremote-server (0.60-1) unstable; urgency=low + + * Initial release (Closes: #nnnn) + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 + diff --git a/pcremote-server-desktop-60/debian/compat b/pcremote-server-desktop-60/debian/compat new file mode 100755 index 0000000..1e8b314 --- /dev/null +++ b/pcremote-server-desktop-60/debian/compat @@ -0,0 +1 @@ +6 diff --git a/pcremote-server-desktop-60/debian/control b/pcremote-server-desktop-60/debian/control new file mode 100755 index 0000000..e0b98e3 --- /dev/null +++ b/pcremote-server-desktop-60/debian/control @@ -0,0 +1,11 @@ +Source: pcremote-server +Section: net +Priority: optional +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Build-Depends: debhelper (>= 5) +Standards-Version: 3.7.2 + +Package: pcremote-server +Architecture: all +Depends: python2.5, python2.5-gtk2, python-bluetooth, python-xlib, python2.5-notify, python-dcop +Description: A server application of PCRemote Client diff --git a/pcremote-server-desktop-60/debian/copyright b/pcremote-server-desktop-60/debian/copyright new file mode 100755 index 0000000..8520c24 --- /dev/null +++ b/pcremote-server-desktop-60/debian/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Server + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-server-desktop-60/debian/dirs b/pcremote-server-desktop-60/debian/dirs new file mode 100755 index 0000000..d4d5362 --- /dev/null +++ b/pcremote-server-desktop-60/debian/dirs @@ -0,0 +1,7 @@ +usr/bin +usr/share/pcremote-server +usr/share/pcremote-server/images +usr/share/applications +usr/share/icons/hicolor/48x48/ +usr/share/menu + diff --git a/pcremote-server-desktop-60/debian/docs b/pcremote-server-desktop-60/debian/docs new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/files b/pcremote-server-desktop-60/debian/files new file mode 100755 index 0000000..827d4d5 --- /dev/null +++ b/pcremote-server-desktop-60/debian/files @@ -0,0 +1 @@ +pcremote-server_0.60-1_all.deb net optional diff --git a/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/control b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/control new file mode 100755 index 0000000..a4c3f2a --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/control @@ -0,0 +1,9 @@ +Package: pcremote-server +Version: 0.50-1 +Architecture: all +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Installed-Size: 461 +Depends: python-bluetooth, python-dcop, python-xlib, python2.5, python2.5-gtk2, python2.5-notify +Section: net +Priority: optional +Description: A server application of PCRemote Client diff --git a/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/md5sums b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/md5sums new file mode 100755 index 0000000..9213ec0 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/md5sums @@ -0,0 +1,95 @@ +1753f2a532e9218207f37d8deab8d559 usr/bin/pcremote-server +a45cefda3455e840e85003b8b01fab75 usr/share/doc/pcremote-server/README.Debian +c8953c952799be3f2e28d1144864b68a usr/share/doc/pcremote-server/copyright +76f32feb0e14910d0ba95ec54e235fb2 usr/share/doc/pcremote-server/changelog.Debian.gz +edfe58d9bcd05825af84b80c77794cc9 usr/share/menu/pcremote-server-menu +2553d9134379e7199e7bb4c8995467f9 usr/share/icons/pcremote.png +c228a4f323d17e3a589b979e11f2cbc6 usr/share/pcremote-server/pcremote-server.py +e2f5948c1c71348f50834f5579aa2448 usr/share/pcremote-server/utils/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/utils/.svn/format +606a6ee70138fd606222cd4c3162cc3f usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/utils/.svn/text-base/__init__.py.svn-base +6c9741bd79bbd0f1ac82d2d98614032d usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base +4160c74de5f4e580dc15660c798ff9fc usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base +5eed0b1df833b280b647cf2e6d5a8e98 usr/share/pcremote-server/utils/messages.py +e611e04d448a689e17eb788c910721f1 usr/share/pcremote-server/utils/labels.py +7b7040ac3d2fed14a34e738957629dc1 usr/share/pcremote-server/utils/labels.pyc +63a0bef02a2757c61ead56bf6796d60f usr/share/pcremote-server/utils/plistparser.pyc +a7e8dfcbaa82ac40a6bf395d517cbddc usr/share/pcremote-server/utils/__init__.pyc +8923dc021f420a77b5a28f721c232cbf usr/share/pcremote-server/utils/.messages.py.swp +606a6ee70138fd606222cd4c3162cc3f usr/share/pcremote-server/utils/plistparser.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/utils/__init__.py +59724740128fb59b5dd1273401874252 usr/share/pcremote-server/utils/messages.pyc +c5110a93e1ffa5b18c635ded207d76fb usr/share/pcremote-server/runserver.py +19faca80edd182a92fe6f64d73aebb42 usr/share/pcremote-server/exceptions/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/exceptions/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/exceptions/.svn/text-base/__init__.py.svn-base +41e514c3297ce38f7bd5d4f687fcaa9b usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base +41e514c3297ce38f7bd5d4f687fcaa9b usr/share/pcremote-server/exceptions/exception.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/exceptions/__init__.py +524491cd9ca8dea18f30ef233cb8978e usr/share/pcremote-server/connection/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/connection/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/connection/.svn/text-base/__init__.py.svn-base +5a23a701cbe84644991072a94b636f35 usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base +159366919bc6213b7f6fae65dc603afa usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base +518124236f6ddf6a0c67621853cd7229 usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base +67af5797d41770d8801ca335f011ea7f usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base +40c3baa616b5b755cc1cecd8a5f1b3ad usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base +d1482494e6bb3303ce0429ffa850dc35 usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc +159366919bc6213b7f6fae65dc603afa usr/share/pcremote-server/connection/genericconnectionmanager.py +5a23a701cbe84644991072a94b636f35 usr/share/pcremote-server/connection/iconnection.py +9a80f72334e101112f47fa9ec901112f usr/share/pcremote-server/connection/iconnection.pyc +5bc7343620d48d1ecea605b8af19ec84 usr/share/pcremote-server/connection/genericconnectionmanager.pyc +a5321f2c5c98bd3c8450df64a004583c usr/share/pcremote-server/connection/__init__.pyc +518124236f6ddf6a0c67621853cd7229 usr/share/pcremote-server/connection/wirelessconnectionmanager.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/connection/__init__.py +04c9700d63f069c392d0a0dc50a6f86a usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc +41b5d259ee21e96f37d46057de1286b9 usr/share/pcremote-server/connection/bluetoothconnectionmanager.py +2e2252560040d89f8e5f2d1be0fa5fd0 usr/share/pcremote-server/images/28x.png +bd14172f103bc22fd71d207f73288798 usr/share/pcremote-server/images/PCR_off.bmp +78b30ee0922a6dea20e4994d55138f94 usr/share/pcremote-server/images/remote48x.png +c2b65883ae6c4abe9f4c07ed14fe2a14 usr/share/pcremote-server/images/PCR_on.bmp +2553d9134379e7199e7bb4c8995467f9 usr/share/pcremote-server/images/64x.png +377847b28c4975963ce8219842ce8aea usr/share/pcremote-server/services/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/services/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/services/.svn/text-base/__init__.py.svn-base +61fef10722e4d9d7faac93a03ac1ceb1 usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base +5c25986a6c09a7313d8f5f51b509a5e6 usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base +10874c65035a891cb60e1ccb8b2bdb4f usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base +e3bc8888bb26adc2ae1080f7fcf17775 usr/share/pcremote-server/services/ObjectServers.pyc +8ad0339242867f55475269131c4583fb usr/share/pcremote-server/services/ObjectServers.py +d2fa096c8b7a13f49b951b095c56a488 usr/share/pcremote-server/services/service.py +92eb3a43b65d8623450a4da25a3253c5 usr/share/pcremote-server/services/__init__.pyc +e51233968b28ef0cc4432ac5f0551bc6 usr/share/pcremote-server/services/service.pyc +e17b75b7195bde77678f182c9c3d6c75 usr/share/pcremote-server/services/ServerHandlers.pyc +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/services/__init__.py +9f1fa958a013f07a15371fa87c86db61 usr/share/pcremote-server/services/ServerHandlers.py +9c5bd8128615edd69f3305403d986d0b usr/share/pcremote-server/players/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/players/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/players/.svn/text-base/__init__.py.svn-base +094e2893e7aec596fb90a6607a859c75 usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base +b34d77d5e136ac5cb2fb4c25d9de4d05 usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base +4160c74de5f4e580dc15660c798ff9fc usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base +4160c74de5f4e580dc15660c798ff9fc usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base +8b5f2d28c14e6692bba63297265922bb usr/share/pcremote-server/players/amarok.py +54de8542cfadb0d06ed031f99708b188 usr/share/pcremote-server/players/plistparser.pyc +f48363745edc09905b10e795e20e3b93 usr/share/pcremote-server/players/__init__.pyc +a9c843b72e72ba346236f98a9f5e7e44 usr/share/pcremote-server/players/playlist.pyc +a0b92dcdc153c3de2ba3b56cb2a2d9b2 usr/share/pcremote-server/players/amarok.pyc +85eaeb39ee8b3d24aae6a12fcfe63bbf usr/share/pcremote-server/players/run-amarok.py +606a6ee70138fd606222cd4c3162cc3f usr/share/pcremote-server/players/plistparser.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/players/__init__.py +36827397437058edc107018640a1c2bc usr/share/pcremote-server/players/playlist.py +9aa2031a03c14f89f570789b8abebaa8 usr/share/applications/pcremote-server.desktop diff --git a/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/postinst b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/postinst new file mode 100755 index 0000000..d183a6b --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/postinst @@ -0,0 +1,9 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + +#ln -s /usr/share/pcremote-server/pcremote-server.py /usr/bin/pcremote-server.py +#chmod +x /usr/bin/pcremote-server.py diff --git a/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/postrm b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/postrm new file mode 100755 index 0000000..4fa6e54 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/DEBIAN/postrm @@ -0,0 +1,25 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/pcremote-server.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-server + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-server + +# Delete the pcremote icon +rm -f /usr/share/icons/hicolor/48x48/pcremote.png + +# Delete the pcremote menu +rm -f /usr/share/menu/pcremote-server-menu + +exit 0 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/bin/pcremote-server b/pcremote-server-desktop-60/debian/pcremote-server/usr/bin/pcremote-server new file mode 100755 index 0000000..de17562 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/bin/pcremote-server @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-server/pcremote-server.py diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/applications/pcremote-server.desktop b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/applications/pcremote-server.desktop new file mode 100755 index 0000000..c9d5a8c --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/applications/pcremote-server.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.50 +Type=Application +Icon=/usr/share/hicolor/48x48/pcremote.png +Name=PCRemote Server +Exec=pcremote-server +Terminal=false +Categories=Application;Network;GTK; +StartupNotify=true diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/README.Debian b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/README.Debian new file mode 100755 index 0000000..fdaa542 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/README.Debian @@ -0,0 +1,6 @@ +pcremote-client for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/changelog.Debian.gz b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/changelog.Debian.gz new file mode 100755 index 0000000..f3562ff Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/changelog.Debian.gz differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/copyright b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/copyright new file mode 100755 index 0000000..8520c24 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/doc/pcremote-server/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Server + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/icons/pcremote.png b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/icons/pcremote.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/icons/pcremote.png differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/menu/pcremote-server-menu b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/menu/pcremote-server-menu new file mode 100755 index 0000000..d7fea37 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/menu/pcremote-server-menu @@ -0,0 +1,6 @@ +?package(pcremote-server): \ + needs="X11" \ + section:"Applications/Network" \ + title="PCRemote Server" \ + command="pcremote-server" \ + icon="/usr/share/icons/hicolor/48x48/pcremote.png" diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/entries b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/entries new file mode 100755 index 0000000..e1ea3e5 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/entries @@ -0,0 +1,93 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/connection +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:21:45.815695Z +31 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +iconnection.py +file + + + + +2008-11-24T19:10:09.000000Z +5a23a701cbe84644991072a94b636f35 +2008-11-24T19:08:20.539642Z +24 +aportela +has-props + +wirelessconnectionmanager.py +file + + + + +2008-11-24T19:21:26.000000Z +518124236f6ddf6a0c67621853cd7229 +2008-11-24T19:21:45.815695Z +31 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +bluetoothconnectionmanager.py +file + + + + +2008-11-24T19:09:16.000000Z +67af5797d41770d8801ca335f011ea7f +2008-11-24T19:09:43.908566Z +25 +aportela +has-props + +genericconnectionmanager.py +file + + + + +2008-11-24T19:11:06.000000Z +159366919bc6213b7f6fae65dc603afa +2008-11-24T19:11:23.207768Z +26 +aportela +has-props + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/format b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..085986a --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,9 @@ +K 14 +svn:executable +V 1 +* +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..bda3c98 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.pyc new file mode 100755 index 0000000..a2fa83b Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..581b0f8 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + print list_devices + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc new file mode 100755 index 0000000..a829ae4 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.py new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.pyc new file mode 100755 index 0000000..6dca356 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.py new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.pyc new file mode 100755 index 0000000..bba16a9 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc new file mode 100755 index 0000000..de37a7c Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/entries b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/entries new file mode 100755 index 0000000..fb958a2 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/entries @@ -0,0 +1,54 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/exceptions +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:15:49.820782Z +27 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +exception.py +file + + + + +2008-11-24T19:15:30.000000Z +41e514c3297ce38f7bd5d4f687fcaa9b +2008-11-24T19:15:49.820782Z +27 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/format b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/__init__.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/exception.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/exception.py new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/exceptions/exception.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/28x.png b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/28x.png new file mode 100755 index 0000000..9c918db Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/28x.png differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/64x.png b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/64x.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/64x.png differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/PCR_off.bmp b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/PCR_off.bmp new file mode 100755 index 0000000..c686d43 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/PCR_off.bmp differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/PCR_on.bmp b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/PCR_on.bmp new file mode 100755 index 0000000..84f4109 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/PCR_on.bmp differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/remote48x.png b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/remote48x.png new file mode 100755 index 0000000..22b5640 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/images/remote48x.png differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/pcremote-server.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/pcremote-server.py new file mode 100755 index 0000000..e1b5e07 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/pcremote-server.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +from runserver import Server +import gtk +import thread +import sys + +class Service: + + def start_server(self, widget): + + if self.connected == False: + imagepath = self.images.replace('pcremote-server.py','images/PCR_on.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Online") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_MENU) + self.menuItemCon.set_image(img) + + self.srv = Server("PC Remote") + thread.start_new_thread(Server.start,(self.srv,"server")) + + else: + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Offline") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) + + self.menuItemCon.set_image(img) + + thread.exit_thread() + + self.connected = not self.connected + + def destroyer(self, widget,response_id, data= None): + if response_id == gtk.RESPONSE_OK: + gtk.main_quit() + else: + widget.hide() + + def popup(self, widget): + dialog = gtk.MessageDialog( + parent = None, + flags = gtk.DIALOG_DESTROY_WITH_PARENT, + type = gtk.MESSAGE_INFO, + buttons = gtk.BUTTONS_OK_CANCEL, + message_format = "Do you want to shut the server down?") + dialog.set_title('PC Remote Server') + dialog.connect('response', self.destroyer) + dialog.show() + + def popup_menu_cb(self, widget, button, time, data = None): + if button == 3: + if data: + data.show_all() + data.popup(None, None, None, 3, time) + + + def __init__(self): + + self.images = sys.argv[0] + self.connected = False + + self.staticon = gtk.StatusIcon() + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server(offline)") + + self.menu = gtk.Menu() + + self.menuItemCon = gtk.ImageMenuItem(gtk.STOCK_EXECUTE) + self.menuItemCon.connect('activate', self.start_server) + + self.menuItemExit = gtk.ImageMenuItem(gtk.STOCK_QUIT) + self.menuItemExit.connect('activate', self.popup) + + self.menu.append(self.menuItemCon) + self.menu.append(self.menuItemExit) + + self.staticon.connect('popup-menu', self.popup_menu_cb, self.menu) + + self.staticon.set_visible(True) + + gtk.gdk.threads_init() + gtk.gdk.threads_enter() + + gtk.main() + + gtk.gdk.threads_leave() + +print sys.argv +Srv = Service() + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/entries b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/entries new file mode 100755 index 0000000..2e7676e --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/entries @@ -0,0 +1,66 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/players +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:19:59.926000Z +42 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +amarok.py +file + + + + +2008-11-24T19:22:32.000000Z +b34d77d5e136ac5cb2fb4c25d9de4d05 +2008-11-24T19:22:46.499502Z +32 +aportela +has-props + +__init__.py +file + + + + +2008-11-21T20:05:30.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-11-21T20:06:45.989300Z +12 +aportela + +playlist.py +file + + + + +2008-11-24T19:23:01.000000Z +094e2893e7aec596fb90a6607a859c75 +2008-11-24T19:23:20.208723Z +33 +aportela +has-props + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/format b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base new file mode 100755 index 0000000..5e235b3 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + +# starts the amarok player application +def start(): + os.popen('amarok') + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def audio_file_properties(self, index=None): + audiofile = (self.playlist.song_filename(index),\ + self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + def play(self): + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + def play_track(self, index): + self.amarok.playlist.playByIndex(index-1) + self.playlist.update(index, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # random play songs + def play_random(self): + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index+1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base new file mode 100755 index 0000000..0cbc97b --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong - 1]['title'] == 'Unknown Title': + self.songs[self.currentSong - 1]['title'] = title + if self.songs[self.currentSong - 1]['artist'] == 'Unknown Artist': + self.songs[self.currentSong - 1]['artist'] = artist + self.songs[self.currentSong - 1]['path'] = path + self.songs[self.currentSong - 1]['extension'] = ext + print self.songs[self.currentSong - 1] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong - 1]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong - 1]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong - 1]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong-1]['title'] +" - "+\ + self.songs[self.currentSong-1]['artist'] + \ + self.songs[self.currentSong-1]['extension'] + + else: + return self.songs[index-1]['title'] +" - "+\ + self.songs[index-1]['artist'] + \ + self.songs[index-1]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong-1]['filesize']) + else: + return int(self.songs[index-1]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong-1]['track'] + if title: + props['title'] = self.songs[self.currentSong-1]['title'] + if artist: + props['artist'] = self.songs[self.currentSong-1]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong-1]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong-1]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong-1]['duration'] + if path: + props['path'] = self.songs[self.currentSong-1]['path'] + + return props + else: + if track: + props['track'] = self.songs[index-1]['track'] + if title: + props['title'] = self.songs[index-1]['title'] + if artist: + props['artist'] = self.songs[index-1]['artist'] + if ext: + props['ext'] = self.songs[index-1]['extension'] + if filesize: + props['filesize'] = self.songs[index-1]['filesize'] + if duration: + props['duration'] = self.songs[index-1]['duration'] + if path: + props['path'] = self.songs[index-1]['path'] + + return props + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/__init__.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/__init__.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/__init__.pyc new file mode 100755 index 0000000..559af06 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/__init__.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/amarok.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/amarok.py new file mode 100755 index 0000000..2d54fb0 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/amarok.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + + +# starts the amarok player application +def start(): + os.popen('amarok') + + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +def send_file(addr, path): + shell("bluetooth-sendto --dest=%s %s" + (addr, path)) + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def file_properties(self, index=None): + track = self.amarok.playlist.getActiveIndex() + audiofile = self.playlist.song_properties(index=track, path=True) + #audiofile = (self.playlist.song_filename(index),\ + # self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + #def play(self): + #self.amarok.player.play() + #self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(), \ + # ) + + # play button and sets current song + # receive track or random form + # the argument track has intended to manipulate + # the playlist form when the user indicate a song track + # in client application + def play(self, track=-1, rdm=False): + if rdm: + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index + 1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + elif track != -1: + self.amarok.playlist.playByIndex(track) + self.playlist.update(track-1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + else: + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + #def play_track(self, index): + # self.amarok.playlist.playByIndex(index-1) + # self.playlist.update(index, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # random play songs + #def play_random(self): + # index = random.randint(0, self.playlist.length() - 1) + # self.amarok.playlist.playByIndex(index) + # self.playlist.update(index+1, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/amarok.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/amarok.pyc new file mode 100755 index 0000000..95f5180 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/amarok.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/playlist.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/playlist.py new file mode 100755 index 0000000..31a3a61 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/playlist.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong]['title'] == 'Unknown Title': + self.songs[self.currentSong]['title'] = title + if self.songs[self.currentSong]['artist'] == 'Unknown Artist': + self.songs[self.currentSong]['artist'] = artist + self.songs[self.currentSong]['path'] = path + self.songs[self.currentSong]['extension'] = ext + print self.songs[self.currentSong] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong]['title'] +" - "+\ + self.songs[self.currentSong]['artist'] + \ + self.songs[self.currentSong]['extension'] + + else: + return self.songs[index]['title'] +" - "+\ + self.songs[index]['artist'] + \ + self.songs[index]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong]['filesize']) + else: + return int(self.songs[index]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong]['track'] + if title: + props['title'] = self.songs[self.currentSong]['title'] + if artist: + props['artist'] = self.songs[self.currentSong]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong]['duration'] + if path: + props['path'] = self.songs[self.currentSong]['path'] + + return props + else: + if track: + props['track'] = self.songs[index]['track'] + if title: + props['title'] = self.songs[index]['title'] + if artist: + props['artist'] = self.songs[index]['artist'] + if ext: + props['ext'] = self.songs[index]['extension'] + if filesize: + props['filesize'] = self.songs[index]['filesize'] + if duration: + props['duration'] = self.songs[index]['duration'] + if path: + props['path'] = self.songs[index]['path'] + + return props + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/playlist.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/playlist.pyc new file mode 100755 index 0000000..185f310 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/playlist.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.pyc new file mode 100755 index 0000000..ab2a86a Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/run-amarok.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/run-amarok.py new file mode 100755 index 0000000..2d8e9bf --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/players/run-amarok.py @@ -0,0 +1,43 @@ +import amarok + +if not amarok.isRunning(): + player = amarok.AmarokPlayer() +else: + print "entrou aqui" + amarok.start() + player = amarok.AmarokPlayer() + +while(1): + data = raw_input(">>> ") + if data == '#exit' or data == '#quit' or data == '#close': + print "Application closed." + amarok.shutdown() + break + elif data == 'next': + player.next() + elif data == 'prev': + player.prev() + elif data == 'play': + player.play() + elif data == 'pause': + player.pause() + elif data == 'stop': + player.stop() + elif data == 'mute': + player.mute() + elif data == 'volume-up': + player.volume_up() + elif data == 'volume-down': + player.volume_down() + elif data == 'current_song': + print player.current_song() + elif data == 'random': + player.play_random() + elif data == 'play-track': + index = input('track: ') + player.play_track(index) + elif data == 'refresh': + player.refresh_playlist() + elif data == 'show': + player.song_list() + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/runserver.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/runserver.py new file mode 100755 index 0000000..01ece58 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/runserver.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson ; Jonatas Izvi; Andre Portela +# Email : fergus.mao@gmail.com ; nona@gmail.com ; +# andre_portela_@hotmail.com; +# Version : 1.0 +# Class : Server File - This is the main script of the server +# ============================================================================ + +from connection.iconnection import * +from services.service import * +from utils import * +from utils.messages import * + +class Server(): + + def __init__(self, AppName): + self.msgbox = Message(AppName) + self.msgbox.show_message("Server Initialized...") + + def start(self, servername): + + label = Labels() + iconn = Iconnection('blue') + iconn.bluetooth_create_server('l2cap', 0x1001) + + address = iconn.get_client_address() + + self.msgbox.show_message("Accepted connection from " + address[0]) + + while (1): + + data = iconn.received_message() + + if data == 'Tablet:#start': + + self.msgbox.show_message('Service Tablet initialized...') + + service = Service() + service.set_service('Tablet') + + while(1): + data = iconn.received_message() + if data == 'Tablet:#stop': + service.clean_all() + self.msgbox.show_message('Service Tablet stoped') + break + service.execute(data) + + elif data == 'Slideshow:#start': + + self.msgbox.show_message('Service Slideshow initialized...') + + service = Service() + service.set_service('Slideshow') + + while(1): + data = iconn.received_message() + if data == 'Slideshow:#stop': + service.clean_all() + self.msgbox.show_message('Service Slideshow stoped') + break + print data, "\n" + service.execute(data) + + elif data == 'Player:#start': + + self.msgbox.show_message('Service Player initialized...') + + service = Service() + service.set_service('Player') + + while(1): + data = iconn.received_message() + if data == 'Player:#stop': + self.msgbox.show_message('Service Player stoped') + break + elif data == 'Player:#download': + service.set_address_to_download(address[0]) + elif data == 'Player:#load_playlist': + # e preciso criar um metodo de transferencia + # no caso de carregar uma playlist para o cliente + service.execute_transfer(data) + + service.execute(data) + + else: + exit(1) + + self.msgbox.show_message('Desconected from ' + address[0]) diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/entries b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/entries new file mode 100755 index 0000000..11b2d8a --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/entries @@ -0,0 +1,80 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/services +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T21:43:13.543262Z +39 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +ObjectServers.py +file + + + + +2008-11-24T21:42:50.000000Z +61fef10722e4d9d7faac93a03ac1ceb1 +2008-11-24T21:43:13.543262Z +39 +aportela +has-props + +service.py +file + + + + +2008-11-24T21:41:33.000000Z +10874c65035a891cb60e1ccb8b2bdb4f +2008-11-24T21:41:51.237514Z +37 +aportela +has-props + +ServerHandlers.py +file + + + + +2008-11-24T21:42:13.000000Z +5c25986a6c09a7313d8f5f51b509a5e6 +2008-11-24T21:42:30.576563Z +38 +aportela +has-props + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/format b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..33e5a17 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self): + + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + self.mouse.position(i, j) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up_mouse(self): + self.mouse.clean_up_mouse() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self.keys = [] + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(command == 'ISO_Level3_Shift'): + self.keyboard.reproduce_key_press('Escape') + self.keyboard.reproduce_key_release('Escape') + pass + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + self.keys.append(command) + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + else: + + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + self.keys.remove('Control_R') + self.control_flag = False + + # clean all keys pressed + def clean_up_keyboard(self): + print "\nkeys -> ", self.keys + list = self.keys + print "\nlist ->", list + for i in list: + self.keyboard.reproduce_key_release(i) + self.keys.remove(i) + print "\nkey --> ", i, " removed." + + print self.keys diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..352d1e7 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up_mouse(self): + list = self.buttons + print list + for i in list: + if i == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nleft_button -> release." + elif i == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove(i) + print "\nmiddle_button -> release." + elif i == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nright_button -> release." + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base new file mode 100755 index 0000000..b0143a0 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.service = "" + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Player': + print "player service." + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up_mouse() + self.keyboard_srv.clean_up_keyboard() diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.py new file mode 100755 index 0000000..819f1f9 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * +from players import amarok + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self, service): + self._service_name = service + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + if self._service_name == "Tablet": + self.mouse.position(i, j) + else: + self.mouse.position(-j, i) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up(self): + self.mouse.clean_up() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self, service): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self._service_name = service + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(self._service_name == 'Slideshow' and command == 'F6'): + self.keyboard.reproduce_key_press('F5') + self.keyboard.reproduce_key_release('F5') + elif(command == 'ISO_Level3_Shift'): + self.keyboard.reproduce_key_press('Escape') + self.keyboard.reproduce_key_release('Escape') + pass + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + #self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + #self.keys.append(command) + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + else: + + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + #self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + #self.keys.remove('Control_R') + self.control_flag = False + + # clean all keys pressed + def clean_up(self): + self.keyboard.clean_up() + +class Player_Server(): + + def __init__(self): + if not amarok.isRunning(): + self.player = amarok.AmarokPlayer() + else: + amarok.start() + self.player = amarok.AmarokPlayer() + self.labels = Labels() + + def execute(self, command): + if len(command) > 2: + if command[1] == self.labels.PLAY: + if command[2] and command[3]: + self.player.play(track=int(command[2]), rmd=bool(command[3])) + elif command[2]: + arg = int(command[2]) + if isinstance(arg, int): + self.player.play(track=arg) + else: + arg = bool(command[2]) + self.player.play(rmd=arg) + else: + pass + else: + if command[1] == self.labels.STOP: + self.player.stop() + elif command[1] == self.labels.PLAY: + self.player.play() + elif command[1] == self.labels.PAUSE: + self.player.pause() + elif command[1] == self.labels.NEXT: + self.player.next() + elif command[1] == self.labels.PREVIOUS: + self.player.prev() + elif command[1] == self.labels.VOL_UP: + self.player.volume_up() + elif command[1] == self.labels.VOL_DOWN: + self.player.volume_down() + elif command[1] == self.labels.SEEK: + self.player.seek(int(command[2])) + elif command[1] == self.labels.DOWNLOAD: + path = self.player.file_properties() + addr = command[2] + amarok.send_file(addr, path) + pass + elif command[1] == self.labels.LOAD_PLAYLIST: + # falta o metodo de trasnferencia + pass + else: + pass diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.pyc new file mode 100755 index 0000000..7e4a26c Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py new file mode 100755 index 0000000..4b16012 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up(self): + if self.buttons: + while self.buttons: + button = self.buttons.pop() + if button == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + elif button == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + elif button == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + self.keys = [] + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + self.keys.append(key) + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + self.keys.remove(key) + + # clean all pressed keys + def clean_up(self): + if self.keys: + while self.keys: + key = self.keys.pop() + self.reproduce_key_release(key) + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.pyc new file mode 100755 index 0000000..dddc2af Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/__init__.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/__init__.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/__init__.pyc new file mode 100755 index 0000000..cd16e31 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/__init__.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/service.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/service.py new file mode 100755 index 0000000..778745b --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/service.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.player = None + self.service = "" + self.addr = None + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Player': + self.player_srv = Player_Server() + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + elif cmd[0] == "Player": + if self.addr: + cmd += self.addr + self.player_srv.execute(cmd) + else: + self.player_srv.execute(cmd) + + def set_address_to_download(self, addr): + self.addr = addr + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up() + self.keyboard_srv.clean_up() + +#teste unitario +if __name__ == '__main__': + import utils.plistparser diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/service.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/service.pyc new file mode 100755 index 0000000..2ce3a3f Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/services/service.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.messages.py.swp b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.messages.py.swp new file mode 100755 index 0000000..534af08 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.messages.py.swp differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/entries b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/entries new file mode 100755 index 0000000..32b05b2 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/entries @@ -0,0 +1,67 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/utils +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:06:21.176771Z +40 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +plistparser.py +file + + + + +2008-11-24T21:52:13.000000Z +606a6ee70138fd606222cd4c3162cc3f +2008-11-24T22:06:21.176771Z +40 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +labels.py +file + + + + +2008-11-03T19:55:46.000000Z +6c9741bd79bbd0f1ac82d2d98614032d +2008-11-03T20:22:42.774109Z +5 +aportela +has-props + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/format b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base new file mode 100755 index 0000000..170c45e --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.pyc new file mode 100755 index 0000000..eb8942d Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/labels.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/labels.py new file mode 100755 index 0000000..044609c --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/labels.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # SERVICES SUPPORTED + TABLET = "Tablet" + SLIDESHOW = "Slideshow" + PLAYER = "Player" + TORRENT = "Torrent" + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + SEEK = "#seek" + LOAD_PLAYLIST = "#load_playlist" + PLAYLIST = "#playlist" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL_SRC = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/labels.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/labels.pyc new file mode 100755 index 0000000..0a5e1a0 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/labels.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/messages.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/messages.py new file mode 100755 index 0000000..b35cd58 --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/messages.py @@ -0,0 +1,37 @@ +import pynotify +import Image +import StringIO +import gtk + +class Message(): + def __init__(self, AppName): + pynotify.init(AppName) + self.AppName = AppName + self.msgbox = pynotify.Notification(self.AppName, self.AppName, "PCR_on.bmp") + self.msgbox.set_urgency(pynotify.URGENCY_CRITICAL) + self.msgbox.set_timeout(5000) + + def show_message(self, message): + self.msgbox = pynotify.Notification(self.AppName, message) + self.msgbox.show() + + def set_image(self, img): +# image = Image.open(img) +# image = gtk.gdk.pixbuf_new_from_file(img) +# self.msgbox.set_icon_from_pixbuf(self.image2pixbuf(image)) + pass + + def image2pixbuf(self, img): + file1 = StringIO.StringIO() + + img.save(file1, "ppm") + contents = file1.getvalue() + file1.close() + + loader = gtk.gdk.PixbufLoader("pnm") + loader.write(contents, len(contents)) + + pixbuf = loader.get_pixbuf() + loader.close() + + return pixbuf diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/messages.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/messages.pyc new file mode 100755 index 0000000..0c9c50a Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/messages.pyc differ diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.py b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.pyc b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.pyc new file mode 100755 index 0000000..1e46983 Binary files /dev/null and b/pcremote-server-desktop-60/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.pyc differ diff --git a/pcremote-server-desktop-60/debian/postinst b/pcremote-server-desktop-60/debian/postinst new file mode 100755 index 0000000..e15a0c5 --- /dev/null +++ b/pcremote-server-desktop-60/debian/postinst @@ -0,0 +1,7 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + diff --git a/pcremote-server-desktop-60/debian/postrm b/pcremote-server-desktop-60/debian/postrm new file mode 100755 index 0000000..4fa6e54 --- /dev/null +++ b/pcremote-server-desktop-60/debian/postrm @@ -0,0 +1,25 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/pcremote-server.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-server + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-server + +# Delete the pcremote icon +rm -f /usr/share/icons/hicolor/48x48/pcremote.png + +# Delete the pcremote menu +rm -f /usr/share/menu/pcremote-server-menu + +exit 0 diff --git a/pcremote-server-desktop-60/debian/rules b/pcremote-server-desktop-60/debian/rules new file mode 100755 index 0000000..f45b7f5 --- /dev/null +++ b/pcremote-server-desktop-60/debian/rules @@ -0,0 +1,96 @@ +#!/usr/bin/make -f + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + ##$(MAKE) + #docbook-to-man debian/pcremote-server.sgml > pcremote-server.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + dh_clean + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + dh_installmenu + dh_icons + # Add here commands to install the package into debian/pcremote-server. + #$(MAKE) install DESTDIR=$(CURDIR)/debian/pcremote-server + mkdir -p $(CURDIR)/debian/pcremote-server + + ###insert your commands here + cp *.py $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r exceptions/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r images/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r services/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r players/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r connection/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r utils/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + + ### Installing menufile + # copy the file with the menu entry into /usr/share/applications + cp pcremote-server.desktop $(CURDIR)/debian/pcremote-server/usr/share/applications + cp pcremote.png $(CURDIR)/debian/pcremote-server/usr/share/icons + cp pcremote-server-menu $(CURDIR)/debian/pcremote-server/usr/share/menu + cp pcremote-server $(CURDIR)/debian/pcremote-server/usr/bin + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples +# dh_install + dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/pcremote-server-desktop-60/exceptions/.svn/entries b/pcremote-server-desktop-60/exceptions/.svn/entries new file mode 100755 index 0000000..fb958a2 --- /dev/null +++ b/pcremote-server-desktop-60/exceptions/.svn/entries @@ -0,0 +1,54 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/exceptions +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:15:49.820782Z +27 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +exception.py +file + + + + +2008-11-24T19:15:30.000000Z +41e514c3297ce38f7bd5d4f687fcaa9b +2008-11-24T19:15:49.820782Z +27 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + diff --git a/pcremote-server-desktop-60/exceptions/.svn/format b/pcremote-server-desktop-60/exceptions/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/exceptions/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/exceptions/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/exceptions/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/exceptions/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/exceptions/.svn/prop-base/exception.py.svn-base b/pcremote-server-desktop-60/exceptions/.svn/prop-base/exception.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/exceptions/.svn/prop-base/exception.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/exceptions/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/exceptions/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/exceptions/.svn/text-base/exception.py.svn-base b/pcremote-server-desktop-60/exceptions/.svn/text-base/exception.py.svn-base new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop-60/exceptions/.svn/text-base/exception.py.svn-base @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop-60/exceptions/__init__.py b/pcremote-server-desktop-60/exceptions/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/exceptions/exception.py b/pcremote-server-desktop-60/exceptions/exception.py new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop-60/exceptions/exception.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop-60/images/28x.png b/pcremote-server-desktop-60/images/28x.png new file mode 100755 index 0000000..9c918db Binary files /dev/null and b/pcremote-server-desktop-60/images/28x.png differ diff --git a/pcremote-server-desktop-60/images/64x.png b/pcremote-server-desktop-60/images/64x.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop-60/images/64x.png differ diff --git a/pcremote-server-desktop-60/images/PCR_off.bmp b/pcremote-server-desktop-60/images/PCR_off.bmp new file mode 100755 index 0000000..c686d43 Binary files /dev/null and b/pcremote-server-desktop-60/images/PCR_off.bmp differ diff --git a/pcremote-server-desktop-60/images/PCR_on.bmp b/pcremote-server-desktop-60/images/PCR_on.bmp new file mode 100755 index 0000000..84f4109 Binary files /dev/null and b/pcremote-server-desktop-60/images/PCR_on.bmp differ diff --git a/pcremote-server-desktop-60/images/remote48x.png b/pcremote-server-desktop-60/images/remote48x.png new file mode 100755 index 0000000..22b5640 Binary files /dev/null and b/pcremote-server-desktop-60/images/remote48x.png differ diff --git a/pcremote-server-desktop-60/pcremote-server b/pcremote-server-desktop-60/pcremote-server new file mode 100755 index 0000000..de17562 --- /dev/null +++ b/pcremote-server-desktop-60/pcremote-server @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-server/pcremote-server.py diff --git a/pcremote-server-desktop-60/pcremote-server-menu b/pcremote-server-desktop-60/pcremote-server-menu new file mode 100755 index 0000000..d7fea37 --- /dev/null +++ b/pcremote-server-desktop-60/pcremote-server-menu @@ -0,0 +1,6 @@ +?package(pcremote-server): \ + needs="X11" \ + section:"Applications/Network" \ + title="PCRemote Server" \ + command="pcremote-server" \ + icon="/usr/share/icons/hicolor/48x48/pcremote.png" diff --git a/pcremote-server-desktop-60/pcremote-server.desktop b/pcremote-server-desktop-60/pcremote-server.desktop new file mode 100755 index 0000000..59bc7da --- /dev/null +++ b/pcremote-server-desktop-60/pcremote-server.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.60 +Type=Application +Icon=/usr/share/hicolor/48x48/pcremote.png +Name=PCRemote Server +Exec=pcremote-server +Terminal=false +Categories=Application;Network;GTK; +StartupNotify=true diff --git a/pcremote-server-desktop-60/pcremote-server.py b/pcremote-server-desktop-60/pcremote-server.py new file mode 100755 index 0000000..195af3e --- /dev/null +++ b/pcremote-server-desktop-60/pcremote-server.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +from runserver import Server +import gtk +import thread +import sys + +class Service: + + def start_server(self, widget): + + if self.connected == False: + imagepath = self.images.replace('pcremote-server.py','images/PCR_on.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Online") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_MENU) + self.menuItemCon.set_image(img) + + self.srv = Server("PC Remote") + thread.start_new_thread(Server.start,(self.srv,"server")) + + else: + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Offline") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) + + self.menuItemCon.set_image(img) + + thread.exit_thread() + + self.connected = not self.connected + + def destroyer(self, widget,response_id, data= None): + if response_id == gtk.RESPONSE_OK: + gtk.main_quit() + else: + widget.hide() + + def popup(self, widget): + dialog = gtk.MessageDialog( + parent = None, + flags = gtk.DIALOG_DESTROY_WITH_PARENT, + type = gtk.MESSAGE_INFO, + buttons = gtk.BUTTONS_OK_CANCEL, + message_format = "Do you want to shut down the server?") + dialog.set_title('PC Remote Server') + dialog.connect('response', self.destroyer) + dialog.show() + + def popup_menu_cb(self, widget, button, time, data = None): + if button == 3: + if data: + data.show_all() + data.popup(None, None, None, 3, time) + + + def __init__(self): + + self.images = sys.argv[0] + self.connected = False + + self.staticon = gtk.StatusIcon() + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server(offline)") + + self.menu = gtk.Menu() + + self.menuItemCon = gtk.ImageMenuItem(gtk.STOCK_EXECUTE) + self.menuItemCon.connect('activate', self.start_server) + + self.menuItemExit = gtk.ImageMenuItem(gtk.STOCK_QUIT) + self.menuItemExit.connect('activate', self.popup) + + self.menu.append(self.menuItemCon) + self.menu.append(self.menuItemExit) + + self.staticon.connect('popup-menu', self.popup_menu_cb, self.menu) + + self.staticon.set_visible(True) + + gtk.gdk.threads_init() + gtk.gdk.threads_enter() + + gtk.main() + + gtk.gdk.threads_leave() + +print sys.argv +Srv = Service() diff --git a/pcremote-server-desktop-60/pcremote.png b/pcremote-server-desktop-60/pcremote.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop-60/pcremote.png differ diff --git a/pcremote-server-desktop-60/players/.svn/entries b/pcremote-server-desktop-60/players/.svn/entries new file mode 100755 index 0000000..2e7676e --- /dev/null +++ b/pcremote-server-desktop-60/players/.svn/entries @@ -0,0 +1,66 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/players +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:19:59.926000Z +42 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +amarok.py +file + + + + +2008-11-24T19:22:32.000000Z +b34d77d5e136ac5cb2fb4c25d9de4d05 +2008-11-24T19:22:46.499502Z +32 +aportela +has-props + +__init__.py +file + + + + +2008-11-21T20:05:30.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-11-21T20:06:45.989300Z +12 +aportela + +playlist.py +file + + + + +2008-11-24T19:23:01.000000Z +094e2893e7aec596fb90a6607a859c75 +2008-11-24T19:23:20.208723Z +33 +aportela +has-props + diff --git a/pcremote-server-desktop-60/players/.svn/format b/pcremote-server-desktop-60/players/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/players/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/players/.svn/prop-base/amarok.py.svn-base b/pcremote-server-desktop-60/players/.svn/prop-base/amarok.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop-60/players/.svn/prop-base/amarok.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop-60/players/.svn/prop-base/playlist.py.svn-base b/pcremote-server-desktop-60/players/.svn/prop-base/playlist.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop-60/players/.svn/prop-base/playlist.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop-60/players/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/players/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/players/.svn/text-base/amarok.py.svn-base b/pcremote-server-desktop-60/players/.svn/text-base/amarok.py.svn-base new file mode 100755 index 0000000..5e235b3 --- /dev/null +++ b/pcremote-server-desktop-60/players/.svn/text-base/amarok.py.svn-base @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + +# starts the amarok player application +def start(): + os.popen('amarok') + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def audio_file_properties(self, index=None): + audiofile = (self.playlist.song_filename(index),\ + self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + def play(self): + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + def play_track(self, index): + self.amarok.playlist.playByIndex(index-1) + self.playlist.update(index, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # random play songs + def play_random(self): + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index+1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop-60/players/.svn/text-base/playlist.py.svn-base b/pcremote-server-desktop-60/players/.svn/text-base/playlist.py.svn-base new file mode 100755 index 0000000..0cbc97b --- /dev/null +++ b/pcremote-server-desktop-60/players/.svn/text-base/playlist.py.svn-base @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong - 1]['title'] == 'Unknown Title': + self.songs[self.currentSong - 1]['title'] = title + if self.songs[self.currentSong - 1]['artist'] == 'Unknown Artist': + self.songs[self.currentSong - 1]['artist'] = artist + self.songs[self.currentSong - 1]['path'] = path + self.songs[self.currentSong - 1]['extension'] = ext + print self.songs[self.currentSong - 1] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong - 1]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong - 1]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong - 1]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong-1]['title'] +" - "+\ + self.songs[self.currentSong-1]['artist'] + \ + self.songs[self.currentSong-1]['extension'] + + else: + return self.songs[index-1]['title'] +" - "+\ + self.songs[index-1]['artist'] + \ + self.songs[index-1]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong-1]['filesize']) + else: + return int(self.songs[index-1]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong-1]['track'] + if title: + props['title'] = self.songs[self.currentSong-1]['title'] + if artist: + props['artist'] = self.songs[self.currentSong-1]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong-1]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong-1]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong-1]['duration'] + if path: + props['path'] = self.songs[self.currentSong-1]['path'] + + return props + else: + if track: + props['track'] = self.songs[index-1]['track'] + if title: + props['title'] = self.songs[index-1]['title'] + if artist: + props['artist'] = self.songs[index-1]['artist'] + if ext: + props['ext'] = self.songs[index-1]['extension'] + if filesize: + props['filesize'] = self.songs[index-1]['filesize'] + if duration: + props['duration'] = self.songs[index-1]['duration'] + if path: + props['path'] = self.songs[index-1]['path'] + + return props + diff --git a/pcremote-server-desktop-60/players/__init__.py b/pcremote-server-desktop-60/players/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/players/__init__.pyc b/pcremote-server-desktop-60/players/__init__.pyc new file mode 100644 index 0000000..c6f2429 Binary files /dev/null and b/pcremote-server-desktop-60/players/__init__.pyc differ diff --git a/pcremote-server-desktop-60/players/amarok.py b/pcremote-server-desktop-60/players/amarok.py new file mode 100755 index 0000000..2d54fb0 --- /dev/null +++ b/pcremote-server-desktop-60/players/amarok.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + + +# starts the amarok player application +def start(): + os.popen('amarok') + + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +def send_file(addr, path): + shell("bluetooth-sendto --dest=%s %s" + (addr, path)) + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def file_properties(self, index=None): + track = self.amarok.playlist.getActiveIndex() + audiofile = self.playlist.song_properties(index=track, path=True) + #audiofile = (self.playlist.song_filename(index),\ + # self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + #def play(self): + #self.amarok.player.play() + #self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(), \ + # ) + + # play button and sets current song + # receive track or random form + # the argument track has intended to manipulate + # the playlist form when the user indicate a song track + # in client application + def play(self, track=-1, rdm=False): + if rdm: + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index + 1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + elif track != -1: + self.amarok.playlist.playByIndex(track) + self.playlist.update(track-1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + else: + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + #def play_track(self, index): + # self.amarok.playlist.playByIndex(index-1) + # self.playlist.update(index, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # random play songs + #def play_random(self): + # index = random.randint(0, self.playlist.length() - 1) + # self.amarok.playlist.playByIndex(index) + # self.playlist.update(index+1, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop-60/players/amarok.pyc b/pcremote-server-desktop-60/players/amarok.pyc new file mode 100755 index 0000000..e922219 Binary files /dev/null and b/pcremote-server-desktop-60/players/amarok.pyc differ diff --git a/pcremote-server-desktop-60/players/playlist.py b/pcremote-server-desktop-60/players/playlist.py new file mode 100755 index 0000000..31a3a61 --- /dev/null +++ b/pcremote-server-desktop-60/players/playlist.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong]['title'] == 'Unknown Title': + self.songs[self.currentSong]['title'] = title + if self.songs[self.currentSong]['artist'] == 'Unknown Artist': + self.songs[self.currentSong]['artist'] = artist + self.songs[self.currentSong]['path'] = path + self.songs[self.currentSong]['extension'] = ext + print self.songs[self.currentSong] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong]['title'] +" - "+\ + self.songs[self.currentSong]['artist'] + \ + self.songs[self.currentSong]['extension'] + + else: + return self.songs[index]['title'] +" - "+\ + self.songs[index]['artist'] + \ + self.songs[index]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong]['filesize']) + else: + return int(self.songs[index]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong]['track'] + if title: + props['title'] = self.songs[self.currentSong]['title'] + if artist: + props['artist'] = self.songs[self.currentSong]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong]['duration'] + if path: + props['path'] = self.songs[self.currentSong]['path'] + + return props + else: + if track: + props['track'] = self.songs[index]['track'] + if title: + props['title'] = self.songs[index]['title'] + if artist: + props['artist'] = self.songs[index]['artist'] + if ext: + props['ext'] = self.songs[index]['extension'] + if filesize: + props['filesize'] = self.songs[index]['filesize'] + if duration: + props['duration'] = self.songs[index]['duration'] + if path: + props['path'] = self.songs[index]['path'] + + return props + diff --git a/pcremote-server-desktop-60/players/playlist.pyc b/pcremote-server-desktop-60/players/playlist.pyc new file mode 100755 index 0000000..0e7524b Binary files /dev/null and b/pcremote-server-desktop-60/players/playlist.pyc differ diff --git a/pcremote-server-desktop-60/players/plistparser.py b/pcremote-server-desktop-60/players/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop-60/players/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop-60/players/plistparser.pyc b/pcremote-server-desktop-60/players/plistparser.pyc new file mode 100755 index 0000000..145dc38 Binary files /dev/null and b/pcremote-server-desktop-60/players/plistparser.pyc differ diff --git a/pcremote-server-desktop-60/players/run-amarok.py b/pcremote-server-desktop-60/players/run-amarok.py new file mode 100755 index 0000000..2d8e9bf --- /dev/null +++ b/pcremote-server-desktop-60/players/run-amarok.py @@ -0,0 +1,43 @@ +import amarok + +if not amarok.isRunning(): + player = amarok.AmarokPlayer() +else: + print "entrou aqui" + amarok.start() + player = amarok.AmarokPlayer() + +while(1): + data = raw_input(">>> ") + if data == '#exit' or data == '#quit' or data == '#close': + print "Application closed." + amarok.shutdown() + break + elif data == 'next': + player.next() + elif data == 'prev': + player.prev() + elif data == 'play': + player.play() + elif data == 'pause': + player.pause() + elif data == 'stop': + player.stop() + elif data == 'mute': + player.mute() + elif data == 'volume-up': + player.volume_up() + elif data == 'volume-down': + player.volume_down() + elif data == 'current_song': + print player.current_song() + elif data == 'random': + player.play_random() + elif data == 'play-track': + index = input('track: ') + player.play_track(index) + elif data == 'refresh': + player.refresh_playlist() + elif data == 'show': + player.song_list() + diff --git a/pcremote-server-desktop-60/runserver.py b/pcremote-server-desktop-60/runserver.py new file mode 100644 index 0000000..b91efd2 --- /dev/null +++ b/pcremote-server-desktop-60/runserver.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson ; Jonatas Izvi; Andre Portela +# Email : fergus.mao@gmail.com ; nona@gmail.com ; +# andre_portela_@hotmail.com; +# Version : 1.0 +# Class : Server File - This is the main script of the server +# ============================================================================ + +from connection.iconnection import * +from services.service import * +from utils import * +from utils.messages import * + +class Server(): + + def __init__(self, AppName): + self.msgbox = Message(AppName) + self.msgbox.show_message("Server Initialized...") + + def start(self, servername): + + label = Labels() + iconn = Iconnection('blue') + iconn.bluetooth_create_server('l2cap', 0x1001) + + address = iconn.get_client_address() + + self.msgbox.show_message("Accepted connection from " + address[0]) + + while (1): + + data = iconn.received_message() + + if data == 'Tablet:#start': + + self.msgbox.show_message('Service Tablet initialized...') + + service = Service() + service.set_service('Tablet') + + while(1): + data = iconn.received_message() + if data == 'Tablet:#stop': + service.clean_all() + self.msgbox.show_message('Service Tablet stoped') + break + service.execute(data) + + elif data == 'Slideshow:#start': + + self.msgbox.show_message('Service Slideshow initialized...') + + service = Service() + service.set_service('Slideshow') + + while(1): + data = iconn.received_message() + if data == 'Slideshow:#stop': + service.clean_all() + self.msgbox.show_message('Service Slideshow stoped') + break + print data, "\n" + service.execute(data) + + elif data == 'Player:#start': + + self.msgbox.show_message('Service Player initialized...') + + service = Service() + service.set_service('Player') + + while(1): + data = iconn.received_message() + if data == 'Player:#stop': + self.msgbox.show_message('Service Player stoped') + break + elif data == 'Player:#download': + service.set_address_to_download(address[0]) + elif data == 'Player:#load_playlist': + # e preciso criar um metodo de transferencia + # no caso de carregar uma playlist para o cliente + service.execute_transfer(data) + + service.execute(data) + + else: + iconn.close() + self.msgbox.show_message('Desconected from ' + address[0]) + break diff --git a/pcremote-server-desktop-60/runserver.pyc b/pcremote-server-desktop-60/runserver.pyc new file mode 100644 index 0000000..7033e84 Binary files /dev/null and b/pcremote-server-desktop-60/runserver.pyc differ diff --git a/pcremote-server-desktop-60/services/.svn/entries b/pcremote-server-desktop-60/services/.svn/entries new file mode 100755 index 0000000..11b2d8a --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/entries @@ -0,0 +1,80 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/services +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T21:43:13.543262Z +39 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +ObjectServers.py +file + + + + +2008-11-24T21:42:50.000000Z +61fef10722e4d9d7faac93a03ac1ceb1 +2008-11-24T21:43:13.543262Z +39 +aportela +has-props + +service.py +file + + + + +2008-11-24T21:41:33.000000Z +10874c65035a891cb60e1ccb8b2bdb4f +2008-11-24T21:41:51.237514Z +37 +aportela +has-props + +ServerHandlers.py +file + + + + +2008-11-24T21:42:13.000000Z +5c25986a6c09a7313d8f5f51b509a5e6 +2008-11-24T21:42:30.576563Z +38 +aportela +has-props + diff --git a/pcremote-server-desktop-60/services/.svn/format b/pcremote-server-desktop-60/services/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/services/.svn/prop-base/ObjectServers.py.svn-base b/pcremote-server-desktop-60/services/.svn/prop-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/prop-base/ObjectServers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/services/.svn/prop-base/ServerHandlers.py.svn-base b/pcremote-server-desktop-60/services/.svn/prop-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/prop-base/ServerHandlers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/services/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/services/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/services/.svn/prop-base/service.py.svn-base b/pcremote-server-desktop-60/services/.svn/prop-base/service.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/prop-base/service.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/services/.svn/text-base/ObjectServers.py.svn-base b/pcremote-server-desktop-60/services/.svn/text-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..33e5a17 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/text-base/ObjectServers.py.svn-base @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self): + + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + self.mouse.position(i, j) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up_mouse(self): + self.mouse.clean_up_mouse() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self.keys = [] + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(command == 'ISO_Level3_Shift'): + self.keyboard.reproduce_key_press('Escape') + self.keyboard.reproduce_key_release('Escape') + pass + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + self.keys.append(command) + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + else: + + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + self.keys.remove('Control_R') + self.control_flag = False + + # clean all keys pressed + def clean_up_keyboard(self): + print "\nkeys -> ", self.keys + list = self.keys + print "\nlist ->", list + for i in list: + self.keyboard.reproduce_key_release(i) + self.keys.remove(i) + print "\nkey --> ", i, " removed." + + print self.keys diff --git a/pcremote-server-desktop-60/services/.svn/text-base/ServerHandlers.py.svn-base b/pcremote-server-desktop-60/services/.svn/text-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..352d1e7 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/text-base/ServerHandlers.py.svn-base @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up_mouse(self): + list = self.buttons + print list + for i in list: + if i == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nleft_button -> release." + elif i == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove(i) + print "\nmiddle_button -> release." + elif i == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nright_button -> release." + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + diff --git a/pcremote-server-desktop-60/services/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/services/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/services/.svn/text-base/service.py.svn-base b/pcremote-server-desktop-60/services/.svn/text-base/service.py.svn-base new file mode 100755 index 0000000..b0143a0 --- /dev/null +++ b/pcremote-server-desktop-60/services/.svn/text-base/service.py.svn-base @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.service = "" + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Player': + print "player service." + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up_mouse() + self.keyboard_srv.clean_up_keyboard() diff --git a/pcremote-server-desktop-60/services/ObjectServers.py b/pcremote-server-desktop-60/services/ObjectServers.py new file mode 100755 index 0000000..dfbe76c --- /dev/null +++ b/pcremote-server-desktop-60/services/ObjectServers.py @@ -0,0 +1,294 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * +from players import amarok + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self, service): + self._service_name = service + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + if self._service_name == "Tablet": + self.mouse.position(i, j) + else: + self.mouse.position(-j, i) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up(self): + self.mouse.clean_up() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self, service): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self.alt_flag = False + self._service_name = service + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(self._service_name == 'Slideshow' and command == 'F6'): + self.keyboard.reproduce_key_press('F5') + self.keyboard.reproduce_key_release('F5') + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + #self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + #self.keys.append(command) + elif(command == 'Alt_L'): + self.alt_flag = True + self.keyboard.reproduce_key_press('Alt_L') + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + elif(command == 'Alt+F1'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F1') + self.keyboard.reproduce_key_release('F1') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F2'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F2') + self.keyboard.reproduce_key_release('F2') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F4'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F4') + self.keyboard.reproduce_key_release('F4') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F9'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F9') + self.keyboard.reproduce_key_release('F9') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F0'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F10') + self.keyboard.reproduce_key_release('F10') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+Space'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('space') + self.keyboard.reproduce_key_release('space') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Tab'): + self.keyboard.reproduce_key_press('Tab') + self.keyboard.reproduce_key_release('Tab') + else: + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + #self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + #self.keys.remove('Control_R') + self.control_flag = False + elif self.alt_flag: + self.keyboard.reproduce_key_release('Alt_L') + self.alt_flag = False + + # clean all keys pressed + def clean_up(self): + self.keyboard.clean_up() + +class Player_Server(): + + def __init__(self): + if not amarok.isRunning(): + self.player = amarok.AmarokPlayer() + else: + amarok.start() + self.player = amarok.AmarokPlayer() + self.labels = Labels() + + def execute(self, command): + if len(command) > 2: + if command[1] == self.labels.PLAY: + if command[2] and command[3]: + self.player.play(track=int(command[2]), rmd=bool(command[3])) + elif command[2]: + arg = int(command[2]) + if isinstance(arg, int): + self.player.play(track=arg) + else: + arg = bool(command[2]) + self.player.play(rmd=arg) + else: + pass + else: + if command[1] == self.labels.STOP: + self.player.stop() + elif command[1] == self.labels.PLAY: + self.player.play() + elif command[1] == self.labels.PAUSE: + self.player.pause() + elif command[1] == self.labels.NEXT: + self.player.next() + elif command[1] == self.labels.PREVIOUS: + self.player.prev() + elif command[1] == self.labels.VOL_UP: + self.player.volume_up() + elif command[1] == self.labels.VOL_DOWN: + self.player.volume_down() + elif command[1] == self.labels.SEEK: + self.player.seek(int(command[2])) + elif command[1] == self.labels.DOWNLOAD: + path = self.player.file_properties() + addr = command[2] + amarok.send_file(addr, path) + pass + elif command[1] == self.labels.LOAD_PLAYLIST: + # falta o metodo de trasnferencia + pass + else: + pass diff --git a/pcremote-server-desktop-60/services/ObjectServers.pyc b/pcremote-server-desktop-60/services/ObjectServers.pyc new file mode 100644 index 0000000..671920a Binary files /dev/null and b/pcremote-server-desktop-60/services/ObjectServers.pyc differ diff --git a/pcremote-server-desktop-60/services/ServerHandlers.py b/pcremote-server-desktop-60/services/ServerHandlers.py new file mode 100755 index 0000000..4b16012 --- /dev/null +++ b/pcremote-server-desktop-60/services/ServerHandlers.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up(self): + if self.buttons: + while self.buttons: + button = self.buttons.pop() + if button == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + elif button == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + elif button == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + self.keys = [] + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + self.keys.append(key) + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + self.keys.remove(key) + + # clean all pressed keys + def clean_up(self): + if self.keys: + while self.keys: + key = self.keys.pop() + self.reproduce_key_release(key) + diff --git a/pcremote-server-desktop-60/services/ServerHandlers.pyc b/pcremote-server-desktop-60/services/ServerHandlers.pyc new file mode 100644 index 0000000..92ce94c Binary files /dev/null and b/pcremote-server-desktop-60/services/ServerHandlers.pyc differ diff --git a/pcremote-server-desktop-60/services/__init__.py b/pcremote-server-desktop-60/services/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/services/__init__.pyc b/pcremote-server-desktop-60/services/__init__.pyc new file mode 100644 index 0000000..04d7ee8 Binary files /dev/null and b/pcremote-server-desktop-60/services/__init__.pyc differ diff --git a/pcremote-server-desktop-60/services/service.py b/pcremote-server-desktop-60/services/service.py new file mode 100755 index 0000000..778745b --- /dev/null +++ b/pcremote-server-desktop-60/services/service.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.player = None + self.service = "" + self.addr = None + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Player': + self.player_srv = Player_Server() + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + elif cmd[0] == "Player": + if self.addr: + cmd += self.addr + self.player_srv.execute(cmd) + else: + self.player_srv.execute(cmd) + + def set_address_to_download(self, addr): + self.addr = addr + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up() + self.keyboard_srv.clean_up() + +#teste unitario +if __name__ == '__main__': + import utils.plistparser diff --git a/pcremote-server-desktop-60/services/service.pyc b/pcremote-server-desktop-60/services/service.pyc new file mode 100644 index 0000000..d844079 Binary files /dev/null and b/pcremote-server-desktop-60/services/service.pyc differ diff --git a/pcremote-server-desktop-60/utils/.messages.py.swp b/pcremote-server-desktop-60/utils/.messages.py.swp new file mode 100755 index 0000000..534af08 Binary files /dev/null and b/pcremote-server-desktop-60/utils/.messages.py.swp differ diff --git a/pcremote-server-desktop-60/utils/.svn/entries b/pcremote-server-desktop-60/utils/.svn/entries new file mode 100755 index 0000000..32b05b2 --- /dev/null +++ b/pcremote-server-desktop-60/utils/.svn/entries @@ -0,0 +1,67 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/utils +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:06:21.176771Z +40 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +plistparser.py +file + + + + +2008-11-24T21:52:13.000000Z +606a6ee70138fd606222cd4c3162cc3f +2008-11-24T22:06:21.176771Z +40 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +labels.py +file + + + + +2008-11-03T19:55:46.000000Z +6c9741bd79bbd0f1ac82d2d98614032d +2008-11-03T20:22:42.774109Z +5 +aportela +has-props + diff --git a/pcremote-server-desktop-60/utils/.svn/format b/pcremote-server-desktop-60/utils/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop-60/utils/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop-60/utils/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop-60/utils/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/utils/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/utils/.svn/prop-base/labels.py.svn-base b/pcremote-server-desktop-60/utils/.svn/prop-base/labels.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop-60/utils/.svn/prop-base/labels.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop-60/utils/.svn/prop-base/plistparser.py.svn-base b/pcremote-server-desktop-60/utils/.svn/prop-base/plistparser.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop-60/utils/.svn/prop-base/plistparser.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop-60/utils/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop-60/utils/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/utils/.svn/text-base/labels.py.svn-base b/pcremote-server-desktop-60/utils/.svn/text-base/labels.py.svn-base new file mode 100755 index 0000000..170c45e --- /dev/null +++ b/pcremote-server-desktop-60/utils/.svn/text-base/labels.py.svn-base @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop-60/utils/.svn/text-base/plistparser.py.svn-base b/pcremote-server-desktop-60/utils/.svn/text-base/plistparser.py.svn-base new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop-60/utils/.svn/text-base/plistparser.py.svn-base @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop-60/utils/__init__.py b/pcremote-server-desktop-60/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop-60/utils/__init__.pyc b/pcremote-server-desktop-60/utils/__init__.pyc new file mode 100644 index 0000000..b0d7efb Binary files /dev/null and b/pcremote-server-desktop-60/utils/__init__.pyc differ diff --git a/pcremote-server-desktop-60/utils/labels.py b/pcremote-server-desktop-60/utils/labels.py new file mode 100755 index 0000000..044609c --- /dev/null +++ b/pcremote-server-desktop-60/utils/labels.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # SERVICES SUPPORTED + TABLET = "Tablet" + SLIDESHOW = "Slideshow" + PLAYER = "Player" + TORRENT = "Torrent" + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + SEEK = "#seek" + LOAD_PLAYLIST = "#load_playlist" + PLAYLIST = "#playlist" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL_SRC = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop-60/utils/labels.pyc b/pcremote-server-desktop-60/utils/labels.pyc new file mode 100644 index 0000000..3ea6176 Binary files /dev/null and b/pcremote-server-desktop-60/utils/labels.pyc differ diff --git a/pcremote-server-desktop-60/utils/messages.py b/pcremote-server-desktop-60/utils/messages.py new file mode 100755 index 0000000..b35cd58 --- /dev/null +++ b/pcremote-server-desktop-60/utils/messages.py @@ -0,0 +1,37 @@ +import pynotify +import Image +import StringIO +import gtk + +class Message(): + def __init__(self, AppName): + pynotify.init(AppName) + self.AppName = AppName + self.msgbox = pynotify.Notification(self.AppName, self.AppName, "PCR_on.bmp") + self.msgbox.set_urgency(pynotify.URGENCY_CRITICAL) + self.msgbox.set_timeout(5000) + + def show_message(self, message): + self.msgbox = pynotify.Notification(self.AppName, message) + self.msgbox.show() + + def set_image(self, img): +# image = Image.open(img) +# image = gtk.gdk.pixbuf_new_from_file(img) +# self.msgbox.set_icon_from_pixbuf(self.image2pixbuf(image)) + pass + + def image2pixbuf(self, img): + file1 = StringIO.StringIO() + + img.save(file1, "ppm") + contents = file1.getvalue() + file1.close() + + loader = gtk.gdk.PixbufLoader("pnm") + loader.write(contents, len(contents)) + + pixbuf = loader.get_pixbuf() + loader.close() + + return pixbuf diff --git a/pcremote-server-desktop-60/utils/messages.pyc b/pcremote-server-desktop-60/utils/messages.pyc new file mode 100644 index 0000000..8628278 Binary files /dev/null and b/pcremote-server-desktop-60/utils/messages.pyc differ diff --git a/pcremote-server-desktop-60/utils/plistparser.py b/pcremote-server-desktop-60/utils/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop-60/utils/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop-60/utils/plistparser.pyc b/pcremote-server-desktop-60/utils/plistparser.pyc new file mode 100755 index 0000000..1e46983 Binary files /dev/null and b/pcremote-server-desktop-60/utils/plistparser.pyc differ diff --git a/pcremote-server-desktop/connection/.svn/entries b/pcremote-server-desktop/connection/.svn/entries new file mode 100755 index 0000000..e1ea3e5 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/entries @@ -0,0 +1,93 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/connection +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:21:45.815695Z +31 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +iconnection.py +file + + + + +2008-11-24T19:10:09.000000Z +5a23a701cbe84644991072a94b636f35 +2008-11-24T19:08:20.539642Z +24 +aportela +has-props + +wirelessconnectionmanager.py +file + + + + +2008-11-24T19:21:26.000000Z +518124236f6ddf6a0c67621853cd7229 +2008-11-24T19:21:45.815695Z +31 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +bluetoothconnectionmanager.py +file + + + + +2008-11-24T19:09:16.000000Z +67af5797d41770d8801ca335f011ea7f +2008-11-24T19:09:43.908566Z +25 +aportela +has-props + +genericconnectionmanager.py +file + + + + +2008-11-24T19:11:06.000000Z +159366919bc6213b7f6fae65dc603afa +2008-11-24T19:11:23.207768Z +26 +aportela +has-props + diff --git a/pcremote-server-desktop/connection/.svn/format b/pcremote-server-desktop/connection/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/connection/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/connection/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..085986a --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,9 @@ +K 14 +svn:executable +V 1 +* +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/connection/.svn/prop-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop/connection/.svn/prop-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/prop-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/connection/.svn/prop-base/iconnection.py.svn-base b/pcremote-server-desktop/connection/.svn/prop-base/iconnection.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/prop-base/iconnection.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/connection/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/connection/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..bda3c98 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop/connection/.svn/text-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop/connection/.svn/text-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/text-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop/connection/.svn/text-base/iconnection.py.svn-base b/pcremote-server-desktop/connection/.svn/text-base/iconnection.py.svn-base new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/text-base/iconnection.py.svn-base @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop/connection/__init__.py b/pcremote-server-desktop/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/connection/__init__.pyc b/pcremote-server-desktop/connection/__init__.pyc new file mode 100644 index 0000000..e8fac67 Binary files /dev/null and b/pcremote-server-desktop/connection/__init__.pyc differ diff --git a/pcremote-server-desktop/connection/bluetoothconnectionmanager.py b/pcremote-server-desktop/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..581b0f8 --- /dev/null +++ b/pcremote-server-desktop/connection/bluetoothconnectionmanager.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + print list_devices + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop/connection/bluetoothconnectionmanager.pyc b/pcremote-server-desktop/connection/bluetoothconnectionmanager.pyc new file mode 100644 index 0000000..1d789c6 Binary files /dev/null and b/pcremote-server-desktop/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-server-desktop/connection/genericconnectionmanager.py b/pcremote-server-desktop/connection/genericconnectionmanager.py new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop/connection/genericconnectionmanager.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop/connection/genericconnectionmanager.pyc b/pcremote-server-desktop/connection/genericconnectionmanager.pyc new file mode 100644 index 0000000..46c403d Binary files /dev/null and b/pcremote-server-desktop/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-server-desktop/connection/iconnection.py b/pcremote-server-desktop/connection/iconnection.py new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop/connection/iconnection.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop/connection/iconnection.pyc b/pcremote-server-desktop/connection/iconnection.pyc new file mode 100644 index 0000000..11df774 Binary files /dev/null and b/pcremote-server-desktop/connection/iconnection.pyc differ diff --git a/pcremote-server-desktop/connection/wirelessconnectionmanager.py b/pcremote-server-desktop/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop/connection/wirelessconnectionmanager.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop/connection/wirelessconnectionmanager.pyc b/pcremote-server-desktop/connection/wirelessconnectionmanager.pyc new file mode 100644 index 0000000..b5f907c Binary files /dev/null and b/pcremote-server-desktop/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-server-desktop/debian/README.Debian b/pcremote-server-desktop/debian/README.Debian new file mode 100755 index 0000000..dddb9de --- /dev/null +++ b/pcremote-server-desktop/debian/README.Debian @@ -0,0 +1,6 @@ +pcremote-server for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-server-desktop/debian/changelog b/pcremote-server-desktop/debian/changelog new file mode 100755 index 0000000..9cc4a68 --- /dev/null +++ b/pcremote-server-desktop/debian/changelog @@ -0,0 +1,6 @@ +pcremote-server (0.60-1) unstable; urgency=low + + * Initial release (Closes: #nnnn) + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 + diff --git a/pcremote-server-desktop/debian/compat b/pcremote-server-desktop/debian/compat new file mode 100755 index 0000000..1e8b314 --- /dev/null +++ b/pcremote-server-desktop/debian/compat @@ -0,0 +1 @@ +6 diff --git a/pcremote-server-desktop/debian/control b/pcremote-server-desktop/debian/control new file mode 100755 index 0000000..e0b98e3 --- /dev/null +++ b/pcremote-server-desktop/debian/control @@ -0,0 +1,11 @@ +Source: pcremote-server +Section: net +Priority: optional +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Build-Depends: debhelper (>= 5) +Standards-Version: 3.7.2 + +Package: pcremote-server +Architecture: all +Depends: python2.5, python2.5-gtk2, python-bluetooth, python-xlib, python2.5-notify, python-dcop +Description: A server application of PCRemote Client diff --git a/pcremote-server-desktop/debian/copyright b/pcremote-server-desktop/debian/copyright new file mode 100755 index 0000000..8520c24 --- /dev/null +++ b/pcremote-server-desktop/debian/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Server + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-server-desktop/debian/dirs b/pcremote-server-desktop/debian/dirs new file mode 100755 index 0000000..d4d5362 --- /dev/null +++ b/pcremote-server-desktop/debian/dirs @@ -0,0 +1,7 @@ +usr/bin +usr/share/pcremote-server +usr/share/pcremote-server/images +usr/share/applications +usr/share/icons/hicolor/48x48/ +usr/share/menu + diff --git a/pcremote-server-desktop/debian/docs b/pcremote-server-desktop/debian/docs new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/files b/pcremote-server-desktop/debian/files new file mode 100755 index 0000000..827d4d5 --- /dev/null +++ b/pcremote-server-desktop/debian/files @@ -0,0 +1 @@ +pcremote-server_0.60-1_all.deb net optional diff --git a/pcremote-server-desktop/debian/pcremote-server/DEBIAN/control b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/control new file mode 100755 index 0000000..a4c3f2a --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/control @@ -0,0 +1,9 @@ +Package: pcremote-server +Version: 0.50-1 +Architecture: all +Maintainer: Jonatas Isvi , Andre Portela , Nilson Silva +Installed-Size: 461 +Depends: python-bluetooth, python-dcop, python-xlib, python2.5, python2.5-gtk2, python2.5-notify +Section: net +Priority: optional +Description: A server application of PCRemote Client diff --git a/pcremote-server-desktop/debian/pcremote-server/DEBIAN/md5sums b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/md5sums new file mode 100755 index 0000000..9213ec0 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/md5sums @@ -0,0 +1,95 @@ +1753f2a532e9218207f37d8deab8d559 usr/bin/pcremote-server +a45cefda3455e840e85003b8b01fab75 usr/share/doc/pcremote-server/README.Debian +c8953c952799be3f2e28d1144864b68a usr/share/doc/pcremote-server/copyright +76f32feb0e14910d0ba95ec54e235fb2 usr/share/doc/pcremote-server/changelog.Debian.gz +edfe58d9bcd05825af84b80c77794cc9 usr/share/menu/pcremote-server-menu +2553d9134379e7199e7bb4c8995467f9 usr/share/icons/pcremote.png +c228a4f323d17e3a589b979e11f2cbc6 usr/share/pcremote-server/pcremote-server.py +e2f5948c1c71348f50834f5579aa2448 usr/share/pcremote-server/utils/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/utils/.svn/format +606a6ee70138fd606222cd4c3162cc3f usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/utils/.svn/text-base/__init__.py.svn-base +6c9741bd79bbd0f1ac82d2d98614032d usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base +4160c74de5f4e580dc15660c798ff9fc usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base +5eed0b1df833b280b647cf2e6d5a8e98 usr/share/pcremote-server/utils/messages.py +e611e04d448a689e17eb788c910721f1 usr/share/pcremote-server/utils/labels.py +7b7040ac3d2fed14a34e738957629dc1 usr/share/pcremote-server/utils/labels.pyc +63a0bef02a2757c61ead56bf6796d60f usr/share/pcremote-server/utils/plistparser.pyc +a7e8dfcbaa82ac40a6bf395d517cbddc usr/share/pcremote-server/utils/__init__.pyc +8923dc021f420a77b5a28f721c232cbf usr/share/pcremote-server/utils/.messages.py.swp +606a6ee70138fd606222cd4c3162cc3f usr/share/pcremote-server/utils/plistparser.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/utils/__init__.py +59724740128fb59b5dd1273401874252 usr/share/pcremote-server/utils/messages.pyc +c5110a93e1ffa5b18c635ded207d76fb usr/share/pcremote-server/runserver.py +19faca80edd182a92fe6f64d73aebb42 usr/share/pcremote-server/exceptions/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/exceptions/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/exceptions/.svn/text-base/__init__.py.svn-base +41e514c3297ce38f7bd5d4f687fcaa9b usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base +41e514c3297ce38f7bd5d4f687fcaa9b usr/share/pcremote-server/exceptions/exception.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/exceptions/__init__.py +524491cd9ca8dea18f30ef233cb8978e usr/share/pcremote-server/connection/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/connection/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/connection/.svn/text-base/__init__.py.svn-base +5a23a701cbe84644991072a94b636f35 usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base +159366919bc6213b7f6fae65dc603afa usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base +518124236f6ddf6a0c67621853cd7229 usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base +67af5797d41770d8801ca335f011ea7f usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base +40c3baa616b5b755cc1cecd8a5f1b3ad usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base +d1482494e6bb3303ce0429ffa850dc35 usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc +159366919bc6213b7f6fae65dc603afa usr/share/pcremote-server/connection/genericconnectionmanager.py +5a23a701cbe84644991072a94b636f35 usr/share/pcremote-server/connection/iconnection.py +9a80f72334e101112f47fa9ec901112f usr/share/pcremote-server/connection/iconnection.pyc +5bc7343620d48d1ecea605b8af19ec84 usr/share/pcremote-server/connection/genericconnectionmanager.pyc +a5321f2c5c98bd3c8450df64a004583c usr/share/pcremote-server/connection/__init__.pyc +518124236f6ddf6a0c67621853cd7229 usr/share/pcremote-server/connection/wirelessconnectionmanager.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/connection/__init__.py +04c9700d63f069c392d0a0dc50a6f86a usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc +41b5d259ee21e96f37d46057de1286b9 usr/share/pcremote-server/connection/bluetoothconnectionmanager.py +2e2252560040d89f8e5f2d1be0fa5fd0 usr/share/pcremote-server/images/28x.png +bd14172f103bc22fd71d207f73288798 usr/share/pcremote-server/images/PCR_off.bmp +78b30ee0922a6dea20e4994d55138f94 usr/share/pcremote-server/images/remote48x.png +c2b65883ae6c4abe9f4c07ed14fe2a14 usr/share/pcremote-server/images/PCR_on.bmp +2553d9134379e7199e7bb4c8995467f9 usr/share/pcremote-server/images/64x.png +377847b28c4975963ce8219842ce8aea usr/share/pcremote-server/services/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/services/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/services/.svn/text-base/__init__.py.svn-base +61fef10722e4d9d7faac93a03ac1ceb1 usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base +5c25986a6c09a7313d8f5f51b509a5e6 usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base +10874c65035a891cb60e1ccb8b2bdb4f usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base +f2ea0bdf4310dae3aef66de358bcb0e1 usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base +e3bc8888bb26adc2ae1080f7fcf17775 usr/share/pcremote-server/services/ObjectServers.pyc +8ad0339242867f55475269131c4583fb usr/share/pcremote-server/services/ObjectServers.py +d2fa096c8b7a13f49b951b095c56a488 usr/share/pcremote-server/services/service.py +92eb3a43b65d8623450a4da25a3253c5 usr/share/pcremote-server/services/__init__.pyc +e51233968b28ef0cc4432ac5f0551bc6 usr/share/pcremote-server/services/service.pyc +e17b75b7195bde77678f182c9c3d6c75 usr/share/pcremote-server/services/ServerHandlers.pyc +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/services/__init__.py +9f1fa958a013f07a15371fa87c86db61 usr/share/pcremote-server/services/ServerHandlers.py +9c5bd8128615edd69f3305403d986d0b usr/share/pcremote-server/players/.svn/entries +c30f7472766d25af1dc80b3ffc9a58c7 usr/share/pcremote-server/players/.svn/format +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/players/.svn/text-base/__init__.py.svn-base +094e2893e7aec596fb90a6607a859c75 usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base +b34d77d5e136ac5cb2fb4c25d9de4d05 usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base +4160c74de5f4e580dc15660c798ff9fc usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base +4160c74de5f4e580dc15660c798ff9fc usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base +8b5f2d28c14e6692bba63297265922bb usr/share/pcremote-server/players/amarok.py +54de8542cfadb0d06ed031f99708b188 usr/share/pcremote-server/players/plistparser.pyc +f48363745edc09905b10e795e20e3b93 usr/share/pcremote-server/players/__init__.pyc +a9c843b72e72ba346236f98a9f5e7e44 usr/share/pcremote-server/players/playlist.pyc +a0b92dcdc153c3de2ba3b56cb2a2d9b2 usr/share/pcremote-server/players/amarok.pyc +85eaeb39ee8b3d24aae6a12fcfe63bbf usr/share/pcremote-server/players/run-amarok.py +606a6ee70138fd606222cd4c3162cc3f usr/share/pcremote-server/players/plistparser.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pcremote-server/players/__init__.py +36827397437058edc107018640a1c2bc usr/share/pcremote-server/players/playlist.py +9aa2031a03c14f89f570789b8abebaa8 usr/share/applications/pcremote-server.desktop diff --git a/pcremote-server-desktop/debian/pcremote-server/DEBIAN/postinst b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/postinst new file mode 100755 index 0000000..d183a6b --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/postinst @@ -0,0 +1,9 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + +#ln -s /usr/share/pcremote-server/pcremote-server.py /usr/bin/pcremote-server.py +#chmod +x /usr/bin/pcremote-server.py diff --git a/pcremote-server-desktop/debian/pcremote-server/DEBIAN/postrm b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/postrm new file mode 100755 index 0000000..4fa6e54 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/DEBIAN/postrm @@ -0,0 +1,25 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/pcremote-server.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-server + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-server + +# Delete the pcremote icon +rm -f /usr/share/icons/hicolor/48x48/pcremote.png + +# Delete the pcremote menu +rm -f /usr/share/menu/pcremote-server-menu + +exit 0 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/bin/pcremote-server b/pcremote-server-desktop/debian/pcremote-server/usr/bin/pcremote-server new file mode 100755 index 0000000..de17562 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/bin/pcremote-server @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-server/pcremote-server.py diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/applications/pcremote-server.desktop b/pcremote-server-desktop/debian/pcremote-server/usr/share/applications/pcremote-server.desktop new file mode 100755 index 0000000..c9d5a8c --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/applications/pcremote-server.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.50 +Type=Application +Icon=/usr/share/hicolor/48x48/pcremote.png +Name=PCRemote Server +Exec=pcremote-server +Terminal=false +Categories=Application;Network;GTK; +StartupNotify=true diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/README.Debian b/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/README.Debian new file mode 100755 index 0000000..fdaa542 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/README.Debian @@ -0,0 +1,6 @@ +pcremote-client for Debian +---------------------- + + + + -- Jonatas Isvi Mon, 30 Mar 2009 18:53:24 -0400 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/changelog.Debian.gz b/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/changelog.Debian.gz new file mode 100755 index 0000000..f3562ff Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/changelog.Debian.gz differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/copyright b/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/copyright new file mode 100755 index 0000000..8520c24 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/doc/pcremote-server/copyright @@ -0,0 +1,17 @@ +Copyright (c) 2009 Zagaia Lab (INdT/Fucapi). +This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . + + Project Name: PC Remote Server + Author(s) : Jonatas Isvi , Andre Portela , + Nilson Silva diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/icons/pcremote.png b/pcremote-server-desktop/debian/pcremote-server/usr/share/icons/pcremote.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/icons/pcremote.png differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/menu/pcremote-server-menu b/pcremote-server-desktop/debian/pcremote-server/usr/share/menu/pcremote-server-menu new file mode 100755 index 0000000..d7fea37 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/menu/pcremote-server-menu @@ -0,0 +1,6 @@ +?package(pcremote-server): \ + needs="X11" \ + section:"Applications/Network" \ + title="PCRemote Server" \ + command="pcremote-server" \ + icon="/usr/share/icons/hicolor/48x48/pcremote.png" diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/entries b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/entries new file mode 100755 index 0000000..e1ea3e5 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/entries @@ -0,0 +1,93 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/connection +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:21:45.815695Z +31 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +iconnection.py +file + + + + +2008-11-24T19:10:09.000000Z +5a23a701cbe84644991072a94b636f35 +2008-11-24T19:08:20.539642Z +24 +aportela +has-props + +wirelessconnectionmanager.py +file + + + + +2008-11-24T19:21:26.000000Z +518124236f6ddf6a0c67621853cd7229 +2008-11-24T19:21:45.815695Z +31 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +bluetoothconnectionmanager.py +file + + + + +2008-11-24T19:09:16.000000Z +67af5797d41770d8801ca335f011ea7f +2008-11-24T19:09:43.908566Z +25 +aportela +has-props + +genericconnectionmanager.py +file + + + + +2008-11-24T19:11:06.000000Z +159366919bc6213b7f6fae65dc603afa +2008-11-24T19:11:23.207768Z +26 +aportela +has-props + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/format b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..085986a --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,9 @@ +K 14 +svn:executable +V 1 +* +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/iconnection.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/prop-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base new file mode 100755 index 0000000..bda3c98 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/bluetoothconnectionmanager.py.svn-base @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/genericconnectionmanager.py.svn-base @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/iconnection.py.svn-base @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/.svn/text-base/wirelessconnectionmanager.py.svn-base @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.pyc new file mode 100755 index 0000000..a2fa83b Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/__init__.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.py new file mode 100755 index 0000000..581b0f8 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : connection +# Description : BluetoothConnectionManager +# ============================================================================ + +import bluetooth +from exceptions import * +from genericconnectionmanager import * + +class BluetoothConnectionManager(GenericConnectionManager): + + """ BluetoothConnectionManager + + manages objects and operations for bluetooth connection. + Subclass of GerericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.sock = None + self.port = None + self.address = None + self.client_sock = None + self.client_address = None + + # fast way to create a simple server + def create_server(self, protocol, port): + self.create_socket(protocol) + self.set_port(port) + self.bind() + self.listen() + self.accept() + + # fast way to create a simple client + def create_client(self, protocol, address, port): + self.create_socket(protocol) + self.set_address(address) + self.set_port(port) + self.connect() + + # search for all devices + def find_devices(self, time=8): + list_devices = bluetooth.discover_devices(lookup_names = True, duration=time) + if list_devices: + print list_devices + return list_devices + else: + raise BluetoothConnectionError, "Device were not found." + + # search the device port + def find_port(self, addr): + port = None + aux = addr.split(":") + if len(aux) == 6: + services = bluetooth.find_service(address=addr) + for i in range(len(services)): + port = services[i]['port'] + + if port != None: + return port + else: + raise BluetoothConnectionError, "Port not found." + + else: + raise BluetoothConnectionError, "Invalid address." + + # search device services + def find_services(self, service=None, addr=None): + if service == None and addr == None: + list = bluetooth.find_service() + return list + elif service != None and addr == None: + list = bluetooth.find_service(name=service) + if list != []: + return list + else: + raise BluetoothConnectionError, "Name of the service does not exist." + elif service == None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + elif service != None and addr != None: + number = addr.split(":") + if(len(number) == 6): + list = bluetooth.find_service(name=service, address=addr) + if list != []: + return list + else: + raise BluetoothConnectionError, "Services not found." + else: + raise BluetoothConnectionError, "Invalid address." + + + # search the device indicated by name + def find_device_address_by_name(self, device_name): + list = bluetooth.discover_devices() + addr = None + + for address in list: + if device_name == bluetooth.lookup_name(address): + addr = address + break + if addr: + return addr + else: + raise BluetoothConnectionError, "Device name not found." + + # search only device names + def find_devices_only_names(self): + list = self.find_devices() + list_names = [] + for address, names in list: + list_names += [names] + + if list_names: + return list_names + else: + raise BluetoothConnectionError, "Devices were not found." + + # get the client address + def get_client_address(self): + return self.client_address + + # set the port to communicate + def set_port(self, port): + self.port = port + + # get the port to communicate + def get_port(self): + return self.port + + # set the device address + def set_address(self, address): + aux = address.split(":") + if len(aux) == 6: + self.address = address + else: + raise BluetoothConnectionError, "Invalid address." + + # get the device address + def get_address(self): + return self.address + + # create a socket with a determinated protocol + def create_socket(self, protocol=None): + if protocol == 'rfcomm' or protocol == 'RFCOMM': + self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + elif protocol == 'l2cap' or protocol == 'L2CAP': + self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) + else: + raise BluetoothConnectionError, "Undefined Protocol." + + # bind the communication + def bind(self): + self.sock.bind(("", self.get_port())) + + # just listen the tube, only to server + def listen(self): + self.sock.listen(1) + + # accept the client communication + def accept(self): + self.client_sock, self.client_address = self.sock.accept() + + # connect devices + def connect(self): + self.sock.connect((self.get_address(), self.get_port())) + + # send string message + def send_message(self, msg=None): + self.sock.send(msg) + + # receive string message + def received_message(self): + return self.client_sock.recv(1024) + + # close connection + def close(self): + if self.sock != None and self.client_sock != None: + self.client_sock.close() + self.sock.close() + elif self.sock != None and self.client_sock == None: + self.sock.close() + else: + self.client_sock.close() + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc new file mode 100755 index 0000000..a829ae4 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/bluetoothconnectionmanager.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.py new file mode 100755 index 0000000..30a2894 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : GenericConnectionManager +# ============================================================================ + + +class GenericConnectionManager: + + """ GenericConnectionManager + Superclass of connections + """ + + def __init__(self): + print "GenericConnectionManager iniciado." + self.tipo = "generico" + + # current service running + def identify_app(self): + print "identify_app" diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.pyc new file mode 100755 index 0000000..6dca356 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/genericconnectionmanager.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.py new file mode 100755 index 0000000..310d175 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : connection +# Description : Iconnection Interface Class +# ============================================================================ + +from wirelessconnectionmanager import * +from bluetoothconnectionmanager import * +from exceptions import * + +# connections aliases +_btconst = ['bluetooth', 'BLUETOOTH', 'blue'] +_wificonst = ['wireless', 'WIRELESS', 'wifi'] + +class Iconnection: + + """ Iconnection + Interface for wireless and bluetooth connections. + Manages all commonalities operations between entities. + """ + def __init__(self, string): + self.string = string + if(self.string in _btconst): + self.obj = BluetoothConnectionManager() + elif(self.string in _wificonst): + self.obj = WirelessConnectionManager() + else: + raise IconnectionError, "Undefined type." + + + # +---------------------------------------------+ + # | Generic methods -> Wireless and Bluetooth | + # +---------------------------------------------+ + + # create a socket with defined protocol + def create_socket(self, protocol=None): + self.obj.create_socket(protocol) + + # connect device + def connect(self): + self.obj.connect() + + # accept the connection + def accept(self): + return self.obj.accept() + + # send a message to device + def send_message(self, msg=None): + self.obj.send_message(msg) + + # received a message + def received_message(self): + return self.obj.received_message() + + # bind the connection + def bind(self): + self.obj.bind() + + # listen the connection + def listen(self): + self.obj.listen() + + # close connection + def close(self): + self.obj.close() + + # set the port to communicate + def set_port(self, port): + self.obj.set_port(port) + + # get the port to communicate + def get_port(self): + return self.obj.get_port() + + # set the device address + def set_address(self, address): + self.obj.set_address(address) + + # get the device address + def get_address(self): + return self.obj.get_address() + + # get the client address + def get_client_address(self): + return self.obj.get_client_address() + + # +------------------------------------------+ + # | Bluetooth: particular behaviors | + # +------------------------------------------+ + + # fast way to create a simple server + def bluetooth_create_server(self, protocol, port): + if self.string in _btconst: + return self.obj.create_server(protocol, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # fast way to create a simple client + def bluetooth_create_client(self, protocol, address, port): + if self.string in _btconst: + return self.obj.create_client(protocol, address, port) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search for all devices + def bluetooth_find_devices(self, time=8): + if self.string in _btconst: + return self.obj.find_devices(time) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search only devices names + def bluetooth_find_devices_only_names(self): + if self.string in _btconst: + return self.obj.find_devices_only_names() + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search the device port + def bluetooth_find_port(self, addr): + if self.string in _btconst: + return self.obj.find_port(addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + # search device services + def bluetooth_find_services(self, service=None, addr=None): + if self.string in _btconst: + return self.obj.find_services(service, addr) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + # search the device indicated by name + def bluetooth_find_device_address_by_name(self, device_name=None): + if self.string in _btconst: + return self.obj.find_device_address_by_name(device_name) + else: + raise IconnectionError, "Only method used by Bluetooth connections." + + + + # +---------------------------------+ + # | Wireless: particular behaviors | + # +---------------------------------+ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.pyc new file mode 100755 index 0000000..bba16a9 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/iconnection.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.py new file mode 100755 index 0000000..e92ec3d --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : André Portela +# Email : andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 0.1 +# Package : connection +# Description : Wireless Connection Manager Class +# ============================================================================ + +from genericconnectionmanager import * + +class WirelessConnectionManager(GenericConnectionManager): + + """ WirelessConnectionManager + Manages objects and operations for wireless connection. + Subclass of GenericConnectionManager. + """ + + def __init__(self): + GenericConnectionManager.__init__(self) + self.tipo = "wireless" + + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc new file mode 100755 index 0000000..de37a7c Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/connection/wirelessconnectionmanager.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/entries b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/entries new file mode 100755 index 0000000..fb958a2 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/entries @@ -0,0 +1,54 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/exceptions +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:15:49.820782Z +27 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +exception.py +file + + + + +2008-11-24T19:15:30.000000Z +41e514c3297ce38f7bd5d4f687fcaa9b +2008-11-24T19:15:49.820782Z +27 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/format b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/prop-base/exception.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/.svn/text-base/exception.py.svn-base @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/__init__.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/exception.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/exception.py new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/exceptions/exception.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/28x.png b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/28x.png new file mode 100755 index 0000000..9c918db Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/28x.png differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/64x.png b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/64x.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/64x.png differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/PCR_off.bmp b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/PCR_off.bmp new file mode 100755 index 0000000..c686d43 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/PCR_off.bmp differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/PCR_on.bmp b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/PCR_on.bmp new file mode 100755 index 0000000..84f4109 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/PCR_on.bmp differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/remote48x.png b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/remote48x.png new file mode 100755 index 0000000..22b5640 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/images/remote48x.png differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/pcremote-server.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/pcremote-server.py new file mode 100755 index 0000000..e1b5e07 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/pcremote-server.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +from runserver import Server +import gtk +import thread +import sys + +class Service: + + def start_server(self, widget): + + if self.connected == False: + imagepath = self.images.replace('pcremote-server.py','images/PCR_on.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Online") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_MENU) + self.menuItemCon.set_image(img) + + self.srv = Server("PC Remote") + thread.start_new_thread(Server.start,(self.srv,"server")) + + else: + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Offline") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) + + self.menuItemCon.set_image(img) + + thread.exit_thread() + + self.connected = not self.connected + + def destroyer(self, widget,response_id, data= None): + if response_id == gtk.RESPONSE_OK: + gtk.main_quit() + else: + widget.hide() + + def popup(self, widget): + dialog = gtk.MessageDialog( + parent = None, + flags = gtk.DIALOG_DESTROY_WITH_PARENT, + type = gtk.MESSAGE_INFO, + buttons = gtk.BUTTONS_OK_CANCEL, + message_format = "Do you want to shut the server down?") + dialog.set_title('PC Remote Server') + dialog.connect('response', self.destroyer) + dialog.show() + + def popup_menu_cb(self, widget, button, time, data = None): + if button == 3: + if data: + data.show_all() + data.popup(None, None, None, 3, time) + + + def __init__(self): + + self.images = sys.argv[0] + self.connected = False + + self.staticon = gtk.StatusIcon() + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server(offline)") + + self.menu = gtk.Menu() + + self.menuItemCon = gtk.ImageMenuItem(gtk.STOCK_EXECUTE) + self.menuItemCon.connect('activate', self.start_server) + + self.menuItemExit = gtk.ImageMenuItem(gtk.STOCK_QUIT) + self.menuItemExit.connect('activate', self.popup) + + self.menu.append(self.menuItemCon) + self.menu.append(self.menuItemExit) + + self.staticon.connect('popup-menu', self.popup_menu_cb, self.menu) + + self.staticon.set_visible(True) + + gtk.gdk.threads_init() + gtk.gdk.threads_enter() + + gtk.main() + + gtk.gdk.threads_leave() + +print sys.argv +Srv = Service() + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/entries b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/entries new file mode 100755 index 0000000..2e7676e --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/entries @@ -0,0 +1,66 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/players +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:19:59.926000Z +42 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +amarok.py +file + + + + +2008-11-24T19:22:32.000000Z +b34d77d5e136ac5cb2fb4c25d9de4d05 +2008-11-24T19:22:46.499502Z +32 +aportela +has-props + +__init__.py +file + + + + +2008-11-21T20:05:30.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-11-21T20:06:45.989300Z +12 +aportela + +playlist.py +file + + + + +2008-11-24T19:23:01.000000Z +094e2893e7aec596fb90a6607a859c75 +2008-11-24T19:23:20.208723Z +33 +aportela +has-props + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/format b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/amarok.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/prop-base/playlist.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base new file mode 100755 index 0000000..5e235b3 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/amarok.py.svn-base @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + +# starts the amarok player application +def start(): + os.popen('amarok') + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def audio_file_properties(self, index=None): + audiofile = (self.playlist.song_filename(index),\ + self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + def play(self): + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + def play_track(self, index): + self.amarok.playlist.playByIndex(index-1) + self.playlist.update(index, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # random play songs + def play_random(self): + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index+1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base new file mode 100755 index 0000000..0cbc97b --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/.svn/text-base/playlist.py.svn-base @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong - 1]['title'] == 'Unknown Title': + self.songs[self.currentSong - 1]['title'] = title + if self.songs[self.currentSong - 1]['artist'] == 'Unknown Artist': + self.songs[self.currentSong - 1]['artist'] = artist + self.songs[self.currentSong - 1]['path'] = path + self.songs[self.currentSong - 1]['extension'] = ext + print self.songs[self.currentSong - 1] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong - 1]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong - 1]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong - 1]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong-1]['title'] +" - "+\ + self.songs[self.currentSong-1]['artist'] + \ + self.songs[self.currentSong-1]['extension'] + + else: + return self.songs[index-1]['title'] +" - "+\ + self.songs[index-1]['artist'] + \ + self.songs[index-1]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong-1]['filesize']) + else: + return int(self.songs[index-1]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong-1]['track'] + if title: + props['title'] = self.songs[self.currentSong-1]['title'] + if artist: + props['artist'] = self.songs[self.currentSong-1]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong-1]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong-1]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong-1]['duration'] + if path: + props['path'] = self.songs[self.currentSong-1]['path'] + + return props + else: + if track: + props['track'] = self.songs[index-1]['track'] + if title: + props['title'] = self.songs[index-1]['title'] + if artist: + props['artist'] = self.songs[index-1]['artist'] + if ext: + props['ext'] = self.songs[index-1]['extension'] + if filesize: + props['filesize'] = self.songs[index-1]['filesize'] + if duration: + props['duration'] = self.songs[index-1]['duration'] + if path: + props['path'] = self.songs[index-1]['path'] + + return props + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/__init__.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/__init__.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/__init__.pyc new file mode 100755 index 0000000..559af06 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/__init__.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/amarok.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/amarok.py new file mode 100755 index 0000000..2d54fb0 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/amarok.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + + +# starts the amarok player application +def start(): + os.popen('amarok') + + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +def send_file(addr, path): + shell("bluetooth-sendto --dest=%s %s" + (addr, path)) + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def file_properties(self, index=None): + track = self.amarok.playlist.getActiveIndex() + audiofile = self.playlist.song_properties(index=track, path=True) + #audiofile = (self.playlist.song_filename(index),\ + # self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + #def play(self): + #self.amarok.player.play() + #self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(), \ + # ) + + # play button and sets current song + # receive track or random form + # the argument track has intended to manipulate + # the playlist form when the user indicate a song track + # in client application + def play(self, track=-1, rdm=False): + if rdm: + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index + 1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + elif track != -1: + self.amarok.playlist.playByIndex(track) + self.playlist.update(track-1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + else: + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + #def play_track(self, index): + # self.amarok.playlist.playByIndex(index-1) + # self.playlist.update(index, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # random play songs + #def play_random(self): + # index = random.randint(0, self.playlist.length() - 1) + # self.amarok.playlist.playByIndex(index) + # self.playlist.update(index+1, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/amarok.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/amarok.pyc new file mode 100755 index 0000000..95f5180 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/amarok.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/playlist.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/playlist.py new file mode 100755 index 0000000..31a3a61 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/playlist.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong]['title'] == 'Unknown Title': + self.songs[self.currentSong]['title'] = title + if self.songs[self.currentSong]['artist'] == 'Unknown Artist': + self.songs[self.currentSong]['artist'] = artist + self.songs[self.currentSong]['path'] = path + self.songs[self.currentSong]['extension'] = ext + print self.songs[self.currentSong] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong]['title'] +" - "+\ + self.songs[self.currentSong]['artist'] + \ + self.songs[self.currentSong]['extension'] + + else: + return self.songs[index]['title'] +" - "+\ + self.songs[index]['artist'] + \ + self.songs[index]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong]['filesize']) + else: + return int(self.songs[index]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong]['track'] + if title: + props['title'] = self.songs[self.currentSong]['title'] + if artist: + props['artist'] = self.songs[self.currentSong]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong]['duration'] + if path: + props['path'] = self.songs[self.currentSong]['path'] + + return props + else: + if track: + props['track'] = self.songs[index]['track'] + if title: + props['title'] = self.songs[index]['title'] + if artist: + props['artist'] = self.songs[index]['artist'] + if ext: + props['ext'] = self.songs[index]['extension'] + if filesize: + props['filesize'] = self.songs[index]['filesize'] + if duration: + props['duration'] = self.songs[index]['duration'] + if path: + props['path'] = self.songs[index]['path'] + + return props + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/playlist.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/playlist.pyc new file mode 100755 index 0000000..185f310 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/playlist.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.pyc new file mode 100755 index 0000000..ab2a86a Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/plistparser.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/run-amarok.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/run-amarok.py new file mode 100755 index 0000000..2d8e9bf --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/players/run-amarok.py @@ -0,0 +1,43 @@ +import amarok + +if not amarok.isRunning(): + player = amarok.AmarokPlayer() +else: + print "entrou aqui" + amarok.start() + player = amarok.AmarokPlayer() + +while(1): + data = raw_input(">>> ") + if data == '#exit' or data == '#quit' or data == '#close': + print "Application closed." + amarok.shutdown() + break + elif data == 'next': + player.next() + elif data == 'prev': + player.prev() + elif data == 'play': + player.play() + elif data == 'pause': + player.pause() + elif data == 'stop': + player.stop() + elif data == 'mute': + player.mute() + elif data == 'volume-up': + player.volume_up() + elif data == 'volume-down': + player.volume_down() + elif data == 'current_song': + print player.current_song() + elif data == 'random': + player.play_random() + elif data == 'play-track': + index = input('track: ') + player.play_track(index) + elif data == 'refresh': + player.refresh_playlist() + elif data == 'show': + player.song_list() + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/runserver.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/runserver.py new file mode 100755 index 0000000..01ece58 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/runserver.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson ; Jonatas Izvi; Andre Portela +# Email : fergus.mao@gmail.com ; nona@gmail.com ; +# andre_portela_@hotmail.com; +# Version : 1.0 +# Class : Server File - This is the main script of the server +# ============================================================================ + +from connection.iconnection import * +from services.service import * +from utils import * +from utils.messages import * + +class Server(): + + def __init__(self, AppName): + self.msgbox = Message(AppName) + self.msgbox.show_message("Server Initialized...") + + def start(self, servername): + + label = Labels() + iconn = Iconnection('blue') + iconn.bluetooth_create_server('l2cap', 0x1001) + + address = iconn.get_client_address() + + self.msgbox.show_message("Accepted connection from " + address[0]) + + while (1): + + data = iconn.received_message() + + if data == 'Tablet:#start': + + self.msgbox.show_message('Service Tablet initialized...') + + service = Service() + service.set_service('Tablet') + + while(1): + data = iconn.received_message() + if data == 'Tablet:#stop': + service.clean_all() + self.msgbox.show_message('Service Tablet stoped') + break + service.execute(data) + + elif data == 'Slideshow:#start': + + self.msgbox.show_message('Service Slideshow initialized...') + + service = Service() + service.set_service('Slideshow') + + while(1): + data = iconn.received_message() + if data == 'Slideshow:#stop': + service.clean_all() + self.msgbox.show_message('Service Slideshow stoped') + break + print data, "\n" + service.execute(data) + + elif data == 'Player:#start': + + self.msgbox.show_message('Service Player initialized...') + + service = Service() + service.set_service('Player') + + while(1): + data = iconn.received_message() + if data == 'Player:#stop': + self.msgbox.show_message('Service Player stoped') + break + elif data == 'Player:#download': + service.set_address_to_download(address[0]) + elif data == 'Player:#load_playlist': + # e preciso criar um metodo de transferencia + # no caso de carregar uma playlist para o cliente + service.execute_transfer(data) + + service.execute(data) + + else: + exit(1) + + self.msgbox.show_message('Desconected from ' + address[0]) diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/entries b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/entries new file mode 100755 index 0000000..11b2d8a --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/entries @@ -0,0 +1,80 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/services +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T21:43:13.543262Z +39 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +ObjectServers.py +file + + + + +2008-11-24T21:42:50.000000Z +61fef10722e4d9d7faac93a03ac1ceb1 +2008-11-24T21:43:13.543262Z +39 +aportela +has-props + +service.py +file + + + + +2008-11-24T21:41:33.000000Z +10874c65035a891cb60e1ccb8b2bdb4f +2008-11-24T21:41:51.237514Z +37 +aportela +has-props + +ServerHandlers.py +file + + + + +2008-11-24T21:42:13.000000Z +5c25986a6c09a7313d8f5f51b509a5e6 +2008-11-24T21:42:30.576563Z +38 +aportela +has-props + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/format b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ObjectServers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/ServerHandlers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/prop-base/service.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..33e5a17 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ObjectServers.py.svn-base @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self): + + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + self.mouse.position(i, j) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up_mouse(self): + self.mouse.clean_up_mouse() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self.keys = [] + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(command == 'ISO_Level3_Shift'): + self.keyboard.reproduce_key_press('Escape') + self.keyboard.reproduce_key_release('Escape') + pass + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + self.keys.append(command) + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + else: + + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + self.keys.remove('Control_R') + self.control_flag = False + + # clean all keys pressed + def clean_up_keyboard(self): + print "\nkeys -> ", self.keys + list = self.keys + print "\nlist ->", list + for i in list: + self.keyboard.reproduce_key_release(i) + self.keys.remove(i) + print "\nkey --> ", i, " removed." + + print self.keys diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..352d1e7 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/ServerHandlers.py.svn-base @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up_mouse(self): + list = self.buttons + print list + for i in list: + if i == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nleft_button -> release." + elif i == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove(i) + print "\nmiddle_button -> release." + elif i == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nright_button -> release." + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base new file mode 100755 index 0000000..b0143a0 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/.svn/text-base/service.py.svn-base @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.service = "" + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Player': + print "player service." + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up_mouse() + self.keyboard_srv.clean_up_keyboard() diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.py new file mode 100755 index 0000000..819f1f9 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * +from players import amarok + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self, service): + self._service_name = service + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + if self._service_name == "Tablet": + self.mouse.position(i, j) + else: + self.mouse.position(-j, i) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up(self): + self.mouse.clean_up() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self, service): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self._service_name = service + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(self._service_name == 'Slideshow' and command == 'F6'): + self.keyboard.reproduce_key_press('F5') + self.keyboard.reproduce_key_release('F5') + elif(command == 'ISO_Level3_Shift'): + self.keyboard.reproduce_key_press('Escape') + self.keyboard.reproduce_key_release('Escape') + pass + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + #self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + #self.keys.append(command) + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + else: + + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + #self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + #self.keys.remove('Control_R') + self.control_flag = False + + # clean all keys pressed + def clean_up(self): + self.keyboard.clean_up() + +class Player_Server(): + + def __init__(self): + if not amarok.isRunning(): + self.player = amarok.AmarokPlayer() + else: + amarok.start() + self.player = amarok.AmarokPlayer() + self.labels = Labels() + + def execute(self, command): + if len(command) > 2: + if command[1] == self.labels.PLAY: + if command[2] and command[3]: + self.player.play(track=int(command[2]), rmd=bool(command[3])) + elif command[2]: + arg = int(command[2]) + if isinstance(arg, int): + self.player.play(track=arg) + else: + arg = bool(command[2]) + self.player.play(rmd=arg) + else: + pass + else: + if command[1] == self.labels.STOP: + self.player.stop() + elif command[1] == self.labels.PLAY: + self.player.play() + elif command[1] == self.labels.PAUSE: + self.player.pause() + elif command[1] == self.labels.NEXT: + self.player.next() + elif command[1] == self.labels.PREVIOUS: + self.player.prev() + elif command[1] == self.labels.VOL_UP: + self.player.volume_up() + elif command[1] == self.labels.VOL_DOWN: + self.player.volume_down() + elif command[1] == self.labels.SEEK: + self.player.seek(int(command[2])) + elif command[1] == self.labels.DOWNLOAD: + path = self.player.file_properties() + addr = command[2] + amarok.send_file(addr, path) + pass + elif command[1] == self.labels.LOAD_PLAYLIST: + # falta o metodo de trasnferencia + pass + else: + pass diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.pyc new file mode 100755 index 0000000..7e4a26c Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ObjectServers.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py new file mode 100755 index 0000000..4b16012 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up(self): + if self.buttons: + while self.buttons: + button = self.buttons.pop() + if button == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + elif button == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + elif button == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + self.keys = [] + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + self.keys.append(key) + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + self.keys.remove(key) + + # clean all pressed keys + def clean_up(self): + if self.keys: + while self.keys: + key = self.keys.pop() + self.reproduce_key_release(key) + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.pyc new file mode 100755 index 0000000..dddc2af Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/ServerHandlers.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/__init__.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/__init__.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/__init__.pyc new file mode 100755 index 0000000..cd16e31 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/__init__.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/service.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/service.py new file mode 100755 index 0000000..778745b --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/service.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.player = None + self.service = "" + self.addr = None + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Player': + self.player_srv = Player_Server() + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + elif cmd[0] == "Player": + if self.addr: + cmd += self.addr + self.player_srv.execute(cmd) + else: + self.player_srv.execute(cmd) + + def set_address_to_download(self, addr): + self.addr = addr + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up() + self.keyboard_srv.clean_up() + +#teste unitario +if __name__ == '__main__': + import utils.plistparser diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/service.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/service.pyc new file mode 100755 index 0000000..2ce3a3f Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/services/service.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.messages.py.swp b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.messages.py.swp new file mode 100755 index 0000000..534af08 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.messages.py.swp differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/entries b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/entries new file mode 100755 index 0000000..32b05b2 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/entries @@ -0,0 +1,67 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/utils +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:06:21.176771Z +40 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +plistparser.py +file + + + + +2008-11-24T21:52:13.000000Z +606a6ee70138fd606222cd4c3162cc3f +2008-11-24T22:06:21.176771Z +40 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +labels.py +file + + + + +2008-11-03T19:55:46.000000Z +6c9741bd79bbd0f1ac82d2d98614032d +2008-11-03T20:22:42.774109Z +5 +aportela +has-props + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/format b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/labels.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/prop-base/plistparser.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base new file mode 100755 index 0000000..170c45e --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/labels.py.svn-base @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/.svn/text-base/plistparser.py.svn-base @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.pyc new file mode 100755 index 0000000..eb8942d Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/__init__.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/labels.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/labels.py new file mode 100755 index 0000000..044609c --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/labels.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # SERVICES SUPPORTED + TABLET = "Tablet" + SLIDESHOW = "Slideshow" + PLAYER = "Player" + TORRENT = "Torrent" + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + SEEK = "#seek" + LOAD_PLAYLIST = "#load_playlist" + PLAYLIST = "#playlist" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL_SRC = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/labels.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/labels.pyc new file mode 100755 index 0000000..0a5e1a0 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/labels.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/messages.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/messages.py new file mode 100755 index 0000000..b35cd58 --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/messages.py @@ -0,0 +1,37 @@ +import pynotify +import Image +import StringIO +import gtk + +class Message(): + def __init__(self, AppName): + pynotify.init(AppName) + self.AppName = AppName + self.msgbox = pynotify.Notification(self.AppName, self.AppName, "PCR_on.bmp") + self.msgbox.set_urgency(pynotify.URGENCY_CRITICAL) + self.msgbox.set_timeout(5000) + + def show_message(self, message): + self.msgbox = pynotify.Notification(self.AppName, message) + self.msgbox.show() + + def set_image(self, img): +# image = Image.open(img) +# image = gtk.gdk.pixbuf_new_from_file(img) +# self.msgbox.set_icon_from_pixbuf(self.image2pixbuf(image)) + pass + + def image2pixbuf(self, img): + file1 = StringIO.StringIO() + + img.save(file1, "ppm") + contents = file1.getvalue() + file1.close() + + loader = gtk.gdk.PixbufLoader("pnm") + loader.write(contents, len(contents)) + + pixbuf = loader.get_pixbuf() + loader.close() + + return pixbuf diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/messages.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/messages.pyc new file mode 100755 index 0000000..0c9c50a Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/messages.pyc differ diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.py b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.pyc b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.pyc new file mode 100755 index 0000000..1e46983 Binary files /dev/null and b/pcremote-server-desktop/debian/pcremote-server/usr/share/pcremote-server/utils/plistparser.pyc differ diff --git a/pcremote-server-desktop/debian/postinst b/pcremote-server-desktop/debian/postinst new file mode 100755 index 0000000..e15a0c5 --- /dev/null +++ b/pcremote-server-desktop/debian/postinst @@ -0,0 +1,7 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + diff --git a/pcremote-server-desktop/debian/postrm b/pcremote-server-desktop/debian/postrm new file mode 100755 index 0000000..4fa6e54 --- /dev/null +++ b/pcremote-server-desktop/debian/postrm @@ -0,0 +1,25 @@ +#!/bin/sh -e +set -e + +if which update-icon-caches >/dev/null 2>&1 ; then + update-icon-caches /usr/share/icons/hicolor +fi + +# remove configuration + +# Delete the .desktop file in case the app-installer didn't. +rm -f /usr/share/applications/pcremote-server.desktop + +# Delete the pcremoteclt directory in case the app-installer didn't +rm -fr /usr/share/pcremote-server + +# Delete the symbolics links files in case the app-installer didn't. +rm -f /usr/bin/pcremote-server + +# Delete the pcremote icon +rm -f /usr/share/icons/hicolor/48x48/pcremote.png + +# Delete the pcremote menu +rm -f /usr/share/menu/pcremote-server-menu + +exit 0 diff --git a/pcremote-server-desktop/debian/rules b/pcremote-server-desktop/debian/rules new file mode 100755 index 0000000..f45b7f5 --- /dev/null +++ b/pcremote-server-desktop/debian/rules @@ -0,0 +1,96 @@ +#!/usr/bin/make -f + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + ##$(MAKE) + #docbook-to-man debian/pcremote-server.sgml > pcremote-server.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + dh_clean + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + dh_installmenu + dh_icons + # Add here commands to install the package into debian/pcremote-server. + #$(MAKE) install DESTDIR=$(CURDIR)/debian/pcremote-server + mkdir -p $(CURDIR)/debian/pcremote-server + + ###insert your commands here + cp *.py $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r exceptions/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r images/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r services/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r players/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r connection/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + cp -r utils/ $(CURDIR)/debian/pcremote-server/usr/share/pcremote-server + + ### Installing menufile + # copy the file with the menu entry into /usr/share/applications + cp pcremote-server.desktop $(CURDIR)/debian/pcremote-server/usr/share/applications + cp pcremote.png $(CURDIR)/debian/pcremote-server/usr/share/icons + cp pcremote-server-menu $(CURDIR)/debian/pcremote-server/usr/share/menu + cp pcremote-server $(CURDIR)/debian/pcremote-server/usr/bin + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples +# dh_install + dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/pcremote-server-desktop/exceptions/.svn/entries b/pcremote-server-desktop/exceptions/.svn/entries new file mode 100755 index 0000000..fb958a2 --- /dev/null +++ b/pcremote-server-desktop/exceptions/.svn/entries @@ -0,0 +1,54 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/exceptions +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T19:15:49.820782Z +27 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +exception.py +file + + + + +2008-11-24T19:15:30.000000Z +41e514c3297ce38f7bd5d4f687fcaa9b +2008-11-24T19:15:49.820782Z +27 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + diff --git a/pcremote-server-desktop/exceptions/.svn/format b/pcremote-server-desktop/exceptions/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/exceptions/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/exceptions/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/exceptions/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/exceptions/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/exceptions/.svn/prop-base/exception.py.svn-base b/pcremote-server-desktop/exceptions/.svn/prop-base/exception.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/exceptions/.svn/prop-base/exception.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/exceptions/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/exceptions/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/exceptions/.svn/text-base/exception.py.svn-base b/pcremote-server-desktop/exceptions/.svn/text-base/exception.py.svn-base new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop/exceptions/.svn/text-base/exception.py.svn-base @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop/exceptions/__init__.py b/pcremote-server-desktop/exceptions/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/exceptions/exception.py b/pcremote-server-desktop/exceptions/exception.py new file mode 100755 index 0000000..697535b --- /dev/null +++ b/pcremote-server-desktop/exceptions/exception.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# package : exceptions +# Description : Exceptions +# ============================================================================ + +class BluetoothConnectionError(Exception): + ''' Treatment of errors bluetooth connections ''' + pass + +class WirelessConnectionError(Exception): + ''' Treatment of errors wireless connections ''' + pass + +class IconnectionError(Exception): + ''' Treatment of errors Iconnection class ''' + pass + + + + + + + + + + + + + diff --git a/pcremote-server-desktop/images/28x.png b/pcremote-server-desktop/images/28x.png new file mode 100755 index 0000000..9c918db Binary files /dev/null and b/pcremote-server-desktop/images/28x.png differ diff --git a/pcremote-server-desktop/images/64x.png b/pcremote-server-desktop/images/64x.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop/images/64x.png differ diff --git a/pcremote-server-desktop/images/PCR_off.bmp b/pcremote-server-desktop/images/PCR_off.bmp new file mode 100755 index 0000000..c686d43 Binary files /dev/null and b/pcremote-server-desktop/images/PCR_off.bmp differ diff --git a/pcremote-server-desktop/images/PCR_on.bmp b/pcremote-server-desktop/images/PCR_on.bmp new file mode 100755 index 0000000..84f4109 Binary files /dev/null and b/pcremote-server-desktop/images/PCR_on.bmp differ diff --git a/pcremote-server-desktop/images/remote48x.png b/pcremote-server-desktop/images/remote48x.png new file mode 100755 index 0000000..22b5640 Binary files /dev/null and b/pcremote-server-desktop/images/remote48x.png differ diff --git a/pcremote-server-desktop/pcremote-server b/pcremote-server-desktop/pcremote-server new file mode 100755 index 0000000..de17562 --- /dev/null +++ b/pcremote-server-desktop/pcremote-server @@ -0,0 +1,3 @@ +#!/bin/sh + +python /usr/share/pcremote-server/pcremote-server.py diff --git a/pcremote-server-desktop/pcremote-server-menu b/pcremote-server-desktop/pcremote-server-menu new file mode 100755 index 0000000..d7fea37 --- /dev/null +++ b/pcremote-server-desktop/pcremote-server-menu @@ -0,0 +1,6 @@ +?package(pcremote-server): \ + needs="X11" \ + section:"Applications/Network" \ + title="PCRemote Server" \ + command="pcremote-server" \ + icon="/usr/share/icons/hicolor/48x48/pcremote.png" diff --git a/pcremote-server-desktop/pcremote-server.desktop b/pcremote-server-desktop/pcremote-server.desktop new file mode 100755 index 0000000..59bc7da --- /dev/null +++ b/pcremote-server-desktop/pcremote-server.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.60 +Type=Application +Icon=/usr/share/hicolor/48x48/pcremote.png +Name=PCRemote Server +Exec=pcremote-server +Terminal=false +Categories=Application;Network;GTK; +StartupNotify=true diff --git a/pcremote-server-desktop/pcremote-server.py b/pcremote-server-desktop/pcremote-server.py new file mode 100755 index 0000000..195af3e --- /dev/null +++ b/pcremote-server-desktop/pcremote-server.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +from runserver import Server +import gtk +import thread +import sys + +class Service: + + def start_server(self, widget): + + if self.connected == False: + imagepath = self.images.replace('pcremote-server.py','images/PCR_on.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Online") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_MENU) + self.menuItemCon.set_image(img) + + self.srv = Server("PC Remote") + thread.start_new_thread(Server.start,(self.srv,"server")) + + else: + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server - Offline") + + img = gtk.Image() + img.set_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) + + self.menuItemCon.set_image(img) + + thread.exit_thread() + + self.connected = not self.connected + + def destroyer(self, widget,response_id, data= None): + if response_id == gtk.RESPONSE_OK: + gtk.main_quit() + else: + widget.hide() + + def popup(self, widget): + dialog = gtk.MessageDialog( + parent = None, + flags = gtk.DIALOG_DESTROY_WITH_PARENT, + type = gtk.MESSAGE_INFO, + buttons = gtk.BUTTONS_OK_CANCEL, + message_format = "Do you want to shut down the server?") + dialog.set_title('PC Remote Server') + dialog.connect('response', self.destroyer) + dialog.show() + + def popup_menu_cb(self, widget, button, time, data = None): + if button == 3: + if data: + data.show_all() + data.popup(None, None, None, 3, time) + + + def __init__(self): + + self.images = sys.argv[0] + self.connected = False + + self.staticon = gtk.StatusIcon() + imagepath = self.images.replace('pcremote-server.py','images/PCR_off.bmp') + self.staticon.set_from_file(imagepath) + self.staticon.set_tooltip("PC Remote Server(offline)") + + self.menu = gtk.Menu() + + self.menuItemCon = gtk.ImageMenuItem(gtk.STOCK_EXECUTE) + self.menuItemCon.connect('activate', self.start_server) + + self.menuItemExit = gtk.ImageMenuItem(gtk.STOCK_QUIT) + self.menuItemExit.connect('activate', self.popup) + + self.menu.append(self.menuItemCon) + self.menu.append(self.menuItemExit) + + self.staticon.connect('popup-menu', self.popup_menu_cb, self.menu) + + self.staticon.set_visible(True) + + gtk.gdk.threads_init() + gtk.gdk.threads_enter() + + gtk.main() + + gtk.gdk.threads_leave() + +print sys.argv +Srv = Service() diff --git a/pcremote-server-desktop/pcremote.png b/pcremote-server-desktop/pcremote.png new file mode 100755 index 0000000..2e13bd7 Binary files /dev/null and b/pcremote-server-desktop/pcremote.png differ diff --git a/pcremote-server-desktop/players/.svn/entries b/pcremote-server-desktop/players/.svn/entries new file mode 100755 index 0000000..2e7676e --- /dev/null +++ b/pcremote-server-desktop/players/.svn/entries @@ -0,0 +1,66 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/players +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:19:59.926000Z +42 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +amarok.py +file + + + + +2008-11-24T19:22:32.000000Z +b34d77d5e136ac5cb2fb4c25d9de4d05 +2008-11-24T19:22:46.499502Z +32 +aportela +has-props + +__init__.py +file + + + + +2008-11-21T20:05:30.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-11-21T20:06:45.989300Z +12 +aportela + +playlist.py +file + + + + +2008-11-24T19:23:01.000000Z +094e2893e7aec596fb90a6607a859c75 +2008-11-24T19:23:20.208723Z +33 +aportela +has-props + diff --git a/pcremote-server-desktop/players/.svn/format b/pcremote-server-desktop/players/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/players/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/players/.svn/prop-base/amarok.py.svn-base b/pcremote-server-desktop/players/.svn/prop-base/amarok.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop/players/.svn/prop-base/amarok.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop/players/.svn/prop-base/playlist.py.svn-base b/pcremote-server-desktop/players/.svn/prop-base/playlist.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop/players/.svn/prop-base/playlist.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop/players/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/players/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/players/.svn/text-base/amarok.py.svn-base b/pcremote-server-desktop/players/.svn/text-base/amarok.py.svn-base new file mode 100755 index 0000000..5e235b3 --- /dev/null +++ b/pcremote-server-desktop/players/.svn/text-base/amarok.py.svn-base @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + +# starts the amarok player application +def start(): + os.popen('amarok') + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def audio_file_properties(self, index=None): + audiofile = (self.playlist.song_filename(index),\ + self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + def play(self): + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + def play_track(self, index): + self.amarok.playlist.playByIndex(index-1) + self.playlist.update(index, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # random play songs + def play_random(self): + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index+1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop/players/.svn/text-base/playlist.py.svn-base b/pcremote-server-desktop/players/.svn/text-base/playlist.py.svn-base new file mode 100755 index 0000000..0cbc97b --- /dev/null +++ b/pcremote-server-desktop/players/.svn/text-base/playlist.py.svn-base @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong - 1]['title'] == 'Unknown Title': + self.songs[self.currentSong - 1]['title'] = title + if self.songs[self.currentSong - 1]['artist'] == 'Unknown Artist': + self.songs[self.currentSong - 1]['artist'] = artist + self.songs[self.currentSong - 1]['path'] = path + self.songs[self.currentSong - 1]['extension'] = ext + print self.songs[self.currentSong - 1] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong - 1]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong - 1]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong - 1]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong-1]['title'] +" - "+\ + self.songs[self.currentSong-1]['artist'] + \ + self.songs[self.currentSong-1]['extension'] + + else: + return self.songs[index-1]['title'] +" - "+\ + self.songs[index-1]['artist'] + \ + self.songs[index-1]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong-1]['filesize']) + else: + return int(self.songs[index-1]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong-1]['track'] + if title: + props['title'] = self.songs[self.currentSong-1]['title'] + if artist: + props['artist'] = self.songs[self.currentSong-1]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong-1]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong-1]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong-1]['duration'] + if path: + props['path'] = self.songs[self.currentSong-1]['path'] + + return props + else: + if track: + props['track'] = self.songs[index-1]['track'] + if title: + props['title'] = self.songs[index-1]['title'] + if artist: + props['artist'] = self.songs[index-1]['artist'] + if ext: + props['ext'] = self.songs[index-1]['extension'] + if filesize: + props['filesize'] = self.songs[index-1]['filesize'] + if duration: + props['duration'] = self.songs[index-1]['duration'] + if path: + props['path'] = self.songs[index-1]['path'] + + return props + diff --git a/pcremote-server-desktop/players/__init__.py b/pcremote-server-desktop/players/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/players/__init__.pyc b/pcremote-server-desktop/players/__init__.pyc new file mode 100644 index 0000000..c6f2429 Binary files /dev/null and b/pcremote-server-desktop/players/__init__.pyc differ diff --git a/pcremote-server-desktop/players/amarok.py b/pcremote-server-desktop/players/amarok.py new file mode 100755 index 0000000..2d54fb0 --- /dev/null +++ b/pcremote-server-desktop/players/amarok.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Packge : players +# Description : Amarok Player +# ============================================================================ + +import os +import commands +import random +from playlist import Playlist +import pydcop + +# command line +def shell(command): + return commands.getoutput(command) + + +# starts the amarok player application +def start(): + os.popen('amarok') + + +# close the amarok player application +def shutdown(): + shell('dcop amarok player stop') + pid = shell('pidof amarokapp') + shell('kill -9 %s' % pid) + + +# verifies if the amarok is running +def isRunning(): + pid = shell('pidof amarokapp') + if pid > 0: + return True + else: + return False + +def send_file(addr, path): + shell("bluetooth-sendto --dest=%s %s" + (addr, path)) + +class AmarokPlayer(): + + """ Amarok + Define all states and functions of amarok player. + This class will build to support PCRemote Player, + receiving messages from any devices with a bluetooth + connection. + """ + + # some importants variables + def __init__(self): + self.amarok = pydcop.anyAppCalled("amarok") + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # refresh playlist, accessing the Playlist class instance + def refresh_playlist(self): + self.playlist = Playlist(self.amarok.playlist.saveCurrentPlaylist()) + self.isPlaying() + + # get all songs of playlist + def song_list(self): + self.playlist.show() + + # show current song, acessing the Playlist class instance + def current_song(self): + self.isPlaying() + + # verifies if this amarok app is running + def isRunning(self): + aux = pydcop.anyAppCalled("amarok") + if aux: + return aux + else: + return None + + # verifies if this amarok app is playing and update the + # Playlist with current song + def isPlaying(self): + if not self.amarok.player.isPlaying() == 'true': + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + return True + else: + return False + + # get the players name + def getName(self): + return "Amarok" + + # send audio files to the N810 device + def file_properties(self, index=None): + track = self.amarok.playlist.getActiveIndex() + audiofile = self.playlist.song_properties(index=track, path=True) + #audiofile = (self.playlist.song_filename(index),\ + # self.playlist.song_size(index)) + return audiofile + + # next button and sets current song + def next(self): + self.amarok.player.next() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # prev button and sets current song + def prev(self): + self.amarok.player.prev() + self.playlist.update(self.amarok.playlist.getActiveIndex(),\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button and sets current song + #def play(self): + #self.amarok.player.play() + #self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(), \ + # ) + + # play button and sets current song + # receive track or random form + # the argument track has intended to manipulate + # the playlist form when the user indicate a song track + # in client application + def play(self, track=-1, rdm=False): + if rdm: + index = random.randint(0, self.playlist.length() - 1) + self.amarok.playlist.playByIndex(index) + self.playlist.update(index + 1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + elif track != -1: + self.amarok.playlist.playByIndex(track) + self.playlist.update(track-1, \ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(),\ + ) + else: + self.amarok.player.play() + self.playlist.update(self.amarok.playlist.getActiveIndex() + 1,\ + self.amarok.player.title(), \ + self.amarok.player.artist(), \ + self.amarok.player.path(), \ + "." + self.amarok.player.type(), \ + ) + + # play button with index song and sets current song + #def play_track(self, index): + # self.amarok.playlist.playByIndex(index-1) + # self.playlist.update(index, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # random play songs + #def play_random(self): + # index = random.randint(0, self.playlist.length() - 1) + # self.amarok.playlist.playByIndex(index) + # self.playlist.update(index+1, \ + # self.amarok.player.title(), \ + # self.amarok.player.artist(), \ + # self.amarok.player.path(), \ + # "." + self.amarok.player.type(),\ + # ) + + # pause button + def pause(self): + self.amarok.player.pause() + + # mute button + def mute(self): + self.amarok.player.mute() + + # stop button + def stop(self): + self.amarok.player.stop() + + # get the current volume value + def get_volume(self): + return self.amarok.player.getVolume() + + # set up volume + def volume_up(self, increase=1): + if (self.get_volume() + increase) <= 100: + up = self.get_volume() + increase + self.amarok.player.setVolume(up) + else: + print "erro!" + + # set down volume + def volume_down(self, decrement=1): + if (self.get_volume() - decrement) >= 0: + down = self.get_volume() - decrement + self.amarok.player.setVolume(down) + else: + print "erro!" + + # set seek value + def seek(self, value): + self.amarok.player.seek(value) diff --git a/pcremote-server-desktop/players/amarok.pyc b/pcremote-server-desktop/players/amarok.pyc new file mode 100755 index 0000000..e922219 Binary files /dev/null and b/pcremote-server-desktop/players/amarok.pyc differ diff --git a/pcremote-server-desktop/players/playlist.py b/pcremote-server-desktop/players/playlist.py new file mode 100755 index 0000000..31a3a61 --- /dev/null +++ b/pcremote-server-desktop/players/playlist.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : players +# Description : Playlist +# ============================================================================ + +import plistparser +import pydcop + +class Playlist(): + + """ Playlist + make the interpreter and manipulation + of the player playlist, creates a composite + with any player class. + """ + + # some importants variables + # analyze if file is a playlist + def __init__(self, file): + if self.isPlaylist(file): + self.file = file + self.songs = self.load() + self.currentSong = 0 + self.fix() + else: + raise("Argument is not a playlist file") + + # analyzes the file + def isPlaylist(self, file): + if not file: + return False + else: + return True + + # make a list of dicts songs + def load(self): + self.songs = plistparser._request(self.file) + return self.songs + + # get the length of the current playlist + def length(self): + return len(self.songs) + + # update the current song in songs list and return a song dict + def update(self, track, title, artist, path, ext): + self.currentSong = track + if self.songs[self.currentSong]['title'] == 'Unknown Title': + self.songs[self.currentSong]['title'] = title + if self.songs[self.currentSong]['artist'] == 'Unknown Artist': + self.songs[self.currentSong]['artist'] = artist + self.songs[self.currentSong]['path'] = path + self.songs[self.currentSong]['extension'] = ext + print self.songs[self.currentSong] + + + # show the current song + def show_playing_now(self): + return ('TITLE: %s' % self.songs[self.currentSong]['title'], \ + 'ARTIST: %s' % self.songs[self.currentSong]['artist'],\ + 'TRACK: %s' % self.songs[self.currentSong]['track'] + ) + + # get the current song filename if index is None + def song_filename(self, index=None): + if index == None: + return self.songs[self.currentSong]['title'] +" - "+\ + self.songs[self.currentSong]['artist'] + \ + self.songs[self.currentSong]['extension'] + + else: + return self.songs[index]['title'] +" - "+\ + self.songs[index]['artist'] + \ + self.songs[index]['extension'] + + # get thr current song filesize if index is None + def song_size(self, index=None): + if index == None: + return int(self.songs[self.currentSong]['filesize']) + else: + return int(self.songs[index]['filesize']) + + # show all songs of the playlist + def show(self): + for i in range(self.length()): + print self.songs[i]['track'], " - ", \ + self.songs[i]['title'], " | ", \ + self.songs[i]['artist'], \ + "\n" + + # fix some problems of musics tags + def fix(self): + for i in range(self.length()): + if self.songs[i]['title'] == None: + self.songs[i]['title'] = 'Unknown Title' + elif self.songs[i]['artist'] == None: + self.songs[i]['artist'] = 'Unknown Artist' + + + # get the porperties of any song of ther playlist + def song_properties(self, index=None, track=False, title=False,\ + artist=False, ext=False, filesize=False, \ + duration=False, path=False): + props = {} + if index == None: + if track: + props['track'] = self.songs[self.currentSong]['track'] + if title: + props['title'] = self.songs[self.currentSong]['title'] + if artist: + props['artist'] = self.songs[self.currentSong]['artist'] + if ext: + props['ext'] = self.songs[self.currentSong]['extension'] + if filesize: + props['filesize'] = self.songs[self.currentSong]['filesize'] + if duration: + props['duration'] = self.songs[self.currentSong]['duration'] + if path: + props['path'] = self.songs[self.currentSong]['path'] + + return props + else: + if track: + props['track'] = self.songs[index]['track'] + if title: + props['title'] = self.songs[index]['title'] + if artist: + props['artist'] = self.songs[index]['artist'] + if ext: + props['ext'] = self.songs[index]['extension'] + if filesize: + props['filesize'] = self.songs[index]['filesize'] + if duration: + props['duration'] = self.songs[index]['duration'] + if path: + props['path'] = self.songs[index]['path'] + + return props + diff --git a/pcremote-server-desktop/players/playlist.pyc b/pcremote-server-desktop/players/playlist.pyc new file mode 100755 index 0000000..0e7524b Binary files /dev/null and b/pcremote-server-desktop/players/playlist.pyc differ diff --git a/pcremote-server-desktop/players/plistparser.py b/pcremote-server-desktop/players/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop/players/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop/players/plistparser.pyc b/pcremote-server-desktop/players/plistparser.pyc new file mode 100755 index 0000000..145dc38 Binary files /dev/null and b/pcremote-server-desktop/players/plistparser.pyc differ diff --git a/pcremote-server-desktop/players/run-amarok.py b/pcremote-server-desktop/players/run-amarok.py new file mode 100755 index 0000000..2d8e9bf --- /dev/null +++ b/pcremote-server-desktop/players/run-amarok.py @@ -0,0 +1,43 @@ +import amarok + +if not amarok.isRunning(): + player = amarok.AmarokPlayer() +else: + print "entrou aqui" + amarok.start() + player = amarok.AmarokPlayer() + +while(1): + data = raw_input(">>> ") + if data == '#exit' or data == '#quit' or data == '#close': + print "Application closed." + amarok.shutdown() + break + elif data == 'next': + player.next() + elif data == 'prev': + player.prev() + elif data == 'play': + player.play() + elif data == 'pause': + player.pause() + elif data == 'stop': + player.stop() + elif data == 'mute': + player.mute() + elif data == 'volume-up': + player.volume_up() + elif data == 'volume-down': + player.volume_down() + elif data == 'current_song': + print player.current_song() + elif data == 'random': + player.play_random() + elif data == 'play-track': + index = input('track: ') + player.play_track(index) + elif data == 'refresh': + player.refresh_playlist() + elif data == 'show': + player.song_list() + diff --git a/pcremote-server-desktop/runserver.py b/pcremote-server-desktop/runserver.py new file mode 100644 index 0000000..b91efd2 --- /dev/null +++ b/pcremote-server-desktop/runserver.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson ; Jonatas Izvi; Andre Portela +# Email : fergus.mao@gmail.com ; nona@gmail.com ; +# andre_portela_@hotmail.com; +# Version : 1.0 +# Class : Server File - This is the main script of the server +# ============================================================================ + +from connection.iconnection import * +from services.service import * +from utils import * +from utils.messages import * + +class Server(): + + def __init__(self, AppName): + self.msgbox = Message(AppName) + self.msgbox.show_message("Server Initialized...") + + def start(self, servername): + + label = Labels() + iconn = Iconnection('blue') + iconn.bluetooth_create_server('l2cap', 0x1001) + + address = iconn.get_client_address() + + self.msgbox.show_message("Accepted connection from " + address[0]) + + while (1): + + data = iconn.received_message() + + if data == 'Tablet:#start': + + self.msgbox.show_message('Service Tablet initialized...') + + service = Service() + service.set_service('Tablet') + + while(1): + data = iconn.received_message() + if data == 'Tablet:#stop': + service.clean_all() + self.msgbox.show_message('Service Tablet stoped') + break + service.execute(data) + + elif data == 'Slideshow:#start': + + self.msgbox.show_message('Service Slideshow initialized...') + + service = Service() + service.set_service('Slideshow') + + while(1): + data = iconn.received_message() + if data == 'Slideshow:#stop': + service.clean_all() + self.msgbox.show_message('Service Slideshow stoped') + break + print data, "\n" + service.execute(data) + + elif data == 'Player:#start': + + self.msgbox.show_message('Service Player initialized...') + + service = Service() + service.set_service('Player') + + while(1): + data = iconn.received_message() + if data == 'Player:#stop': + self.msgbox.show_message('Service Player stoped') + break + elif data == 'Player:#download': + service.set_address_to_download(address[0]) + elif data == 'Player:#load_playlist': + # e preciso criar um metodo de transferencia + # no caso de carregar uma playlist para o cliente + service.execute_transfer(data) + + service.execute(data) + + else: + iconn.close() + self.msgbox.show_message('Desconected from ' + address[0]) + break diff --git a/pcremote-server-desktop/runserver.pyc b/pcremote-server-desktop/runserver.pyc new file mode 100644 index 0000000..7033e84 Binary files /dev/null and b/pcremote-server-desktop/runserver.pyc differ diff --git a/pcremote-server-desktop/services/.svn/entries b/pcremote-server-desktop/services/.svn/entries new file mode 100755 index 0000000..11b2d8a --- /dev/null +++ b/pcremote-server-desktop/services/.svn/entries @@ -0,0 +1,80 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/services +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T21:43:13.543262Z +39 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +ObjectServers.py +file + + + + +2008-11-24T21:42:50.000000Z +61fef10722e4d9d7faac93a03ac1ceb1 +2008-11-24T21:43:13.543262Z +39 +aportela +has-props + +service.py +file + + + + +2008-11-24T21:41:33.000000Z +10874c65035a891cb60e1ccb8b2bdb4f +2008-11-24T21:41:51.237514Z +37 +aportela +has-props + +ServerHandlers.py +file + + + + +2008-11-24T21:42:13.000000Z +5c25986a6c09a7313d8f5f51b509a5e6 +2008-11-24T21:42:30.576563Z +38 +aportela +has-props + diff --git a/pcremote-server-desktop/services/.svn/format b/pcremote-server-desktop/services/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/services/.svn/prop-base/ObjectServers.py.svn-base b/pcremote-server-desktop/services/.svn/prop-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/prop-base/ObjectServers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/services/.svn/prop-base/ServerHandlers.py.svn-base b/pcremote-server-desktop/services/.svn/prop-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/prop-base/ServerHandlers.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/services/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/services/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/services/.svn/prop-base/service.py.svn-base b/pcremote-server-desktop/services/.svn/prop-base/service.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/prop-base/service.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/services/.svn/text-base/ObjectServers.py.svn-base b/pcremote-server-desktop/services/.svn/text-base/ObjectServers.py.svn-base new file mode 100755 index 0000000..33e5a17 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/text-base/ObjectServers.py.svn-base @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self): + + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + self.mouse.position(i, j) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up_mouse(self): + self.mouse.clean_up_mouse() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self.keys = [] + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(command == 'ISO_Level3_Shift'): + self.keyboard.reproduce_key_press('Escape') + self.keyboard.reproduce_key_release('Escape') + pass + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + self.keys.append(command) + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + else: + + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + self.keys.remove('Control_R') + self.control_flag = False + + # clean all keys pressed + def clean_up_keyboard(self): + print "\nkeys -> ", self.keys + list = self.keys + print "\nlist ->", list + for i in list: + self.keyboard.reproduce_key_release(i) + self.keys.remove(i) + print "\nkey --> ", i, " removed." + + print self.keys diff --git a/pcremote-server-desktop/services/.svn/text-base/ServerHandlers.py.svn-base b/pcremote-server-desktop/services/.svn/text-base/ServerHandlers.py.svn-base new file mode 100755 index 0000000..352d1e7 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/text-base/ServerHandlers.py.svn-base @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up_mouse(self): + list = self.buttons + print list + for i in list: + if i == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nleft_button -> release." + elif i == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove(i) + print "\nmiddle_button -> release." + elif i == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove(i) + print "\nright_button -> release." + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + diff --git a/pcremote-server-desktop/services/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/services/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/services/.svn/text-base/service.py.svn-base b/pcremote-server-desktop/services/.svn/text-base/service.py.svn-base new file mode 100755 index 0000000..b0143a0 --- /dev/null +++ b/pcremote-server-desktop/services/.svn/text-base/service.py.svn-base @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.service = "" + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server() + self.keyboard_srv = KeyBoard_Server() + elif self.service == 'Player': + print "player service." + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up_mouse() + self.keyboard_srv.clean_up_keyboard() diff --git a/pcremote-server-desktop/services/ObjectServers.py b/pcremote-server-desktop/services/ObjectServers.py new file mode 100755 index 0000000..dfbe76c --- /dev/null +++ b/pcremote-server-desktop/services/ObjectServers.py @@ -0,0 +1,294 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi, Andre Portela +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com, +# andre_portela_@hotmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : services +# Description : Mouse Server, Keyboard Server +# ============================================================================ + +import time +from utils.labels import * +from ServerHandlers import * +from players import amarok + +class Mouse_Server: + + """ Mouse Server + Defines all mouse behaviors. + Clicks and coordinates. + """ + + #Initialize the class + def __init__(self, service): + self._service_name = service + self.mouse = Mouse() + self.labels = Labels() + self.timer = time + self.timerclick = 0 + + self.fg_dbclick = False + self.fg_move = True + self.x = 0 + self.y = 0 + + #Executes the action requested by the Service Manager + def execute(self, command): + + self.mouse_counter_lclick() + + if (command == self.labels.CLICK): + self.mouse_click() + elif (command == self.labels.DOUBLE_CLICK): + self.mouse_press_dbclick() + elif (command == self.labels.TRIPLE_CLICK): + self.mouse_release_dbclick() + elif (command == self.labels.LEFT_CLICK): + self.mouse_lclick() + elif (command == self.labels.MIDDLE_CLICK): + self.mouse_mclick() + elif (command == self.labels.RIGHT_CLICK): + self.mouse_rclick() + elif (command[0] == "#"): + self.mouse_fator(command) + else: + self.mouse_move(command) + + #Gets the time the mouse pointer is pressed. If It is greater than (or equal to) 2s, The Mouse Left Click is activated. + def mouse_counter_lclick(self): + + if ((not self.fg_move) and ((int(self.timer.time()) - self.timerclick) >= 2)): + self.mouse.right_click(True) + self.mouse.right_click(False) + self.timerclick = 0 + self.fg_move = True + + #Mouse Pointer - Single Click + def mouse_click(self): + self.timerclick = int(self.timer.time()) + self.fg_move = False + + #Mouse Pointer - Double Click + def mouse_press_dbclick(self): + self.mouse.left_click(True) + self.fg_dbclick = True + + #Mouse Pointer - Released after a Double Click + def mouse_release_dbclick(self): + if self.fg_dbclick: + self.mouse.left_click(False) + self.fg_dbclick = False + + #Mouse Left Click + def mouse_lclick(self): + self.mouse.left_click() + + #Mouse Middle Click + def mouse_mclick(self): + self.mouse.middle_click() + + #Mouse Right Click + def mouse_rclick(self): + self.mouse.right_click() + + #Sets the factor of the Mouse Pointer Move + def mouse_fator(self, command): + num = "" + for i in range(1, len(command)): + num = num + command(i) + + self.mouse.set_fator(int(num)) + + #Moves the Mouse Pointer + def mouse_move(self, command): + coord = command.split(",") + + i = int(coord[0]) - self.x + if ((abs(i) == 1) or (abs(i) >= 20)): + i = 0 + + j = int(coord[1]) - self.y + if ((abs(j) == 1) or (abs(j) >= 20)): + j = 0 + + if not ((i == 0) and (j == 0)): + if ((i >= 4) or (j >= 4)): + self.fg_move = True + if self._service_name == "Tablet": + self.mouse.position(i, j) + else: + self.mouse.position(-j, i) + + self.x = int(coord[0]) + self.y = int(coord[1]) + + def clean_up(self): + self.mouse.clean_up() + +class KeyBoard_Server: + + """ Keyboard Server + Defines all keyboard behaviors. + Map keys and events. + """ + + def __init__(self, service): + self.keyboard = Keyboard() + self.shift_flag = False + self.control_flag = False + self.alt_flag = False + self._service_name = service + + # execute key command + def execute(self, command): + + print "\n", command + + if(command == 'F8'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('z') + self.keyboard.reproduce_key_release('z') + self.keyboard.reproduce_key_release('Control_L') + elif(self._service_name == 'Slideshow' and command == 'F6'): + self.keyboard.reproduce_key_press('F5') + self.keyboard.reproduce_key_release('F5') + elif(command == 'Control_R'): + self.control_flag = True + self.keyboard.reproduce_key_press('Control_R') + #self.keys.append(command) + elif(command == 'Shift_L'): + self.shift_flag = True + self.keyboard.reproduce_key_press('Shift_L') + #self.keys.append(command) + elif(command == 'Alt_L'): + self.alt_flag = True + self.keyboard.reproduce_key_press('Alt_L') + elif(command == 'F7'): + self.keyboard.reproduce_key_press('Control_L') + self.keyboard.reproduce_key_press('y') + self.keyboard.reproduce_key_release('y') + self.keyboard.reproduce_key_release('Control_L') + elif(command == 'Alt+F1'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F1') + self.keyboard.reproduce_key_release('F1') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F2'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F2') + self.keyboard.reproduce_key_release('F2') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F4'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F4') + self.keyboard.reproduce_key_release('F4') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F9'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F9') + self.keyboard.reproduce_key_release('F9') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+F0'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('F10') + self.keyboard.reproduce_key_release('F10') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Alt+Space'): + self.keyboard.reproduce_key_press('Alt_L') + self.keyboard.reproduce_key_press('space') + self.keyboard.reproduce_key_release('space') + self.keyboard.reproduce_key_release('Alt_L') + elif(command == 'Tab'): + self.keyboard.reproduce_key_press('Tab') + self.keyboard.reproduce_key_release('Tab') + else: + self.keyboard.reproduce_key_press(command) + self.keyboard.reproduce_key_release(command) + + if self.shift_flag: + self.keyboard.reproduce_key_release('Shift_L') + #self.keys.remove('Shift_L') + self.shift_flag = False + elif self.control_flag: + self.keyboard.reproduce_key_release('Control_R') + #self.keys.remove('Control_R') + self.control_flag = False + elif self.alt_flag: + self.keyboard.reproduce_key_release('Alt_L') + self.alt_flag = False + + # clean all keys pressed + def clean_up(self): + self.keyboard.clean_up() + +class Player_Server(): + + def __init__(self): + if not amarok.isRunning(): + self.player = amarok.AmarokPlayer() + else: + amarok.start() + self.player = amarok.AmarokPlayer() + self.labels = Labels() + + def execute(self, command): + if len(command) > 2: + if command[1] == self.labels.PLAY: + if command[2] and command[3]: + self.player.play(track=int(command[2]), rmd=bool(command[3])) + elif command[2]: + arg = int(command[2]) + if isinstance(arg, int): + self.player.play(track=arg) + else: + arg = bool(command[2]) + self.player.play(rmd=arg) + else: + pass + else: + if command[1] == self.labels.STOP: + self.player.stop() + elif command[1] == self.labels.PLAY: + self.player.play() + elif command[1] == self.labels.PAUSE: + self.player.pause() + elif command[1] == self.labels.NEXT: + self.player.next() + elif command[1] == self.labels.PREVIOUS: + self.player.prev() + elif command[1] == self.labels.VOL_UP: + self.player.volume_up() + elif command[1] == self.labels.VOL_DOWN: + self.player.volume_down() + elif command[1] == self.labels.SEEK: + self.player.seek(int(command[2])) + elif command[1] == self.labels.DOWNLOAD: + path = self.player.file_properties() + addr = command[2] + amarok.send_file(addr, path) + pass + elif command[1] == self.labels.LOAD_PLAYLIST: + # falta o metodo de trasnferencia + pass + else: + pass diff --git a/pcremote-server-desktop/services/ObjectServers.pyc b/pcremote-server-desktop/services/ObjectServers.pyc new file mode 100644 index 0000000..671920a Binary files /dev/null and b/pcremote-server-desktop/services/ObjectServers.pyc differ diff --git a/pcremote-server-desktop/services/ServerHandlers.py b/pcremote-server-desktop/services/ServerHandlers.py new file mode 100755 index 0000000..4b16012 --- /dev/null +++ b/pcremote-server-desktop/services/ServerHandlers.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva +# Email : fergus.mao@gmail.com +# Reviewer : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Package : service +# Description : Singleton, Mouse and Keyboard +# ============================================================================ + +import Xlib +from Xlib import display, X, XK + +class Singleton_Xlib(): + + """ Singleton + defines a singleton. + """ + def __init__(self): + self.display = display.Display() + self.screen = self.display.screen() + +xlib_srv = Singleton_Xlib() + +class Mouse(object): + + """ Mouse + pass mouse information to Xorg + """ + + #Initialize the class + def __init__(self): + self.disp = xlib_srv.display + self.screen = xlib_srv.screen + self.fator = 10 + self.lbutton = False + self.mbutton = False + self.rbutton = False + self.buttons = [] + + #Set the mouse pointer position + def position(self,x=None,y=None): + + if (x == None): + x = self.fator + + if (y == None): + y = self.fator + + #Get the current mouse pointer position + current_x = self.screen.root.query_pointer()._data["root_x"] + current_y = self.screen.root.query_pointer()._data["root_y"] + + def absolute(ax = None, ay = None): + if (ax == None): + ax = x + if (ay == None): + ay = y + + self.screen.root.warp_pointer(ax, ay) + self.disp.sync() + + def relative(): + rX = current_x + x + rY = current_y + y + absolute(rX,rY) + + relative() + + #Returns the current X position + def get_x(self): + return self.screen.root.query_pointer()._data["root_x"] + + #Returns the current Y position + def get_y(self): + return self.screen.root.query_pointer()._data["root_y"] + + #Defines the factor(px) of the mouse pointer move + def set_fator(self,fator): + self.fator = fator + + #Returns the factor + def get_fator(self): + return self.fator + + #Mouse Left Click + def left_click(self, fg_lbutton = None): + + if (fg_lbutton != None): + self.lbutton = not fg_lbutton + + if not self.lbutton: + self.disp.xtest_fake_input(X.ButtonPress, 1, 0) + self.buttons.append('left_button') + self.lbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.buttons.remove('left_button') + self.lbutton = False + + self.disp.flush() + + #Mouse Middle Click + def middle_click(self): + if not self.mbutton: + self.disp.xtest_fake_input(X.ButtonPress, 2, 0) + self.buttons.append('middle_button') + self.mbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + self.buttons.remove('middle_button') + self.mbutton = False + + self.disp.flush() + + #Mouse Right Click + def right_click(self, fg_rbutton = None): + + if (fg_rbutton != None): + self.rbutton = not fg_rbutton + + if not self.rbutton: + self.disp.xtest_fake_input(X.ButtonPress, 3, 0) + self.buttons.append('right_button') + self.rbutton = True + else: + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + self.buttons.remove('right_button') + self.rbutton = False + + self.disp.flush() + + def clean_up(self): + if self.buttons: + while self.buttons: + button = self.buttons.pop() + if button == 'left_button': + self.disp.xtest_fake_input(X.ButtonRelease, 1, 5) + self.disp.xtest_fake_input(X.ButtonPress, 3, 5) + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + elif button == 'middle_button': + self.disp.xtest_fake_input(X.ButtonRelease, 2, 5) + elif button == 'right_button': + self.disp.xtest_fake_input(X.ButtonRelease, 3, 5) + + print self.buttons + +class Keyboard(): + + """ Keyboard + pass keyboard information to Xorg + """ + + def __init__(self): + self.display = xlib_srv.display + self.screen = xlib_srv.screen + self.keys = [] + + # encode key + def __key_to_code(self,key): + new_key = getattr(XK, "XK_" + key) + code = self.display.keysym_to_keycode(new_key) + return code + + # reproduce key pressed + def reproduce_key_press(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyPress, self.__key_to_code(key)) + self.display.sync() + self.keys.append(key) + + # reproduce key release + def reproduce_key_release(self, key): + Xlib.ext.xtest.fake_input(self.display, Xlib.X.KeyRelease, self.__key_to_code(key)) + self.display.sync() + self.keys.remove(key) + + # clean all pressed keys + def clean_up(self): + if self.keys: + while self.keys: + key = self.keys.pop() + self.reproduce_key_release(key) + diff --git a/pcremote-server-desktop/services/ServerHandlers.pyc b/pcremote-server-desktop/services/ServerHandlers.pyc new file mode 100644 index 0000000..92ce94c Binary files /dev/null and b/pcremote-server-desktop/services/ServerHandlers.pyc differ diff --git a/pcremote-server-desktop/services/__init__.py b/pcremote-server-desktop/services/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/services/__init__.pyc b/pcremote-server-desktop/services/__init__.pyc new file mode 100644 index 0000000..04d7ee8 Binary files /dev/null and b/pcremote-server-desktop/services/__init__.pyc differ diff --git a/pcremote-server-desktop/services/service.py b/pcremote-server-desktop/services/service.py new file mode 100755 index 0000000..778745b --- /dev/null +++ b/pcremote-server-desktop/services/service.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Nilson Silva, Jonatas Isvi +# Email : fergus.mao@gmail.com, jonatas.nona@gmail.com +# Reviewer : Jônatas Isvi +# Email : +# Version : 1.0 +# Package : Main Application +# Description : Service Application +# ============================================================================ + +from ObjectServers import * + +class Service: + + """ Service + supports all services applications + """ + + def __init__(self): + self.mouse_srv = None + self.keyboard_srv = None + self.player = None + self.service = "" + self.addr = None + + #Set the Service requested by the Service Manager + def set_service(self, command): + + self.service = command + + if self.service == 'Tablet': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Slideshow': + self.mouse_srv = Mouse_Server(self.service) + self.keyboard_srv = KeyBoard_Server(self.service) + elif self.service == 'Player': + self.player_srv = Player_Server() + elif self.service == 'Torrent': + print "torrent service." + + #Returns the Service which is being executed + def get_service(self): + return self.service + + #Executes the action requested by the Service Manager + def execute(self, command): + + cmd = command.split(":") + + if cmd[0] == "Mouse": + self.mouse_srv.execute(cmd[1]) + elif cmd[0] == "Keyboard": + self.keyboard_srv.execute(cmd[1]) + elif cmd[0] == "Player": + if self.addr: + cmd += self.addr + self.player_srv.execute(cmd) + else: + self.player_srv.execute(cmd) + + def set_address_to_download(self, addr): + self.addr = addr + + # clean all button and keys pressed + def clean_all(self): + self.mouse_srv.clean_up() + self.keyboard_srv.clean_up() + +#teste unitario +if __name__ == '__main__': + import utils.plistparser diff --git a/pcremote-server-desktop/services/service.pyc b/pcremote-server-desktop/services/service.pyc new file mode 100644 index 0000000..d844079 Binary files /dev/null and b/pcremote-server-desktop/services/service.pyc differ diff --git a/pcremote-server-desktop/utils/.messages.py.swp b/pcremote-server-desktop/utils/.messages.py.swp new file mode 100755 index 0000000..534af08 Binary files /dev/null and b/pcremote-server-desktop/utils/.messages.py.swp differ diff --git a/pcremote-server-desktop/utils/.svn/entries b/pcremote-server-desktop/utils/.svn/entries new file mode 100755 index 0000000..32b05b2 --- /dev/null +++ b/pcremote-server-desktop/utils/.svn/entries @@ -0,0 +1,67 @@ +8 + +dir +42 +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn/remote_server/trunk/remote_server/src/utils +svn+ssh://aportela@10.0.50.3/home/aportela/remote_control_svn + + + +2008-11-24T22:06:21.176771Z +40 +aportela + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +fe65f2a5-7a5f-4c8d-90e7-f011580d4f26 + +plistparser.py +file + + + + +2008-11-24T21:52:13.000000Z +606a6ee70138fd606222cd4c3162cc3f +2008-11-24T22:06:21.176771Z +40 +aportela +has-props + +__init__.py +file + + + + +2008-10-31T23:33:24.000000Z +d41d8cd98f00b204e9800998ecf8427e +2008-10-31T22:34:59.880000Z +4 +aportela +has-props + +labels.py +file + + + + +2008-11-03T19:55:46.000000Z +6c9741bd79bbd0f1ac82d2d98614032d +2008-11-03T20:22:42.774109Z +5 +aportela +has-props + diff --git a/pcremote-server-desktop/utils/.svn/format b/pcremote-server-desktop/utils/.svn/format new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/pcremote-server-desktop/utils/.svn/format @@ -0,0 +1 @@ +8 diff --git a/pcremote-server-desktop/utils/.svn/prop-base/__init__.py.svn-base b/pcremote-server-desktop/utils/.svn/prop-base/__init__.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/utils/.svn/prop-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/utils/.svn/prop-base/labels.py.svn-base b/pcremote-server-desktop/utils/.svn/prop-base/labels.py.svn-base new file mode 100755 index 0000000..138f983 --- /dev/null +++ b/pcremote-server-desktop/utils/.svn/prop-base/labels.py.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 10 +text/plain +END diff --git a/pcremote-server-desktop/utils/.svn/prop-base/plistparser.py.svn-base b/pcremote-server-desktop/utils/.svn/prop-base/plistparser.py.svn-base new file mode 100755 index 0000000..869ac71 --- /dev/null +++ b/pcremote-server-desktop/utils/.svn/prop-base/plistparser.py.svn-base @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git a/pcremote-server-desktop/utils/.svn/text-base/__init__.py.svn-base b/pcremote-server-desktop/utils/.svn/text-base/__init__.py.svn-base new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/utils/.svn/text-base/labels.py.svn-base b/pcremote-server-desktop/utils/.svn/text-base/labels.py.svn-base new file mode 100755 index 0000000..170c45e --- /dev/null +++ b/pcremote-server-desktop/utils/.svn/text-base/labels.py.svn-base @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop/utils/.svn/text-base/plistparser.py.svn-base b/pcremote-server-desktop/utils/.svn/text-base/plistparser.py.svn-base new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop/utils/.svn/text-base/plistparser.py.svn-base @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop/utils/__init__.py b/pcremote-server-desktop/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/pcremote-server-desktop/utils/__init__.pyc b/pcremote-server-desktop/utils/__init__.pyc new file mode 100644 index 0000000..b0d7efb Binary files /dev/null and b/pcremote-server-desktop/utils/__init__.pyc differ diff --git a/pcremote-server-desktop/utils/labels.py b/pcremote-server-desktop/utils/labels.py new file mode 100755 index 0000000..044609c --- /dev/null +++ b/pcremote-server-desktop/utils/labels.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +# ============================================================================ +# Project Name : PC Remote +# Author : Jônatas Isvi +# Email : jonatas.nona@gmail.com +# Version : 1.0 +# Description : Labels +# ============================================================================ + +class Labels(): + + def __init__(self): + pass + + # SERVICES SUPPORTED + TABLET = "Tablet" + SLIDESHOW = "Slideshow" + PLAYER = "Player" + TORRENT = "Torrent" + + # GENERIC LABELS FOR MULTIMEDIA APPLICATIONS + + PLAY = "#play" + STOP = "#stop" + PAUSE = "#pause" + NEXT = "#next" + PREVIOUS = "#previous" + VOL_UP = "#vol_up" + VOL_DOWN = "#vol_down" + TLINE_LEFT = "#tline_left" + TLINE_RIGHT = "#tline_right" + RECORD = "#record" + SEEK = "#seek" + LOAD_PLAYLIST = "#load_playlist" + PLAYLIST = "#playlist" + #------------------------------------------> + + # GENERIC LABELS FOR APPLICATIONS + + START = "#start" + CLOSE = "#close" + FULL_SRC = "#fullscreen" + UPLOAD = "#upload" + DOWNLOAD = "#download" + SAVE = "#save" + DELETE = "#delete" + #--------------------------------> + + # GENERAL MOUSE LABELS + + CLICK = "#click" + DOUBLE_CLICK = "#double_click" + TRIPLE_CLICK = "#triple_click" + LEFT_CLICK = "#left_click" + RIGHT_CLICK = "#right_click" + MIDDLE_CLICK = "#middle_click" + #--------------------------------> + + diff --git a/pcremote-server-desktop/utils/labels.pyc b/pcremote-server-desktop/utils/labels.pyc new file mode 100644 index 0000000..3ea6176 Binary files /dev/null and b/pcremote-server-desktop/utils/labels.pyc differ diff --git a/pcremote-server-desktop/utils/messages.py b/pcremote-server-desktop/utils/messages.py new file mode 100755 index 0000000..b35cd58 --- /dev/null +++ b/pcremote-server-desktop/utils/messages.py @@ -0,0 +1,37 @@ +import pynotify +import Image +import StringIO +import gtk + +class Message(): + def __init__(self, AppName): + pynotify.init(AppName) + self.AppName = AppName + self.msgbox = pynotify.Notification(self.AppName, self.AppName, "PCR_on.bmp") + self.msgbox.set_urgency(pynotify.URGENCY_CRITICAL) + self.msgbox.set_timeout(5000) + + def show_message(self, message): + self.msgbox = pynotify.Notification(self.AppName, message) + self.msgbox.show() + + def set_image(self, img): +# image = Image.open(img) +# image = gtk.gdk.pixbuf_new_from_file(img) +# self.msgbox.set_icon_from_pixbuf(self.image2pixbuf(image)) + pass + + def image2pixbuf(self, img): + file1 = StringIO.StringIO() + + img.save(file1, "ppm") + contents = file1.getvalue() + file1.close() + + loader = gtk.gdk.PixbufLoader("pnm") + loader.write(contents, len(contents)) + + pixbuf = loader.get_pixbuf() + loader.close() + + return pixbuf diff --git a/pcremote-server-desktop/utils/messages.pyc b/pcremote-server-desktop/utils/messages.pyc new file mode 100644 index 0000000..8628278 Binary files /dev/null and b/pcremote-server-desktop/utils/messages.pyc differ diff --git a/pcremote-server-desktop/utils/plistparser.py b/pcremote-server-desktop/utils/plistparser.py new file mode 100755 index 0000000..faaa0ac --- /dev/null +++ b/pcremote-server-desktop/utils/plistparser.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# **************************************************************************** +# Copyright (c) 2008 INdT/Fucapi. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# +# ============================================================================ +# Project Name : PC Remote +# Author : Jonatas Isvi +# Email : jonatas.nona@gmail.com +# Reviewer : +# Email : +# Version : 1.0 +# Package : utils +# Description : plisparser +# ============================================================================ + +from xml.etree import cElementTree as ElementTree + +# get the file +def _request(url): + xml = url + return parse_playlist_file(xml) + +# parser the file +def parse_playlist_file(xml): + tree = ElementTree.parse(xml) + listsongs = [] + dictsongs = {} + count = duration = filesize = 0 + title = artist = path = '' + + for child in tree.getiterator(): + if child.tag == 'Title': + title = child.text + elif child.tag == 'Artist': + artist = child.text + elif child.tag == 'Length': + duration = child.text + elif child.tag == 'Filesize': + filesize = child.text + count = count + 1 + dictsongs = {'track' : count, + 'title' : title, + 'artist' : artist, + 'duration' : duration, + 'filesize' : filesize, + 'path' : None, + 'extension' : None, + } + listsongs.append(dictsongs) + + return listsongs + + + + + + + + diff --git a/pcremote-server-desktop/utils/plistparser.pyc b/pcremote-server-desktop/utils/plistparser.pyc new file mode 100755 index 0000000..1e46983 Binary files /dev/null and b/pcremote-server-desktop/utils/plistparser.pyc differ