#! /usr/bin/python
# -*- coding: UTF-8 -*-
#
# © 2005 Josselin Mouette <joss@debian.org>
# Licensed under the GNU LGPL, see /usr/share/common-licenses/LGPL-2.1


defaults_dir = '/usr/share/gconf/defaults'
outfile = '/var/lib/gconf/debian.defaults/%gconf-tree.xml'

import os


def htmlescape(str):
  return str.replace('&','&amp;').replace('>','&gt;').replace('<','&lt;').replace('"','&quot;')

def int_entry(key,value):
  return '<entry name="' + key + '" type="int" value="' + value + '"/>\n'

def bool_entry(key,value):
  return '<entry name="' + key + '" type="bool" value="' + value + '"/>\n'

def float_entry(key,value):
  return '<entry name="' + key + '" type="float" value="' + value + '"/>\n'

def string_entry(key,value):
  ret = '<entry name="' + key + '" type="string">\n'
  ret += '  <stringvalue>' + htmlescape(value) + '</stringvalue>\n'
  ret += '</entry>\n'
  return ret

def list_entry(key,value):
  ret = '<entry name="' + key + '" type="list" ltype="string">\n'
  for v in value[1:-1].split(','):
    ret += '  <li type="string">\n'
    ret += '    <stringvalue>' + htmlescape(v) + '</stringvalue>\n'
    ret += '  </li>\n'
  ret += '</entry>\n'
  return ret


def listcmp(a,b):
  """Number of starting similar elements in a and b"""
  m = min(len(a),len(b))
  for i in range(m):
    if a[i] != b[i]:
      return i
  return m

defaults_files = os.listdir(defaults_dir)
defaults_files.sort()

gconf_val = {}

for f in defaults_files:
  fd=open(defaults_dir+'/'+f)
  for line in fd:
    line = line.rstrip('\n')
    l = line.split(None,1)
    if len(l) == 2:
      gconf_val[l[0]] = l[1]
  fd.close()

# start with
out = open(outfile+'.tmp','w')
out.write('<?xml version="1.0"?>\n<gconf>\n')
prev = []
keylist = gconf_val.keys()
keylist.sort()

for key in keylist:
  # separate the key in directories and key name
  cur = key.split('/')
  if cur[0] == '': del cur[0]
  keyname=cur.pop(-1)

  # go to the correct directory
  common = listcmp(prev,cur)
  out.write( (len(prev)-common)*'</dir>\n' )
  out.writelines( ['<dir name="'+dir+'">\n' for dir in cur[common:]] )
  
  # write the current entry
  value = gconf_val[key]
  if value[0] == '"' and value[-1] == '"':
    out.write(string_entry(keyname,value[1:-1]))
  elif value in ['true','false']:
    out.write(bool_entry(keyname,value))
  elif value[0] == '[' and value[-1] == ']':
    out.write(list_entry(keyname,value))
  elif value.isdigit():
    out.write(int_entry(keyname,value))
  else:
    try:
      float(value)
      out.write(float_entry(keyname,value))
    except ValueError:
      out.write(string_entry(keyname,value))

  prev=cur

# Finalize
out.write(len(prev)*'</dir>\n')
out.write('</gconf>\n')
out.close()
os.chmod(outfile+'.tmp',0644)
os.rename(outfile+'.tmp',outfile)

os.system('kill -s HUP `pidof gconfd-2` >/dev/null 2>&1')
