# Copyright (c) 2004 Nokia
# Programming example -- see license agreement for additional rights
# A simple interactive console over Bluetooth.
#
# Modified into a server version by robert@otaku.org. As it says above, this
# is still just an example. So, use at your own risk.


import socket

class socket_stdio:
    def __init__(self,sock):
        self.socket=sock
    def read(self,n=1):
        return self.socket.recv(n)
    def write(self,str):
        return self.socket.send(str.replace('\n','\r\n'))
    def readline(self,n=None):
        buffer=[]
        while 1:
            ch=self.read(1)
            if ch == '\n' or ch == '\r':   # return
                buffer.append('\n')
                self.write('\n')
                break
            if ch == '\177' or ch == '\010': # backspace
                self.write('\010 \010') # erase character from the screen
                del buffer[-1:] # and from the buffer
            else:
                self.write(ch)
                buffer.append(ch)
            if n and len(buffer)>=n:
                break
        return ''.join(buffer)
    def raw_input(self,prompt=""):
        self.write(prompt)
        return self.readline()
    def flush(self):
        pass


# Create a socket. I believe the third parameter is actually the default.
sock = socket.socket(socket.AF_BT, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
# Note that the sock._sock is due to a bug in the API.
port = socket.bt_rfcomm_get_available_server_channel(sock._sock)
sock.bind(("", port))

print "Advertising..."
socket.bt_advertise_service(u"Python Console", sock._sock, True, socket.RFCOMM)
# Possible flags are AUTH (authentication), ENCRYPT, and AUTHOR (authorization)
# All flags may not work on all systems.
socket.set_security(sock._sock, socket.AUTHOR)

print "Listening..."
sock.listen(1)
(conn, address) = sock.accept()

print "Connected."

socketio = socket_stdio(conn)
realio=(sys.stdout,sys.stdin,sys.stderr)
(sys.stdout,sys.stdin,sys.stderr)=(socketio,socketio,socketio)
import code

try:
    try:
        code.interact()
    except socket.error, err:
        print >>realio[0], "Exiting on exception: %s" % (err)
finally:
    (sys.stdout,sys.stdin,sys.stderr)=realio
    sock.close()
    print "Finished."