#!/usr/bin/python

import os
import xml.etree.ElementTree as ET

def create_device_info_file(filename, link_key):
  with open(filename, 'w') as f:
    f.write('\n')
    f.write('[LinkKey]\n')
    f.write('Key=%s\n' % link_key)
    f.write('Type=0\n')
    f.write('PINLength=4\n')
    f.write('\n')
    f.write('[General]\n')
    f.write('Name=GFRM100\n')
    f.write('SupportedTechnologies=BR/EDR;\n')
    f.write('Trusted=true\n')
    f.write('Blocked=false\n')
    f.write('Services=00001000-0000-1000-8000-00805f9b34fb;00001124-0000-1000-8000-00805f9b34fb;00001200-0000-1000-8000-00805f9b34fb;\n')
    f.write('Class=0x00050c\n')
    f.write('\n')
    f.write('[DeviceID]\n')
    f.write('Source=1\n')
    f.write('Vendor=88\n')
    f.write('Product=8192\n')
    f.write('Version=283\n')

def create_device_cache_file(filename):
  with open(filename, 'w') as f:
    f.write('\n')
    f.write('[General]\n')
    f.write('Name=GFRM100\n')
    f.write('\n')
    f.write('[ServiceRecords]\n')
    f.write('0x00000000=35920900000A000000000900013503191000090004350D350619010009000135031900010900053503191002090006350909656E09006A09010009000935083506190100090100090100252D42726F6164636F6D20426C7565746F6F746820576972656C6573732052656D6F74652053445020536572766572090101250E52656D6F746520436F6E74726F6C0902003503090100\n')
    f.write('0x00010000=3601B60900000A000100000900013503191124090004350D350619010009001135031900110900053503191002090006350909656E09006A0901000900093508350619112409010009000D350F350D350619010009001335031900110901002517476F6F676C6554562052656D6F746520436F6E74726F6C09010125214D756C74692D66756E6374696F6E2072656D6F74652077697468206B65797061640901022506476F6F676C6509020009017109020109011109020208400902030821090204280109020528010902063600BB3600B808222600B305010906A10185417508950126FF00050719002AFF008100C0050C0901A101854019002AFF0375109501150026FF038100C005010980A10185121981299315812593750895018140C0050C0901A1018513092015002564750895018142C08521092175089501150026FF008102852205010922A102093B950175101500264F01810206F0FF09227510964F01150026FF00820102C085F2090275089501150026FF00910285F3090375089510150026FF0081020902073508350609040909010009020B09010009020C090C8009020D280009020E280109020F090318090210090000\n')
    f.write('0x00010001=35520900000A000100010900013503191200090004350D350619010009000135031900010900093508350619120009010009020009010009020109005809020209200009020309011B0902042801090205090001\n')

def main():
  BT_MAC_FILE='/tmp/btmacaddress'
  BSA_DEVICES_FILE='/user/bsa/bt_devices.xml'
  BLUEZ_STORAGE_DIR='/user/bluez/lib/bluetooth'

  if not os.path.exists(BT_MAC_FILE):
    print 'error: %s does not exist' % BT_MAC_FILE
    return

  with open(BT_MAC_FILE, 'r') as f:
    bt_mac = f.read().upper().rstrip('\n')

  if len(bt_mac) != 17:
    print 'error: bt_mac %s is invalid' % bt_mac
    return

  if not os.path.exists(BSA_DEVICES_FILE):
    print 'error: %s does not exist' % BSA_DEVICES_FILE
    return

  try:
    bsa_devices = ET.parse(BSA_DEVICES_FILE)
  except:
    print 'error: %s cannot be parsed' % BSA_DEVICES_FILE
    with open(BSA_DEVICES_FILE, 'r') as f:
      buffer = f.read()
    print buffer[0:4096]
    return

  adapter_dir = BLUEZ_STORAGE_DIR + '/' + bt_mac
  if not os.path.isdir(adapter_dir):
    print 'create: BlueZ adapter dir %s' % adapter_dir
    os.makedirs(adapter_dir)

  device_cache_dir = adapter_dir + '/cache'
  if not os.path.isdir(device_cache_dir):
    print 'create: BlueZ device cache dir %s' % device_cache_dir
    os.makedirs(device_cache_dir)

  for parent in bsa_devices.getiterator():
    if parent.tag != 'device':
      continue

    bd_addr = ''
    link_key = ''

    for child in parent:
      if child.tag == 'bd_addr':
        bd_addr = child.text
      elif child.tag == 'link_key':
        link_key = child.text

    bd_addr = bd_addr.upper()
    if len(bd_addr) != 17:
      print 'BSA device: GFRM100 has invalid bd_addr %s' % bd_addr
      continue

    link_key = link_key.upper().replace(':', '')
    if len(link_key) != 32:
      print 'BSA device: GFRM100 has invalid link_key %s' % link_key
      continue

    print 'BSA device: GFRM100 at bd_addr %s link_key %s' % (bd_addr, link_key)

    device_dir = adapter_dir + '/' + bd_addr
    if not os.path.isdir(device_dir):
      print 'create: BlueZ device dir %s' % device_dir
      os.makedirs(device_dir)
    else:
      print 'exists: BlueZ device dir %s' % device_dir

    device_info_file = device_dir + '/info'
    if not os.path.exists(device_info_file):
      print 'create: BlueZ device info file %s' % device_info_file
      create_device_info_file(device_info_file, link_key)
    else:
      print 'exists: BlueZ device info file %s' % device_info_file

    device_cache_file = device_cache_dir + '/' + bd_addr
    if not os.path.exists(device_cache_file):
      print 'create: BlueZ device cache file %s' % device_cache_file
      create_device_cache_file(device_cache_file)
    else:
      print 'exists: BlueZ device cache file %s' % device_cache_file

if __name__ == '__main__':
  main()
