195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python
295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be
401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file.
501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.format.policy_templates.writers import template_writer
801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgNEWLINE = '\r\n'
1101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgdef GetWriter(config):
1401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''Factory method for creating AdmWriter objects.
1501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  See the constructor of TemplateWriter for description of
1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  arguments.
1701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''
1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  return AdmWriter(['win'], config)
1901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass IndentedStringBuilder:
2201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''Utility class for building text with indented lines.'''
2301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def __init__(self):
2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.lines = []
2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.indent = ''
2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def AddLine(self, string='', indent_diff=0):
2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Appends a string with indentation and a linebreak to |self.lines|.
3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Args:
3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      string: The string to print.
3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      indent_diff: the difference of indentation of the printed line,
3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        compared to the next/previous printed line. Increment occurs
3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        after printing the line, while decrement occurs before that.
3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    indent_diff *= 2
3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if indent_diff < 0:
3901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.indent = self.indent[(-indent_diff):]
4001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if string != '':
4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.lines.append(self.indent + string)
4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    else:
4301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.lines.append('')
4401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if indent_diff > 0:
4501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.indent += ''.ljust(indent_diff)
4601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def AddLines(self, other):
4801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Appends the content of another |IndentedStringBuilder| to |self.lines|.
4901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Indentation of the added lines will be the sum of |self.indent| and
5001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    their original indentation.
5101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
5201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Args:
5301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      other: The buffer from which lines are copied.
5401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
5501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    for line in other.lines:
5601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.AddLine(line)
5701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
5801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def ToString(self):
5901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Returns |self.lines| as text string.'''
6001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return NEWLINE.join(self.lines)
6101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass AdmWriter(template_writer.TemplateWriter):
6401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''Class for generating policy templates in Windows ADM format.
6501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  It is used by PolicyTemplateGenerator to write ADM files.
6601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''
6701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  TYPE_TO_INPUT = {
6901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    'string': 'EDITTEXT',
7001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    'int': 'NUMERIC',
7101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    'string-enum': 'DROPDOWNLIST',
7201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    'int-enum': 'DROPDOWNLIST',
73248837b02a1e8da230541fa6c12e4d1b1dea2701joaodasilva@chromium.org    'list': 'LISTBOX',
74786be15cb6c0f7d78f3eab9fda9d4266619ddbf0joaodasilva@chromium.org    'string-enum-list': 'LISTBOX',
75248837b02a1e8da230541fa6c12e4d1b1dea2701joaodasilva@chromium.org    'dict': 'EDITTEXT'
7601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  }
7701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
7801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def _AddGuiString(self, name, value):
7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # Escape newlines in the value.
8001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    value = value.replace('\n', '\\n')
810bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    if name in self.strings_seen:
821ab22a47727a765d94f9d2ee142cbd8d709849e2joaodasilva@chromium.org      err = ('%s was added as "%s" and now added again as "%s"' %
831ab22a47727a765d94f9d2ee142cbd8d709849e2joaodasilva@chromium.org             (name, self.strings_seen[name], value))
841ab22a47727a765d94f9d2ee142cbd8d709849e2joaodasilva@chromium.org      assert value == self.strings_seen[name], err
850bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    else:
860bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self.strings_seen[name] = value
870bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      line = '%s="%s"' % (name, value)
880bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self.strings.AddLine(line)
8901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
900bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def _WriteSupported(self, builder):
910bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('#if version >= 4', 1)
920bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('SUPPORTED !!SUPPORTED_WINXPSP2')
930bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('#endif', -1)
9401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
950bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def _WritePart(self, policy, key_name, builder):
9601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Writes the PART ... END PART section of a policy.
9701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
9801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Args:
9901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      policy: The policy to write to the output.
1000bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      key_name: The registry key backing the policy.
1010bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder: Builder to append lines to.
10201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
10301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    policy_part_name = policy['name'] + '_Part'
10401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self._AddGuiString(policy_part_name, policy['label'])
10501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
10601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # Print the PART ... END PART section:
1070bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine()
10801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    adm_type = self.TYPE_TO_INPUT[policy['type']]
1090bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('PART !!%s  %s' % (policy_part_name, adm_type), 1)
110786be15cb6c0f7d78f3eab9fda9d4266619ddbf0joaodasilva@chromium.org    if policy['type'] in ('list', 'string-enum-list'):
11101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      # Note that the following line causes FullArmor ADMX Migrator to create
11201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      # corrupt ADMX files. Please use admx_writer to get ADMX files.
1130bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('KEYNAME "%s\\%s"' % (key_name, policy['name']))
1140bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('VALUEPREFIX ""')
11501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    else:
1160bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('VALUENAME "%s"' % policy['name'])
1179286469aaa9be3f2bef0156a27faf105b8d55449pastarmovj@chromium.org    if policy['type'] == 'int':
1189286469aaa9be3f2bef0156a27faf105b8d55449pastarmovj@chromium.org      # The default max for NUMERIC values is 9999 which is too small for us.
1199286469aaa9be3f2bef0156a27faf105b8d55449pastarmovj@chromium.org      builder.AddLine('MIN 0 MAX 2000000000')
12001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if policy['type'] in ('int-enum', 'string-enum'):
1210bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('ITEMLIST', 1)
12201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      for item in policy['items']:
12301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        if policy['type'] == 'int-enum':
12401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          value_text = 'NUMERIC ' + str(item['value'])
12501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        else:
12601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          value_text = '"' + item['value'] + '"'
1270bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org        builder.AddLine('NAME !!%s_DropDown VALUE %s' %
12801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            (item['name'], value_text))
12901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        self._AddGuiString(item['name'] + '_DropDown', item['caption'])
1300bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('END ITEMLIST', -1)
1310bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('END PART', -1)
13201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1330bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def _WritePolicy(self, policy, key_name, builder):
134e9f965b7a19bfc970bec100fb03e6aa269deb522joaodasilva@chromium.org    if policy['type'] == 'external':
135e9f965b7a19bfc970bec100fb03e6aa269deb522joaodasilva@chromium.org      # This type can only be set through cloud policy.
136e9f965b7a19bfc970bec100fb03e6aa269deb522joaodasilva@chromium.org      return
137e9f965b7a19bfc970bec100fb03e6aa269deb522joaodasilva@chromium.org
13801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self._AddGuiString(policy['name'] + '_Policy', policy['caption'])
1390bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('POLICY !!%s_Policy' % policy['name'], 1)
1400bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self._WriteSupported(builder)
14101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    policy_explain_name = policy['name'] + '_Explain'
14201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self._AddGuiString(policy_explain_name, policy['desc'])
1430bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('EXPLAIN !!' + policy_explain_name)
14401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
14501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if policy['type'] == 'main':
1460bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('VALUENAME "%s"' % policy['name'])
1470bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('VALUEON NUMERIC 1')
1480bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      builder.AddLine('VALUEOFF NUMERIC 0')
14901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    else:
1500bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self._WritePart(policy, key_name, builder)
1510bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org
1520bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine('END POLICY', -1)
1530bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    builder.AddLine()
1540bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org
1550bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def WritePolicy(self, policy):
156740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org    if self.CanBeMandatory(policy):
157740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org      self._WritePolicy(policy,
158740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org                        self.config['win_reg_mandatory_key_name'],
159740badd5e3e44434a9a47b5d16749daac1e8ea80joaodasilva@chromium.org                        self.policies)
16001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1610bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def WriteRecommendedPolicy(self, policy):
1620bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self._WritePolicy(policy,
1630bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org                      self.config['win_reg_recommended_key_name'],
1640bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org                      self.recommended_policies)
16501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
16601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def BeginPolicyGroup(self, group):
1670bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    category_name = group['name'] + '_Category'
1680bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self._AddGuiString(category_name, group['caption'])
1690bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.policies.AddLine('CATEGORY !!' + category_name, 1)
17001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
17101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def EndPolicyGroup(self):
1720bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.policies.AddLine('END CATEGORY', -1)
1730bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.policies.AddLine('')
1740bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org
1750bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def BeginRecommendedPolicyGroup(self, group):
1760bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    category_name = group['name'] + '_Category'
1770bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self._AddGuiString(category_name, group['caption'])
1780bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.recommended_policies.AddLine('CATEGORY !!' + category_name, 1)
17901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1800bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def EndRecommendedPolicyGroup(self):
1810bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.recommended_policies.AddLine('END CATEGORY', -1)
1820bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.recommended_policies.AddLine('')
1830bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org
1840bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org  def _CreateTemplate(self, category_path, key_name, policies):
18501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Creates the whole ADM template except for the [Strings] section, and
18601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    returns it as an |IndentedStringBuilder|.
18701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
18801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Args:
1890bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      category_path: List of strings representing the category path.
1900bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      key_name: Main registry key backing the policies.
19101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      policies: ADM code for all the policies in an |IndentedStringBuilder|.
19201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
19301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    lines = IndentedStringBuilder()
1940bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    for part in category_path:
1950bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      lines.AddLine('CATEGORY !!' + part, 1)
1960bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    lines.AddLine('KEYNAME "%s"' % key_name)
19701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    lines.AddLine()
19801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
19901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    lines.AddLines(policies)
20001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2010bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    for part in category_path:
20201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      lines.AddLine('END CATEGORY', -1)
2030bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    lines.AddLine()
20401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
20501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return lines
20601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
20701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def BeginTemplate(self):
20801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self._AddGuiString(self.config['win_supported_os'],
20901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org                       self.messages['win_supported_winxpsp2']['text'])
2100bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    category_path = self.config['win_mandatory_category_path']
2110bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    recommended_category_path = self.config['win_recommended_category_path']
2129cb4f8962b26d916b6e7813858f3644d1fcd29c9joaodasilva@chromium.org    recommended_name = '%s - %s' % \
2130bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org        (self.config['app_name'], self.messages['doc_recommended']['text'])
21401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if self.config['build'] == 'chrome':
21501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self._AddGuiString(category_path[0], 'Google')
21601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self._AddGuiString(category_path[1], self.config['app_name'])
2170bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self._AddGuiString(recommended_category_path[1], recommended_name)
21801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    elif self.config['build'] == 'chromium':
21901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self._AddGuiString(category_path[0], self.config['app_name'])
2200bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self._AddGuiString(recommended_category_path[0], recommended_name)
22101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # All the policies will be written into self.policies.
22201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # The final template text will be assembled into self.lines by
22301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # self.EndTemplate().
22401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
22501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def EndTemplate(self):
22601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # Copy policies into self.lines.
22701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    policy_class = self.config['win_group_policy_class'].upper()
2280bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    for class_name in ['MACHINE', 'USER']:
2290bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      if policy_class != 'BOTH' and policy_class != class_name:
2300bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org        continue
2310bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self.lines.AddLine('CLASS ' + class_name, 1)
2320bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self.lines.AddLines(self._CreateTemplate(
2330bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org          self.config['win_mandatory_category_path'],
2340bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org          self.config['win_reg_mandatory_key_name'],
2350bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org          self.policies))
2360bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self.lines.AddLines(self._CreateTemplate(
2370bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org          self.config['win_recommended_category_path'],
2380bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org          self.config['win_reg_recommended_key_name'],
2390bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org          self.recommended_policies))
2400bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org      self.lines.AddLine('', -1)
24101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # Copy user strings into self.lines.
24201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.lines.AddLine('[Strings]')
24301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.lines.AddLines(self.strings)
24401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
24501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def Init(self):
24601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # String buffer for building the whole ADM file.
24701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.lines = IndentedStringBuilder()
24801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # String buffer for building the strings section of the ADM file.
24901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.strings = IndentedStringBuilder()
2500bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    # Map of strings seen, to avoid duplicates.
2510bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.strings_seen = {}
25201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # String buffer for building the policies of the ADM file.
25301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.policies = IndentedStringBuilder()
2540bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    # String buffer for building the recommended policies of the ADM file.
2550bb959423818266efea82162f48ad83e5eb2e8b2joaodasilva@chromium.org    self.recommended_policies = IndentedStringBuilder()
25601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
25701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def GetTemplateText(self):
25801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    return self.lines.ToString()
259