Package imagizer :: Module winpath |
[hide private]
[frames] | no frames]

# Source Code for Module imagizer.winpath

      1  # winpaths.py
      2
      3  """Functions for getting system/language/user dependent paths on windows.
      4
      5  All path names returned by the functions of this module are unicode strings.
      6  """
      7
      8  __all__ = [
      9    'HKCU', 'HKLM',
     10    'SHELL_FOLDERS',
     11    'USER_SHELL_FOLDERS',
     12    'expandvars',
     13    'get_appdata',
     14    'get_common_shellfolders',
     15    'get_homedir',
     16    'get_sharedconf',
     17    'get_shellfolders',
     18    'get_userconf',
     19    'get_windir'
     20  ]
     21
     22  __module__    = "winpaths"
     23  __author__    = "Christopher Arndt"
     24  __version__   = "0.1"
     25  __revision__  = "$Rev$"
     26  __date__      = "$Date: 2010-04-28 19:44:10 $"
     27  __copyright__ = "Python license"
     28
     29  # standard library modules
     30  import _winreg, os
     31
     32  SHELL_FOLDERS = \
     33    r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'
     34  USER_SHELL_FOLDERS = \
     35    r'Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders'
     36  HKCU = _winreg.HKEY_CURRENT_USER
     37  HKLM = _winreg.HKEY_LOCAL_MACHINE
     38
     39  # helper functions
     40 -def _substenv(m):
     41      return os.environ.get(m.group(1), m.group(0))
     42
     43  _env_rx = None
     44 -def expandvars(s):
     45      """Expand environment variables of form %var%.
     46
     47      Unknown variables are left unchanged.
     48      """
     49
     50      global _env_rx
     51
     52      if '%' not in s:
     53          return s
     54      if _env_rx is None:
     55          import re
     56          _env_rx = re.compile(r'%([^|<>=^%]+)%')
     57      return _env_rx.sub(_substenv, s)
     58
     59 -def _get_reg_value(key, subkey, name):
     60      """Return registry value specified by key, subkey, and name.
     61
     62      Environment variables in values of type REG_EXPAND_SZ are expanded
     63      if possible.
     64      """
     65
     66      key = _winreg.OpenKey(key, subkey)
     67      try:
     68          ret = _winreg.QueryValueEx(key, name)
     69      except WindowsError:
     70          return None
     71      else:
     72          key.Close()
     73          if ret[1] == _winreg.REG_EXPAND_SZ:
     74              return expandvars(ret[0])
     75          else:
     76              return ret[0]
     77
     78 -def _get_reg_user_value(key, name):
     79      """Return a windows registry value from the CURRENT_USER branch."""
     80
     81      return _get_reg_value(HKCU, key, name)
     82
     83 -def _get_reg_machine_value(key, name):
     84      """Return a windows registry value from the LOCAL_MACHINE branch."""
     85
     86      return _get_reg_value(HKLM, key, name)
     87
     88  # public functions
     89 -def get_appdata():
     90      """Return path of directory where apps should store user specific data."""
     91
     92      return _get_reg_user_value(SHELL_FOLDERS, 'AppData')
     93
     94 -def get_common_shellfolders():
     95      """Return mapping of shell folder names (all users) to paths."""
     96
     97      return get_shellfolders(branch=HKLM)
     98
     99 -def get_homedir():
    100      """Return path to user home directory, i.e. 'My Files'."""
    101
    102      return _get_reg_user_value(SHELL_FOLDERS, 'Personal')
    103
    104 -def get_sharedconf(prog, *args):
    105      """Return path to shared configuration data for 'prog' from 'vendor'.
    106
    107      Additional arguments are appended via os.path.join().
    108
    109      See also: get_user_conf()
    110      """
    111
    112      return os.path.join(
    113        _get_reg_machine_value(SHELL_FOLDERS, 'Common AppData'),
    114        vendor, prog, *args
    115      )
    116
    117 -def get_shellfolders(branch=HKCU, key=SHELL_FOLDERS):
    118      """Return mapping of shell folder names (current user) to paths."""
    119
    120      key = _winreg.OpenKey(branch, key)
    121      folders = {}
    122      i = 0
    123      while True:
    124          try:
    125              ret = _winreg.EnumValue(key, i)
    126              if ret[2] == _winreg.REG_EXPAND_SZ:
    127                  folders[ret[0]] = expandvars(ret[1])
    128              else:
    129                  folders[ret[0]] = ret[1]
    130          except WindowsError:
    131              break
    132          i +=1
    133      key.Close()
    134      return folders
    135
    136 -def get_userconf(vendor, prog, *args):
    137      """Return path to user configuration data for 'prog' from 'vendor'.
    138
    139      Additional arguments are appended via os.path.join(), e.g.
    140      use like this:
    141
    142      optionsfn = get_userconf("ACME Soft", "Exploder", "Options.xml")
    143      """
    144
    145      return os.path.join(get_appdata(), vendor, prog, *args)
    146
    147 -def get_windir():
    148      """Convenience function to get path to windows installation directory."""
    149
    150      return unicode(os.environ["WINDIR"])
    151