#!/usr/bin/python

# Original source: from bluez-5.7/test/test-nap

# EcoDroidLink/ykasidit@gmail.com modifications:
# - edited wait to continue NAP forever 
# - changed NetworkServer to NetworkServer1 to make it work for from bluez-5.7/test/test-nap case
# - add compatibility code to run on older bluez (like 4.98 in Ubuntu 12.04 and probably Raspbian) if new bluez 5.7 method doesn't work - try with older test-nap core methods - tested on Ubuntu 12.04

from __future__ import absolute_import, print_function, unicode_literals

import sys
import time
import dbus
from optparse import OptionParser, make_option
import bluezutils
import logging
import logging.handlers
import edl_util
from edl_util import edl_call

logger = logging.getLogger('edl_nap')
logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler(address = '/dev/log')
logger.addHandler(handler)

def printlog(s):
    logger.info(s)
    print(s)

bus = dbus.SystemBus()

option_list = [
		make_option("-i", "--device", action="store",
				type="string", dest="dev_id"),
		]
parser = OptionParser(option_list=option_list)

(options, args) = parser.parse_args()

adapter_path = ""

try: #try new bluez 5.7 code
    adapter_path = bluezutils.find_adapter(options.dev_id).object_path
except: #try older bluez 4.98 compat code
    manager = dbus.Interface(bus.get_object("org.bluez", "/"),
						"org.bluez.Manager")
    if options.dev_id:
        adapter_path = manager.FindAdapter(options.dev_id)
    else:
        adapter_path = manager.DefaultAdapter()

server = dbus.Interface(bus.get_object("org.bluez", adapter_path),
						"org.bluez.NetworkServer1")

service = "nap"

if (len(args) < 1):
	bridge = "tether"
else:
	bridge = args[0]

try: #new bluez 5.7 code
    server.Register(service, bridge)
except: #try older bluez 4.98 compat code
    server = dbus.Interface(bus.get_object("org.bluez", adapter_path),
						"org.bluez.NetworkServer")
    server.Register(service, bridge)

printlog("edl: Bluetooth Network Access Point Server (for %s) registered for bridge %s" % (service, bridge))
edl_call("hciconfig -a hci0 class 0x020300", "edl_nap set class after reg")
edl_call("hciconfig -a hci0 piscan", "edl_init")

try:
	while (1):
		time.sleep(30)
	#run forever - control shold never reach here
	printlog("Terminating connection")
except:
	pass

server.Unregister(service)
