#!/usr/bin/python2.6
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Call on a directory with components_XXX_XXX files, to create
# bitmaps with the appropriate names and contents.

import sys
import glob
import os
import re
import tempfile


if len(sys.argv) < 2:
  print "usage: %s autotest/../hardware_Components/" % sys.argv[0]
  sys.exit(1)


def MakeBmp(hwid, geom, bmp, directory):
  """ Create the bitmap for this file. """
  tmpdir = tempfile.mkdtemp()
  tmpfile = os.path.join(tmpdir, "hwid.txt")
  tmpbmpname = os.path.join(tmpdir, "hwid.bmp")
  f = open(tmpfile, "w")
  f.write(hwid)
  f.close()

  # Call bitmap making tools.
  txt_to_bmp = ("~/trunk/src/platform/vboot_reference/"
                "scripts/newbitmaps/strings/text_to_bmp")
  imagedir = os.path.join(
    "~/trunk/src/platform/vboot_reference/scripts/newbitmaps/images",  geom)
  yamlfile = os.path.join(imagedir, "unknown.yaml")
  newyamlfile = os.path.join(imagedir, "hwid.yaml")
  outputbmp = os.path.join(directory, bmp)

  os.system("%s %s > /dev/null" % (txt_to_bmp, tmpfile))
  os.system("cat %s | sed 's#hwid_unknown.bmp#%s#' > %s" % (
            yamlfile, tmpbmpname, newyamlfile))
  os.system("pushd %s >/dev/null; bmpblk_utility -c %s %s; popd >/dev/null" % (
            imagedir, newyamlfile, outputbmp))
  os.system("rm -rf %s" % tmpdir)

def ProcessDir(directory):
  """ Find all the components file in this dir. """
  # Regex to find the values we want.
  re_bmp = re.compile(r'\'data_bitmap_fv\': \[\'(?P<bmp>.*)\'\],')
  re_hwid = re.compile(r'\'part_id_hwqual\': \[\'(?P<hwid>.*)\'\],')
  re_geom = re.compile(r'\'data_display_geometry\': \[\'(?P<geom>.*)\'\],')
  # Old bitmap style
  re_fv = re.compile(r'.*\.fv')

  # Find the components files.
  files = glob.glob(os.path.join(directory, "data_*/components_*"))
  for file in files:
    # Scan for the values.
    f = open(file, "r")
    bmp = None
    hwid = None
    geom = None
    for line in f.readlines():
      m = re_bmp.search(line)
      if m:
        bmp = m.group('bmp')

      m = re_hwid.search(line)
      if m:
        hwid = m.group('hwid')

      m = re_geom.search(line)
      if m:
        geom = m.group('geom')
    f.close()
    if not ( bmp and hwid and geom):
      print "Corrupt HWID configuration"
      sys.exit(1)
    if re_fv.match(bmp):
      print "HWID: %s, %s, %s (skipping old style bitmap)" % (hwid, geom, bmp)
    else:
      print "HWID: %s, %s, %s" % (hwid, geom, bmp)
      MakeBmp(hwid, geom, bmp, directory)

def main():
  directory = os.path.abspath(sys.argv[1])
  print "Generating HWID bmp based on %s" % directory
  ProcessDir(directory)

if __name__ == '__main__':
  main()
