Home | History | Annotate | Download | only in writers
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 
      7 import json
      8 
      9 from grit.format.policy_templates.writers import template_writer
     10 
     11 
     12 def GetWriter(config):
     13   '''Factory method for creating RegWriter objects.
     14   See the constructor of TemplateWriter for description of
     15   arguments.
     16   '''
     17   return RegWriter(['win'], config)
     18 
     19 
     20 class RegWriter(template_writer.TemplateWriter):
     21   '''Class for generating policy example files in .reg format (for Windows).
     22   The generated files will define all the supported policies with example
     23   values  set for them. This class is used by PolicyTemplateGenerator to
     24   write .reg  files.
     25   '''
     26 
     27   NEWLINE = '\r\n'
     28 
     29   def _EscapeRegString(self, string):
     30     return string.replace('\\', '\\\\').replace('\"', '\\\"')
     31 
     32   def _StartBlock(self, key, suffix, list):
     33     key = 'HKEY_LOCAL_MACHINE\\' + key
     34     if suffix:
     35       key = key + '\\' + suffix
     36     if key != self._last_key.get(id(list), None):
     37       list.append('')
     38       list.append('[%s]' % key)
     39       self._last_key[id(list)] = key
     40 
     41   def PreprocessPolicies(self, policy_list):
     42     return self.FlattenGroupsAndSortPolicies(policy_list,
     43                                              self.GetPolicySortingKey)
     44 
     45   def GetPolicySortingKey(self, policy):
     46     '''Extracts a sorting key from a policy. These keys can be used for
     47     list.sort() methods to sort policies.
     48     See TemplateWriter.SortPoliciesGroupsFirst for usage.
     49     '''
     50     is_list = policy['type'] in ('list', 'string-enum-list')
     51     # Lists come after regular policies.
     52     return (is_list, policy['name'])
     53 
     54   def _WritePolicy(self, policy, key, list):
     55     example_value = policy['example_value']
     56 
     57     if policy['type'] == 'external':
     58       # This type can only be set through cloud policy.
     59       return
     60     elif policy['type'] in ('list', 'string-enum-list'):
     61       self._StartBlock(key, policy['name'], list)
     62       i = 1
     63       for item in example_value:
     64         escaped_str = self._EscapeRegString(item)
     65         list.append('"%d"="%s"' % (i, escaped_str))
     66         i = i + 1
     67     else:
     68       self._StartBlock(key, None, list)
     69       if policy['type'] in ('string', 'string-enum', 'dict'):
     70         example_value_str = json.dumps(example_value, sort_keys=True)
     71         if policy['type'] == 'dict':
     72           example_value_str = '"%s"' % example_value_str
     73       elif policy['type'] == 'main':
     74         if example_value == True:
     75           example_value_str = 'dword:00000001'
     76         else:
     77           example_value_str = 'dword:00000000'
     78       elif policy['type'] in ('int', 'int-enum'):
     79         example_value_str = 'dword:%08x' % example_value
     80       else:
     81         raise Exception('unknown policy type %s:' % policy['type'])
     82 
     83       list.append('"%s"=%s' % (policy['name'], example_value_str))
     84 
     85   def WritePolicy(self, policy):
     86     if self.CanBeMandatory(policy):
     87       self._WritePolicy(policy,
     88                         self.config['win_reg_mandatory_key_name'],
     89                         self._mandatory)
     90 
     91   def WriteRecommendedPolicy(self, policy):
     92     self._WritePolicy(policy,
     93                       self.config['win_reg_recommended_key_name'],
     94                       self._recommended)
     95 
     96   def BeginTemplate(self):
     97     pass
     98 
     99   def EndTemplate(self):
    100     pass
    101 
    102   def Init(self):
    103     self._mandatory = []
    104     self._recommended = []
    105     self._last_key = {}
    106 
    107   def GetTemplateText(self):
    108     prefix = ['Windows Registry Editor Version 5.00']
    109     all = prefix + self._mandatory + self._recommended
    110     return self.NEWLINE.join(all)
    111