commit do client
[remotepc] / pcremote-client / connection / bluetoothconnectionmanager.py
diff --git a/pcremote-client/connection/bluetoothconnectionmanager.py b/pcremote-client/connection/bluetoothconnectionmanager.py
new file mode 100755 (executable)
index 0000000..dc23b72
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+
+#  ============================================================================
+#  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()
+