16f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato#!/usr/bin/env python2.5
26f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
36f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratoimport cgi
46f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratoimport os
56f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratoimport shutil
66f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratoimport sys
76f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratoimport sqlite3
86f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
96f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoSCREENS = 5
106f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoCOLUMNS = 4
116f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoROWS = 4
12bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson ChungHOTSEAT_SIZE = 5
136f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoCELL_SIZE = 110
146f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
156f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoDIR = "db_files"
166f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoAUTO_FILE = DIR + "/launcher.db"
176f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoINDEX_FILE = DIR + "/index.html"
186f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
196f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef usage():
206f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print "usage: print_db.py launcher.db -- prints a launcher.db"
216f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print "usage: print_db.py -- adb pulls a launcher.db from a device"
226f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print "       and prints it"
236f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print
246f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print "The dump will be created in a directory called db_files in cwd."
256f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print "This script will delete any db_files directory you have now"
266f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
276f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
286f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef make_dir():
296f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  shutil.rmtree(DIR, True)
306f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  os.makedirs(DIR)
316f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
326f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef pull_file(fn):
336f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print "pull_file: " + fn
346f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  rv = os.system("adb pull"
356f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    + " /data/data/com.android.launcher/databases/launcher.db"
366f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    + " " + fn);
376f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  if rv != 0:
386f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    print "adb pull failed"
396f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    sys.exit(1)
406f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
416f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef get_favorites(conn):
426f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  c = conn.cursor()
436f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  c.execute("SELECT * FROM favorites")
446f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  columns = [d[0] for d in c.description]
456f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  rows = []
466f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  for row in c:
476f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    rows.append(row)
486f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  return columns,rows
496f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
506f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef print_intent(out, id, i, cell):
516f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  if cell:
526f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("""<span class="intent" title="%s">shortcut</span>""" % (
536f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato        cgi.escape(cell, True)
546f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      ))
556f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
566f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
576f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef print_icon(out, id, i, cell):
586f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  if cell:
596f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    icon_fn = "icon_%d.png" % id
606f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("""<img src="%s">""" % ( icon_fn ))
616f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    f = file(DIR + "/" + icon_fn, "w")
626f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    f.write(cell)
636f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    f.close()
646f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
656f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef print_cell(out, id, i, cell):
666f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  if not cell is None:
676f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write(cgi.escape(str(cell)))
686f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
696f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe OnoratoFUNCTIONS = {
706f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  "intent": print_intent,
716f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  "icon": print_icon
726f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato}
736f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
74bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chungdef render_cell_info(out, cell, occupied):
75bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  if cell is None:
76bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    out.write("    <td width=%d height=%d></td>\n" %
77bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung        (CELL_SIZE, CELL_SIZE))
78bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  elif cell == occupied:
79bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    pass
80bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  else:
81bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    cellX = cell["cellX"]
82bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    cellY = cell["cellY"]
83bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    spanX = cell["spanX"]
84bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    spanY = cell["spanY"]
85bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    intent = cell["intent"]
86bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    if intent:
87bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      title = "title=\"%s\"" % cgi.escape(cell["intent"], True)
88bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    else:
89bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      title = ""
90bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    out.write(("    <td colspan=%d rowspan=%d width=%d height=%d"
91bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung        + " bgcolor=#dddddd align=center valign=middle %s>") % (
92bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung          spanX, spanY,
93bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung          (CELL_SIZE*spanX), (CELL_SIZE*spanY),
94bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung          title))
95bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    itemType = cell["itemType"]
96bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    if itemType == 0:
97bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("""<img src="icon_%d.png">\n""" % ( cell["_id"] ))
98bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("<br/>\n")
99bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write(cgi.escape(cell["title"]) + " <br/><i>(app)</i>")
100bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    elif itemType == 1:
101bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("""<img src="icon_%d.png">\n""" % ( cell["_id"] ))
102bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("<br/>\n")
103bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write(cgi.escape(cell["title"]) + " <br/><i>(shortcut)</i>")
104bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    elif itemType == 2:
105bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("""<i>folder</i>""")
106bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    elif itemType == 3:
107bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("""<i>live folder</i>""")
108bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    elif itemType == 4:
109bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("<i>widget %d</i><br/>\n" % cell["appWidgetId"])
110bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    elif itemType == 1000:
111bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("""<i>clock</i>""")
112bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    elif itemType == 1001:
113bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("""<i>search</i>""")
114bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    elif itemType == 1002:
115bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("""<i>photo frame</i>""")
116bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    else:
117bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      out.write("<b>unknown type: %d</b>" % itemType)
118bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    out.write("</td>\n")
119bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung
1206f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef process_file(fn):
1216f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print "process_file: " + fn
1226f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  conn = sqlite3.connect(fn)
1236f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  columns,rows = get_favorites(conn)
1246f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  data = [dict(zip(columns,row)) for row in rows]
1256f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
1266f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out = file(INDEX_FILE, "w")
1276f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out.write("""<html>
1286f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato<head>
1296f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato<style type="text/css">
1306f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato.intent {
1316f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  font-style: italic;
1326f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato}
1336f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato</style>
1346f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato</head>
1356f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato<body>
1366f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
1376f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
1386f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  # Data table
1396f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out.write("<b>Favorites table</b><br/>\n")
1406f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out.write("""<html>
1416f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato<table border=1 cellspacing=0 cellpadding=4>
1426f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato<tr>
1436f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
1446f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  print_functions = []
1456f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  for col in columns:
1466f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    print_functions.append(FUNCTIONS.get(col, print_cell))
1476f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  for i in range(0,len(columns)):
1486f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    col = columns[i]
1496f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("""  <th>%s</th>
1506f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""" % ( col ))
1516f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out.write("""
1526f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato</tr>
1536f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
1546f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  for row in rows:
1556f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("""<tr>
1566f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
1576f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    for i in range(0,len(row)):
1586f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      cell = row[i]
1596f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      # row[0] is always _id
1606f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      out.write("""  <td>""")
1616f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      print_functions[i](out, row[0], row, cell)
1626f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      out.write("""</td>
1636f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
1646f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("""</tr>
1656f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
1666f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out.write("""</table>
1676f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
1686f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
169bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  # Hotseat
170bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  hotseat = []
171bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  for i in range(0, HOTSEAT_SIZE):
172bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    hotseat.append(None)
173bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  for row in data:
174bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    if row["container"] != -101:
175bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung      continue
176bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    screen = row["screen"]
177bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    hotseat[screen] = row
178bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  out.write("<br/><b>Hotseat</b><br/>\n")
179bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  out.write("<table class=layout border=1 cellspacing=0 cellpadding=4>\n")
180bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  for cell in hotseat:
181bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung    render_cell_info(out, cell, None)
182bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung  out.write("</table>\n")
183bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung
1846f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  # Pages
1856f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  screens = []
1866f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  for i in range(0,SCREENS):
1876f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    screen = []
1886f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    for j in range(0,ROWS):
1896f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      m = []
1906f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      for k in range(0,COLUMNS):
1916f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato        m.append(None)
1926f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      screen.append(m)
1936f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    screens.append(screen)
1946f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  occupied = "occupied"
1956f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  for row in data:
1966f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    screen = screens[row["screen"]]
1976f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    # desktop
1986f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    if row["container"] != -100:
1996f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      continue
2006f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    cellX = row["cellX"]
2016f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    cellY = row["cellY"]
2026f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    spanX = row["spanX"]
2036f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    spanY = row["spanY"]
2046f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    for j in range(cellY, cellY+spanY):
2056f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      for k in range(cellX, cellX+spanX):
2066f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato        screen[j][k] = occupied
2076f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    screen[cellY][cellX] = row
2086f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  i=0
2096f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  for screen in screens:
2106f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("<br/><b>Screen %d</b><br/>\n" % i)
2116f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("<table class=layout border=1 cellspacing=0 cellpadding=4>\n")
2126f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    for m in screen:
2136f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      out.write("  <tr>\n")
2146f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      for cell in m:
215bfc003a953a3ce509fe0851fa589c31fbc2ba57eWinson Chung        render_cell_info(out, cell, occupied)
2166f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato      out.write("</tr>\n")
2176f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    out.write("</table>\n")
2186f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    i=i+1
2196f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
2206f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out.write("""
2216f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato</body>
2226f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato</html>
2236f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato""")
2246f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
2256f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  out.close()
2266f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
2276f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratodef main(argv):
2286f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  if len(argv) == 1:
2296f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    make_dir()
2306f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    pull_file(AUTO_FILE)
2316f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    process_file(AUTO_FILE)
2326f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  elif len(argv) == 2:
2336f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    make_dir()
2346f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    process_file(argv[1])
2356f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  else:
2366f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato    usage()
2376f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato
2386f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onoratoif __name__=="__main__":
2396f9d4bd7c401896814d499d7a5280f91c7ed9d3cJoe Onorato  main(sys.argv)
240