Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / tools / grit / grit / format / policy_templates / writers / adml_writer.py
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 from xml.dom import minidom
7 from grit.format.policy_templates.writers import xml_formatted_writer
8
9
10 def GetWriter(config):
11   '''Factory method for instanciating the ADMLWriter. Every Writer needs a
12   GetWriter method because the TemplateFormatter uses this method to
13   instantiate a Writer.
14   '''
15   return ADMLWriter(['win'], config)
16
17
18 class ADMLWriter(xml_formatted_writer.XMLFormattedWriter):
19   ''' Class for generating an ADML policy template. It is used by the
20   PolicyTemplateGenerator to write the ADML file.
21   '''
22
23   # DOM root node of the generated ADML document.
24   _doc = None
25
26   # The string-table contains all ADML "string" elements.
27   _string_table_elem = None
28
29   # The presentation-table is the container for presentation elements, that
30   # describe the presentation of Policy-Groups and Policies.
31   _presentation_table_elem = None
32
33   def _AddString(self, id, text):
34     ''' Adds an ADML "string" element to _string_table_elem. The following
35     ADML snippet contains an example:
36
37     <string id="$(id)">$(text)</string>
38
39     Args:
40       id: ID of the newly created "string" element.
41       text: Value of the newly created "string" element.
42     '''
43     id = id.replace('.', '_')
44     if id in self.strings_seen:
45       assert text == self.strings_seen[id]
46     else:
47       self.strings_seen[id] = text
48       string_elem = self.AddElement(
49           self._string_table_elem, 'string', {'id': id})
50       string_elem.appendChild(self._doc.createTextNode(text))
51
52   def WritePolicy(self, policy):
53     '''Generates the ADML elements for a Policy.
54     <stringTable>
55       ...
56       <string id="$(policy_group_name)">$(caption)</string>
57       <string id="$(policy_group_name)_Explain">$(description)</string>
58     </stringTable>
59
60     <presentationTables>
61       ...
62       <presentation id=$(policy_group_name)/>
63     </presentationTables>
64
65     Args:
66       policy: The Policy to generate ADML elements for.
67     '''
68     policy_type = policy['type']
69     policy_name = policy['name']
70     if 'caption' in policy:
71       policy_caption = policy['caption']
72     else:
73       policy_caption = policy_name
74     if 'desc' in policy:
75       policy_description = policy['desc']
76     else:
77       policy_description = policy_name
78     if 'label' in policy:
79       policy_label = policy['label']
80     else:
81       policy_label = policy_name
82
83     self._AddString(policy_name, policy_caption)
84     self._AddString(policy_name + '_Explain', policy_description)
85     presentation_elem = self.AddElement(
86         self._presentation_table_elem, 'presentation', {'id': policy_name})
87
88     if policy_type == 'main':
89       pass
90     elif policy_type in ('string', 'dict'):
91       # 'dict' policies are configured as JSON-encoded strings on Windows.
92       textbox_elem = self.AddElement(presentation_elem, 'textBox',
93                                      {'refId': policy_name})
94       label_elem = self.AddElement(textbox_elem, 'label')
95       label_elem.appendChild(self._doc.createTextNode(policy_label))
96     elif policy_type == 'int':
97       textbox_elem = self.AddElement(presentation_elem, 'decimalTextBox',
98                                      {'refId': policy_name})
99       textbox_elem.appendChild(self._doc.createTextNode(policy_label + ':'))
100     elif policy_type in ('int-enum', 'string-enum'):
101       for item in policy['items']:
102         self._AddString(item['name'], item['caption'])
103       dropdownlist_elem = self.AddElement(presentation_elem, 'dropdownList',
104                                           {'refId': policy_name})
105       dropdownlist_elem.appendChild(self._doc.createTextNode(policy_label))
106     elif policy_type in ('list', 'string-enum-list'):
107       self._AddString(policy_name + 'Desc', policy_caption)
108       listbox_elem = self.AddElement(presentation_elem, 'listBox',
109                                      {'refId': policy_name + 'Desc'})
110       listbox_elem.appendChild(self._doc.createTextNode(policy_label))
111     elif policy_type == 'group':
112       pass
113     elif policy_type == 'external':
114       # This type can only be set through cloud policy.
115       pass
116     else:
117       raise Exception('Unknown policy type %s.' % policy_type)
118
119   def BeginPolicyGroup(self, group):
120     '''Generates ADML elements for a Policy-Group. For each Policy-Group two
121     ADML "string" elements are added to the string-table. One contains the
122     caption of the Policy-Group and the other a description. A Policy-Group also
123     requires an ADML "presentation" element that must be added to the
124     presentation-table. The "presentation" element is the container for the
125     elements that define the visual presentation of the Policy-Goup's Policies.
126     The following ADML snippet shows an example:
127
128     Args:
129       group: The Policy-Group to generate ADML elements for.
130     '''
131     # Add ADML "string" elements to the string-table that are required by a
132     # Policy-Group.
133     self._AddString(group['name'] + '_group', group['caption'])
134
135   def _AddBaseStrings(self, build):
136     ''' Adds ADML "string" elements to the string-table that are referenced by
137     the ADMX file but not related to any specific Policy-Group or Policy.
138     '''
139     self._AddString(self.config['win_supported_os'],
140                     self.messages['win_supported_winxpsp2']['text'])
141     recommended_name = '%s - %s' % \
142         (self.config['app_name'], self.messages['doc_recommended']['text'])
143     if build == 'chrome':
144       self._AddString(self.config['win_mandatory_category_path'][0],
145                       'Google')
146       self._AddString(self.config['win_mandatory_category_path'][1],
147                       self.config['app_name'])
148       self._AddString(self.config['win_recommended_category_path'][1],
149                       recommended_name)
150     elif build == 'chromium':
151       self._AddString(self.config['win_mandatory_category_path'][0],
152                       self.config['app_name'])
153       self._AddString(self.config['win_recommended_category_path'][0],
154                       recommended_name)
155
156   def BeginTemplate(self):
157     dom_impl = minidom.getDOMImplementation('')
158     self._doc = dom_impl.createDocument(None, 'policyDefinitionResources',
159                                         None)
160     if self._GetChromiumVersionString() is not None:
161       self.AddComment(self._doc.documentElement, self.config['build'] + \
162           ' version: ' + self._GetChromiumVersionString())
163     policy_definitions_resources_elem = self._doc.documentElement
164     policy_definitions_resources_elem.attributes['revision'] = '1.0'
165     policy_definitions_resources_elem.attributes['schemaVersion'] = '1.0'
166
167     self.AddElement(policy_definitions_resources_elem, 'displayName')
168     self.AddElement(policy_definitions_resources_elem, 'description')
169     resources_elem = self.AddElement(policy_definitions_resources_elem,
170                                      'resources')
171     self._string_table_elem = self.AddElement(resources_elem, 'stringTable')
172     self._AddBaseStrings(self.config['build'])
173     self._presentation_table_elem = self.AddElement(resources_elem,
174                                                    'presentationTable')
175
176   def Init(self):
177     # Map of all strings seen.
178     self.strings_seen = {}
179
180   def GetTemplateText(self):
181     # Using "toprettyxml()" confuses the Windows Group Policy Editor
182     # (gpedit.msc) because it interprets whitespace characters in text between
183     # the "string" tags. This prevents gpedit.msc from displaying the category
184     # names correctly.
185     # TODO(markusheintz): Find a better formatting that works with gpedit.
186     return self._doc.toxml()