123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- #
- # inf2mondb.py: convert .inf files for monitors to MonitorDB
- #
- # Matt Wilson <msw@redhat.com>
- #
- # Copyright 2002 Red Hat, Inc.
- #
- # Some fixes by Onur Küçük <onur@pardus.org.tr>
- #
- # This software may be freely redistributed under the terms of the GNU
- # library public license.
- import sys
- import string
- import re
- def usage():
- print("Usage: inf2mondb.py filename.inf")
- sys.exit(1)
- if len(sys.argv) < 2:
- usage()
- try:
- f = open(sys.argv[1], 'r')
- except IOError as xxx_todo_changeme:
- (errno, str) = xxx_todo_changeme.args
- print("Unable to open %s: %s" % (sys.argv[1], str))
- sys.exit(1)
- lines = f.readlines()
- f.close()
- # the current section
- section = None
- # monitors - a dictionary keyed off manufacturers
- monitors = {}
- # a dictionary of manufacturers we're looking at
- manufacturers = {}
- # registry sections mapped back to the install sections
- regsections = {}
- # install sections that map back to monitor definitions
- instsections = {}
- # a big fat dictionary of strings to use later on.
- strings = {}
- class Monitor:
- def __repr__(self):
- return "%s; %s; %s; %s; %s" % (self.man,
- self.descr,
- self.edid,
- self.hsync,
- self.vsync)
-
- def __init__(self, man, id, edid):
- self.descr = ""
- self.man = man
- self.hsync = ""
- self.vsync = ""
- self.id = id
- self.edid = edid
- sectRe = re.compile(r'\[*\]')
- sectSplit = re.compile(r'[\[\]]')
- infoSplit = re.compile(r'[%=\\;]')
- # This RE is for EISA info lines
- # %D5259A%=D5259A, Monitor\HWP0487
- monitor1Re = re.compile(r'%*.%.*=.*,.*Monitor\\')
- # This one is for legacy entries
- # %3020% =PB3020, MonID_PB3020
- monitor2Re = re.compile(r'%*.%.*=.*,.*MonID_')
- # sync values that might be in the strings section
- sync_keys = {}
- for line in lines:
- tmp = string.strip(line)
- if tmp and tmp[0] == ';':
- continue
- if sectRe.search (line, 1):
- section = string.lower(sectSplit.split (line)[1])
- continue
- if section == "manufacturer":
- tmp = infoSplit.split (line)
- if len(tmp) > 1:
- manufacturer = string.lower(tmp[1])
- if tmp[1] in manufacturers:
- raise RuntimeError("Duplicate manufacturer entries")
- else:
- manufacturers[string.lower(string.strip(tmp[3].split(",")[0]))] = string.lower(string.strip(tmp[1]))
- # if we're in a manufacturer section, we need to jot down
- # the devices
- elif section in manufacturers:
- # Find monitor inf IDs and EISA ids:
- monre = None
- # EISA entries
- # %D5259A%=D5259A, Monitor\HWP0487
- if monitor1Re.search(line, 1):
- monre = monitor1Re
- # older non EISA entries
- # %3020% =PB3020, MonID_PB3020
- elif monitor2Re.search(line, 1):
- monre = monitor2Re
- if monre:
- end = monre.search(line, 1).end()
- id = string.strip(string.split(line, '%')[1])
- if monre == monitor1Re:
- # all EDID ID strings are 7 chars
- edid = string.strip(line[end:])[0:7]
- else:
- edid = "0"
- # we need to get the install section for this device
- rhs = string.strip(string.split (line, '=')[1])
- install = string.lower(string.strip(string.split (rhs, ',')[0]))
- if install in instsections:
- instsections[install].append ((section, id))
- else:
- instsections[install] = [ (section, id) ]
- if section not in monitors:
- monitors[section] = {}
- monitors[section][id] = Monitor(section, id, edid)
- elif section == "strings":
- tmp = string.strip(tmp)
- if not tmp:
- continue
- tmp = string.split (line, '=')
- if len (tmp) < 2:
- continue
- key = string.lower(string.strip(tmp[0]))
- tmp = string.split(string.strip(tmp[1]), '"')
- if len (tmp) > 1:
- value = tmp[1]
- else:
- value = tmp[0]
- strings[key] = string.strip(value)
- # Deal with sync lines in the strings section
- if key in sync_keys:
- sync = string.split(value, ",")
- for (man, mon) in sync_keys[key]:
- monitors[man][mon].hsync = string.strip(sync[0])
- monitors[man][mon].vsync = string.strip(sync[1])
-
- # these are the sections that tell us which AddReg to use
- # AddReg=PBCOM14L.AddReg, 1024, DPMS
- elif section in instsections:
- if string.find (line, "AddReg=") >= 0:
- rhs = string.split (line, '=')[1]
- # PBCOM14L.AddReg, 1024, DPMS
- registry = string.lower(string.strip(string.split(rhs, ',')[0]))
- # add this monitor to the list of monitors that will
- # use this registry entry
- if registry in regsections:
- regsections[registry].append (section)
- else:
- regsections[registry] = [ section ]
- # these are the actual AddReg entries. Look up in our table
- # to find which
- elif section in regsections:
- if string.find(line, 'HKR') >= 0:
- ids = regsections[section]
- # make a list of all the monitors pointing to
- # this registry section via install sections
- mons = []
- for id in ids:
- mons = mons + instsections[id]
- if string.find(line, 'HKR,"MODES') >= 0:
- modes = string.split(line, '"')
- sync = string.split(modes[3], ',')
- for (man, mon) in mons:
- monitors[man][mon].hsync = string.strip(sync[0])
- monitors[man][mon].vsync = string.strip(sync[1])
- else:
- # Sync lines must be somewhere else, maybe in the strings section
- keyval = None
- try:
- keyval = string.split(line,",")[4]
- except IndexError:
- pass
- if keyval and string.find(keyval, "KeyValue") >= 0:
- keyval = string.replace(string.strip(keyval), "%", "").lower()
- sync_keys[keyval] = mons
- for man in list(manufacturers.keys()):
- for monitor in list(monitors[man].values()):
- # OK, I know it's hacked up to look up these strings way down
- # here, but .inf format is CRAP.
- try:
- monitor.descr = strings[string.lower(monitor.id)]
- except KeyError:
- monitor.descr = monitor.id
- try:
- monitor.man = strings[string.lower(manufacturers[man])]
- except:
- monitor.man = manufacturers[man]
-
- print(monitor)
|