aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2017-12-30 17:02:28 -0800
committerRob Mensching <rob@firegiant.com>2017-12-30 17:02:28 -0800
commitfe37cb9023cbb69d0a32409144ea0142172fe3fd (patch)
tree99f2d44114deec401957070682b4d19baeb041f4
parent7b013ac66a36e0f73d480ef28771a65f64b57e19 (diff)
downloadwix-fe37cb9023cbb69d0a32409144ea0142172fe3fd.tar.gz
wix-fe37cb9023cbb69d0a32409144ea0142172fe3fd.tar.bz2
wix-fe37cb9023cbb69d0a32409144ea0142172fe3fd.zip
Reduce code footprint in WixToolset.Data
-rw-r--r--src/WixToolset.Data/Intermediate.cs34
-rw-r--r--src/WixToolset.Data/Localization.cs306
2 files changed, 2 insertions, 338 deletions
diff --git a/src/WixToolset.Data/Intermediate.cs b/src/WixToolset.Data/Intermediate.cs
index ae507058..4914ef88 100644
--- a/src/WixToolset.Data/Intermediate.cs
+++ b/src/WixToolset.Data/Intermediate.cs
@@ -59,38 +59,6 @@ namespace WixToolset.Data
59 public IList<IntermediateSection> Sections { get; } 59 public IList<IntermediateSection> Sections { get; }
60 60
61 /// <summary> 61 /// <summary>
62 /// Adds a localization to the intermediate.
63 /// </summary>
64 /// <param name="localization">Localization to add to the intermediate.</param>
65 public void AddLocalization(Localization localization)
66 {
67 if (this.localizationsByCulture.TryGetValue(localization.Culture, out var existingCulture))
68 {
69 existingCulture.Merge(localization);
70 }
71 else
72 {
73 this.localizationsByCulture.Add(localization.Culture, localization);
74 }
75 }
76
77 /// <summary>
78 /// Gets localization files from this library that match the cultures passed in, in the order of the array of cultures.
79 /// </summary>
80 /// <param name="cultures">The list of cultures to get localizations for.</param>
81 /// <returns>All localizations contained in this library that match the set of cultures provided, in the same order.</returns>
82 public IEnumerable<Localization> GetLocalizationsForCultures(IEnumerable<string> cultures)
83 {
84 foreach (string culture in cultures ?? Array.Empty<string>())
85 {
86 if (this.localizationsByCulture.TryGetValue(culture, out var localization))
87 {
88 yield return localization;
89 }
90 }
91 }
92
93 /// <summary>
94 /// Loads an intermediate from a path on disk. 62 /// Loads an intermediate from a path on disk.
95 /// </summary> 63 /// </summary>
96 /// <param name="path">Path to intermediate file saved on disk.</param> 64 /// <param name="path">Path to intermediate file saved on disk.</param>
@@ -223,7 +191,7 @@ namespace WixToolset.Data
223 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param> 191 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param>
224 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param> 192 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
225 /// <returns>Returns the loaded intermediate.</returns> 193 /// <returns>Returns the loaded intermediate.</returns>
226 internal static Intermediate Load(Stream stream, Uri baseUri, ITupleDefinitionCreator creator, bool suppressVersionCheck = false) 194 private static Intermediate Load(Stream stream, Uri baseUri, ITupleDefinitionCreator creator, bool suppressVersionCheck = false)
227 { 195 {
228 JsonObject jsonObject; 196 JsonObject jsonObject;
229 197
diff --git a/src/WixToolset.Data/Localization.cs b/src/WixToolset.Data/Localization.cs
index 4ddef77b..673e0155 100644
--- a/src/WixToolset.Data/Localization.cs
+++ b/src/WixToolset.Data/Localization.cs
@@ -4,11 +4,7 @@ namespace WixToolset.Data
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Globalization;
9 using System.Xml;
10 using SimpleJson; 7 using SimpleJson;
11 using WixToolset.Data.Msi;
12 using WixToolset.Data.Bind; 8 using WixToolset.Data.Bind;
13 9
14 /// <summary> 10 /// <summary>
@@ -27,7 +23,7 @@ namespace WixToolset.Data
27 public Localization(int codepage, string culture, IDictionary<string, BindVariable> variables, IDictionary<string, LocalizedControl> localizedControls) 23 public Localization(int codepage, string culture, IDictionary<string, BindVariable> variables, IDictionary<string, LocalizedControl> localizedControls)
28 { 24 {
29 this.Codepage = codepage; 25 this.Codepage = codepage;
30 this.Culture = String.IsNullOrEmpty(culture) ? String.Empty : culture.ToLowerInvariant(); 26 this.Culture = culture?.ToLowerInvariant() ?? String.Empty;
31 this.variables = new Dictionary<string, BindVariable>(variables); 27 this.variables = new Dictionary<string, BindVariable>(variables);
32 this.localizedControls = new Dictionary<string, LocalizedControl>(localizedControls); 28 this.localizedControls = new Dictionary<string, LocalizedControl>(localizedControls);
33 } 29 }
@@ -56,25 +52,6 @@ namespace WixToolset.Data
56 /// <value>The localized controls.</value> 52 /// <value>The localized controls.</value>
57 public ICollection<KeyValuePair<string, LocalizedControl>> LocalizedControls => this.localizedControls; 53 public ICollection<KeyValuePair<string, LocalizedControl>> LocalizedControls => this.localizedControls;
58 54
59 /// <summary>
60 /// Merge the information from another localization object into this one.
61 /// </summary>
62 /// <param name="localization">The localization object to be merged into this one.</param>
63 public void Merge(Localization localization)
64 {
65 foreach (BindVariable wixVariableRow in localization.Variables)
66 {
67 if (!this.variables.TryGetValue(wixVariableRow.Id, out BindVariable existingWixVariableRow) || (existingWixVariableRow.Overridable && !wixVariableRow.Overridable))
68 {
69 variables[wixVariableRow.Id] = wixVariableRow;
70 }
71 else if (!wixVariableRow.Overridable)
72 {
73 throw new WixException(ErrorMessages.DuplicateLocalizationIdentifier(wixVariableRow.SourceLineNumbers, wixVariableRow.Id));
74 }
75 }
76 }
77
78 internal JsonObject Serialize() 55 internal JsonObject Serialize()
79 { 56 {
80 var jsonObject = new JsonObject 57 var jsonObject = new JsonObject
@@ -143,286 +120,5 @@ namespace WixToolset.Data
143 120
144 return new Localization(codepage, culture, variables, controls); 121 return new Localization(codepage, culture, variables, controls);
145 } 122 }
146
147 /// <summary>
148 /// Loads a localization file from a stream.
149 /// </summary>
150 /// <param name="reader">XmlReader where the intermediate is persisted.</param>
151 /// <param name="tableDefinitions">Collection containing TableDefinitions to use when loading the localization file.</param>
152 /// <returns>Returns the loaded localization.</returns>
153 internal static Localization Read(XmlReader reader)
154 {
155 Debug.Assert("localization" == reader.LocalName);
156
157 int codepage = 0;
158 string culture = null;
159 bool empty = reader.IsEmptyElement;
160
161 while (reader.MoveToNextAttribute())
162 {
163 switch (reader.Name)
164 {
165 case "codepage":
166 codepage = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
167 break;
168 case "culture":
169 culture = reader.Value;
170 break;
171 }
172 }
173
174 Dictionary<string, BindVariable> variables = new Dictionary<string, BindVariable>();
175 Dictionary<string, LocalizedControl> localizedControls = new Dictionary<string, LocalizedControl>();
176
177 if (!empty)
178 {
179 bool done = false;
180
181 while (!done && reader.Read())
182 {
183 switch (reader.NodeType)
184 {
185 case XmlNodeType.Element:
186 switch (reader.LocalName)
187 {
188 case "string":
189 BindVariable row = Localization.ReadString(reader);
190 variables.Add(row.Id, row);
191 break;
192
193 case "ui":
194 LocalizedControl ui = Localization.ReadUI(reader);
195 localizedControls.Add(ui.GetKey(), ui);
196 break;
197
198 default:
199 throw new XmlException();
200 }
201 break;
202 case XmlNodeType.EndElement:
203 done = true;
204 break;
205 }
206 }
207
208 if (!done)
209 {
210 throw new XmlException();
211 }
212 }
213
214 return new Localization(codepage, culture, variables, localizedControls);
215 }
216
217 /// <summary>
218 /// Writes a localization file into an XML format.
219 /// </summary>
220 /// <param name="writer">XmlWriter where the localization file should persist itself as XML.</param>
221 internal void Write(XmlWriter writer)
222 {
223 writer.WriteStartElement(Localization.XmlElementName, Library.XmlNamespaceUri);
224
225 if (-1 != this.Codepage)
226 {
227 writer.WriteAttributeString("codepage", this.Codepage.ToString(CultureInfo.InvariantCulture));
228 }
229
230 if (!String.IsNullOrEmpty(this.Culture))
231 {
232 writer.WriteAttributeString("culture", this.Culture);
233 }
234
235 foreach (BindVariable wixVariableRow in this.variables.Values)
236 {
237 writer.WriteStartElement("string", Library.XmlNamespaceUri);
238
239 writer.WriteAttributeString("id", wixVariableRow.Id);
240
241 if (wixVariableRow.Overridable)
242 {
243 writer.WriteAttributeString("overridable", "yes");
244 }
245
246 writer.WriteCData(wixVariableRow.Value);
247
248 writer.WriteEndElement();
249 }
250
251 foreach (string controlKey in this.localizedControls.Keys)
252 {
253 writer.WriteStartElement("ui", Library.XmlNamespaceUri);
254
255 string[] controlKeys = controlKey.Split('/');
256 string dialog = controlKeys[0];
257 string control = controlKeys[1];
258
259 if (!String.IsNullOrEmpty(dialog))
260 {
261 writer.WriteAttributeString("dialog", dialog);
262 }
263
264 if (!String.IsNullOrEmpty(control))
265 {
266 writer.WriteAttributeString("control", control);
267 }
268
269 LocalizedControl localizedControl = this.localizedControls[controlKey];
270
271 if (Common.IntegerNotSet != localizedControl.X)
272 {
273 writer.WriteAttributeString("x", localizedControl.X.ToString());
274 }
275
276 if (Common.IntegerNotSet != localizedControl.Y)
277 {
278 writer.WriteAttributeString("y", localizedControl.Y.ToString());
279 }
280
281 if (Common.IntegerNotSet != localizedControl.Width)
282 {
283 writer.WriteAttributeString("width", localizedControl.Width.ToString());
284 }
285
286 if (Common.IntegerNotSet != localizedControl.Height)
287 {
288 writer.WriteAttributeString("height", localizedControl.Height.ToString());
289 }
290
291 if (MsiInterop.MsidbControlAttributesRTLRO == (localizedControl.Attributes & MsiInterop.MsidbControlAttributesRTLRO))
292 {
293 writer.WriteAttributeString("rightToLeft", "yes");
294 }
295
296 if (MsiInterop.MsidbControlAttributesRightAligned == (localizedControl.Attributes & MsiInterop.MsidbControlAttributesRightAligned))
297 {
298 writer.WriteAttributeString("rightAligned", "yes");
299 }
300
301 if (MsiInterop.MsidbControlAttributesLeftScroll == (localizedControl.Attributes & MsiInterop.MsidbControlAttributesLeftScroll))
302 {
303 writer.WriteAttributeString("leftScroll", "yes");
304 }
305
306 if (!String.IsNullOrEmpty(localizedControl.Text))
307 {
308 writer.WriteCData(localizedControl.Text);
309 }
310
311 writer.WriteEndElement();
312 }
313
314 writer.WriteEndElement();
315 }
316
317 /// <summary>
318 /// Loads a localization file from a stream.
319 /// </summary>
320 /// <param name="reader">XmlReader where the intermediate is persisted.</param>
321 /// <param name="tableDefinitions">Collection containing TableDefinitions to use when loading the localization file.</param>
322 /// <returns>Returns the loaded localization.</returns>
323 private static BindVariable ReadString(XmlReader reader)
324 {
325 Debug.Assert("string" == reader.LocalName);
326
327 string id = null;
328 string value = null;
329 bool overridable = false;
330 bool empty = reader.IsEmptyElement;
331
332 while (reader.MoveToNextAttribute())
333 {
334 switch (reader.Name)
335 {
336 case "id":
337 id = reader.Value;
338 break;
339 case "overridable":
340 overridable = reader.Value.Equals("yes");
341 break;
342 }
343 }
344
345
346 if (!empty)
347 {
348 reader.Read();
349
350 value = reader.Value;
351
352 reader.Read();
353
354 if (XmlNodeType.EndElement != reader.NodeType)
355 {
356 throw new XmlException();
357 }
358 }
359
360 BindVariable wixVariableRow = new BindVariable();
361 wixVariableRow.SourceLineNumbers = SourceLineNumber.CreateFromUri(reader.BaseURI);
362 wixVariableRow.Id = id;
363 wixVariableRow.Overridable = overridable;
364 wixVariableRow.Value = value;
365
366 return wixVariableRow;
367 }
368
369 private static LocalizedControl ReadUI(XmlReader reader)
370 {
371 Debug.Assert("ui" == reader.LocalName);
372
373 string dialog = null;
374 string control = null;
375 int x = Common.IntegerNotSet;
376 int y = Common.IntegerNotSet;
377 int width = Common.IntegerNotSet;
378 int height = Common.IntegerNotSet;
379 int attributes = Common.IntegerNotSet;
380 string text = null;
381 bool empty = reader.IsEmptyElement;
382
383 while (reader.MoveToNextAttribute())
384 {
385 switch (reader.Name)
386 {
387 case "dialog":
388 dialog = reader.Value;
389 break;
390 case "control":
391 control = reader.Value;
392 break;
393 case "x":
394 x = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
395 break;
396 case "y":
397 y = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
398 break;
399 case "width":
400 width = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
401 break;
402 case "height":
403 height = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
404 break;
405 case "attributes":
406 attributes = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture);
407 break;
408 }
409 }
410
411 if (!empty)
412 {
413 reader.Read();
414
415 text = reader.Value;
416
417 reader.Read();
418
419 if (XmlNodeType.EndElement != reader.NodeType)
420 {
421 throw new XmlException();
422 }
423 }
424
425 return new LocalizedControl(dialog, control, x, y, width, height, attributes, text);
426 }
427 } 123 }
428} 124}