diff options
Diffstat (limited to 'src/WixToolset.Core/Common.cs')
| -rw-r--r-- | src/WixToolset.Core/Common.cs | 162 |
1 files changed, 150 insertions, 12 deletions
diff --git a/src/WixToolset.Core/Common.cs b/src/WixToolset.Core/Common.cs index a2881984..28e7ee7b 100644 --- a/src/WixToolset.Core/Common.cs +++ b/src/WixToolset.Core/Common.cs | |||
| @@ -17,7 +17,7 @@ namespace WixToolset | |||
| 17 | /// <summary> | 17 | /// <summary> |
| 18 | /// Common Wix utility methods and types. | 18 | /// Common Wix utility methods and types. |
| 19 | /// </summary> | 19 | /// </summary> |
| 20 | internal static class Common | 20 | public static class Common |
| 21 | { | 21 | { |
| 22 | //------------------------------------------------------------------------------------------------- | 22 | //------------------------------------------------------------------------------------------------- |
| 23 | // Layout of an Access Mask (from http://technet.microsoft.com/en-us/library/cc783530(WS.10).aspx) | 23 | // Layout of an Access Mask (from http://technet.microsoft.com/en-us/library/cc783530(WS.10).aspx) |
| @@ -89,9 +89,7 @@ namespace WixToolset | |||
| 89 | // FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) | 89 | // FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) |
| 90 | internal static readonly string[] FilePermissions = { "Read", "Write", "Append", "ReadExtendedAttributes", "WriteExtendedAttributes", "Execute", "FileAllRights", "ReadAttributes", "WriteAttributes" }; | 90 | internal static readonly string[] FilePermissions = { "Read", "Write", "Append", "ReadExtendedAttributes", "WriteExtendedAttributes", "Execute", "FileAllRights", "ReadAttributes", "WriteAttributes" }; |
| 91 | 91 | ||
| 92 | internal static readonly string[] ReservedFileNames = { "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" }; | 92 | public static readonly Regex WixVariableRegex = new Regex(@"(\!|\$)\((?<namespace>loc|wix|bind|bindpath)\.(?<fullname>(?<name>[_A-Za-z][0-9A-Za-z_]+)(\.(?<scope>[_A-Za-z][0-9A-Za-z_\.]*))?)(\=(?<value>.+?))?\)", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.ExplicitCapture); |
| 93 | |||
| 94 | internal static readonly Regex WixVariableRegex = new Regex(@"(\!|\$)\((?<namespace>loc|wix|bind|bindpath)\.(?<fullname>(?<name>[_A-Za-z][0-9A-Za-z_]+)(\.(?<scope>[_A-Za-z][0-9A-Za-z_\.]*))?)(\=(?<value>.+?))?\)", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.ExplicitCapture); | ||
| 95 | 93 | ||
| 96 | internal const char CustomRowFieldSeparator = '\x85'; | 94 | internal const char CustomRowFieldSeparator = '\x85'; |
| 97 | 95 | ||
| @@ -170,15 +168,14 @@ namespace WixToolset | |||
| 170 | /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception> | 168 | /// <exception cref="ArgumentNullException"><paramref name="value"/> is null.</exception> |
| 171 | /// <exception cref="NotSupportedException">The value doesn't not represent a valid code page name or integer value.</exception> | 169 | /// <exception cref="NotSupportedException">The value doesn't not represent a valid code page name or integer value.</exception> |
| 172 | /// <exception cref="WixException">The code page is invalid for summary information.</exception> | 170 | /// <exception cref="WixException">The code page is invalid for summary information.</exception> |
| 173 | internal static int GetValidCodePage(string value, bool allowNoChange = false, bool onlyAnsi = false, SourceLineNumber sourceLineNumbers = null) | 171 | public static int GetValidCodePage(string value, bool allowNoChange = false, bool onlyAnsi = false, SourceLineNumber sourceLineNumbers = null) |
| 174 | { | 172 | { |
| 175 | int codePage; | ||
| 176 | Encoding encoding; | ||
| 177 | |||
| 178 | try | 173 | try |
| 179 | { | 174 | { |
| 175 | Encoding encoding; | ||
| 176 | |||
| 180 | // check if a integer as a string was passed | 177 | // check if a integer as a string was passed |
| 181 | if (Int32.TryParse(value, out codePage)) | 178 | if (Int32.TryParse(value, out int codePage)) |
| 182 | { | 179 | { |
| 183 | if (0 == codePage) | 180 | if (0 == codePage) |
| 184 | { | 181 | { |
| @@ -366,9 +363,9 @@ namespace WixToolset | |||
| 366 | /// Generate a new Windows Installer-friendly guid. | 363 | /// Generate a new Windows Installer-friendly guid. |
| 367 | /// </summary> | 364 | /// </summary> |
| 368 | /// <returns>A new guid.</returns> | 365 | /// <returns>A new guid.</returns> |
| 369 | internal static string GenerateGuid() | 366 | public static string GenerateGuid() |
| 370 | { | 367 | { |
| 371 | return Guid.NewGuid().ToString("B").ToUpper(CultureInfo.InvariantCulture); | 368 | return Guid.NewGuid().ToString("B").ToUpperInvariant(); |
| 372 | } | 369 | } |
| 373 | 370 | ||
| 374 | /// <summary> | 371 | /// <summary> |
| @@ -465,7 +462,7 @@ namespace WixToolset | |||
| 465 | } | 462 | } |
| 466 | } | 463 | } |
| 467 | 464 | ||
| 468 | internal static string GetFileHash(string path) | 465 | public static string GetFileHash(string path) |
| 469 | { | 466 | { |
| 470 | using (SHA1Managed managed = new SHA1Managed()) | 467 | using (SHA1Managed managed = new SHA1Managed()) |
| 471 | { | 468 | { |
| @@ -478,6 +475,147 @@ namespace WixToolset | |||
| 478 | } | 475 | } |
| 479 | 476 | ||
| 480 | /// <summary> | 477 | /// <summary> |
| 478 | /// Takes an id, and demodularizes it (if possible). | ||
| 479 | /// </summary> | ||
| 480 | /// <remarks> | ||
| 481 | /// If the output type is a module, returns a demodularized version of an id. Otherwise, returns the id. | ||
| 482 | /// </remarks> | ||
| 483 | /// <param name="outputType">The type of the output to bind.</param> | ||
| 484 | /// <param name="modularizationGuid">The modularization GUID.</param> | ||
| 485 | /// <param name="id">The id to demodularize.</param> | ||
| 486 | /// <returns>The demodularized id.</returns> | ||
| 487 | public static string Demodularize(OutputType outputType, string modularizationGuid, string id) | ||
| 488 | { | ||
| 489 | if (OutputType.Module == outputType && id.EndsWith(String.Concat(".", modularizationGuid), StringComparison.Ordinal)) | ||
| 490 | { | ||
| 491 | id = id.Substring(0, id.Length - 37); | ||
| 492 | } | ||
| 493 | |||
| 494 | return id; | ||
| 495 | } | ||
| 496 | |||
| 497 | /// <summary> | ||
| 498 | /// Get the source/target and short/long file names from an MSI Filename column. | ||
| 499 | /// </summary> | ||
| 500 | /// <param name="value">The Filename value.</param> | ||
| 501 | /// <returns>An array of strings of length 4. The contents are: short target, long target, short source, and long source.</returns> | ||
| 502 | /// <remarks> | ||
| 503 | /// If any particular file name part is not parsed, its set to null in the appropriate location of the returned array of strings. | ||
| 504 | /// However, the returned array will always be of length 4. | ||
| 505 | /// </remarks> | ||
| 506 | public static string[] GetNames(string value) | ||
| 507 | { | ||
| 508 | string[] names = new string[4]; | ||
| 509 | int targetSeparator = value.IndexOf(":", StringComparison.Ordinal); | ||
| 510 | |||
| 511 | // split source and target | ||
| 512 | string sourceName = null; | ||
| 513 | string targetName = value; | ||
| 514 | if (0 <= targetSeparator) | ||
| 515 | { | ||
| 516 | sourceName = value.Substring(targetSeparator + 1); | ||
| 517 | targetName = value.Substring(0, targetSeparator); | ||
| 518 | } | ||
| 519 | |||
| 520 | // split the source short and long names | ||
| 521 | string sourceLongName = null; | ||
| 522 | if (null != sourceName) | ||
| 523 | { | ||
| 524 | int sourceLongNameSeparator = sourceName.IndexOf("|", StringComparison.Ordinal); | ||
| 525 | if (0 <= sourceLongNameSeparator) | ||
| 526 | { | ||
| 527 | sourceLongName = sourceName.Substring(sourceLongNameSeparator + 1); | ||
| 528 | sourceName = sourceName.Substring(0, sourceLongNameSeparator); | ||
| 529 | } | ||
| 530 | } | ||
| 531 | |||
| 532 | // split the target short and long names | ||
| 533 | int targetLongNameSeparator = targetName.IndexOf("|", StringComparison.Ordinal); | ||
| 534 | string targetLongName = null; | ||
| 535 | if (0 <= targetLongNameSeparator) | ||
| 536 | { | ||
| 537 | targetLongName = targetName.Substring(targetLongNameSeparator + 1); | ||
| 538 | targetName = targetName.Substring(0, targetLongNameSeparator); | ||
| 539 | } | ||
| 540 | |||
| 541 | // remove the long source name when its identical to the long source name | ||
| 542 | if (null != sourceName && sourceName == sourceLongName) | ||
| 543 | { | ||
| 544 | sourceLongName = null; | ||
| 545 | } | ||
| 546 | |||
| 547 | // remove the long target name when its identical to the long target name | ||
| 548 | if (null != targetName && targetName == targetLongName) | ||
| 549 | { | ||
| 550 | targetLongName = null; | ||
| 551 | } | ||
| 552 | |||
| 553 | // remove the source names when they are identical to the target names | ||
| 554 | if (sourceName == targetName && sourceLongName == targetLongName) | ||
| 555 | { | ||
| 556 | sourceName = null; | ||
| 557 | sourceLongName = null; | ||
| 558 | } | ||
| 559 | |||
| 560 | // target name(s) | ||
| 561 | if ("." != targetName) | ||
| 562 | { | ||
| 563 | names[0] = targetName; | ||
| 564 | } | ||
| 565 | |||
| 566 | if (null != targetLongName && "." != targetLongName) | ||
| 567 | { | ||
| 568 | names[1] = targetLongName; | ||
| 569 | } | ||
| 570 | |||
| 571 | // source name(s) | ||
| 572 | if (null != sourceName) | ||
| 573 | { | ||
| 574 | names[2] = sourceName; | ||
| 575 | } | ||
| 576 | |||
| 577 | if (null != sourceLongName && "." != sourceLongName) | ||
| 578 | { | ||
| 579 | names[3] = sourceLongName; | ||
| 580 | } | ||
| 581 | |||
| 582 | return names; | ||
| 583 | } | ||
| 584 | |||
| 585 | /// <summary> | ||
| 586 | /// Get a source/target and short/long file name from an MSI Filename column. | ||
| 587 | /// </summary> | ||
| 588 | /// <param name="value">The Filename value.</param> | ||
| 589 | /// <param name="source">true to get a source name; false to get a target name</param> | ||
| 590 | /// <param name="longName">true to get a long name; false to get a short name</param> | ||
| 591 | /// <returns>The name.</returns> | ||
| 592 | public static string GetName(string value, bool source, bool longName) | ||
| 593 | { | ||
| 594 | string[] names = GetNames(value); | ||
| 595 | |||
| 596 | if (source) | ||
| 597 | { | ||
| 598 | if (longName && null != names[3]) | ||
| 599 | { | ||
| 600 | return names[3]; | ||
| 601 | } | ||
| 602 | else if (null != names[2]) | ||
| 603 | { | ||
| 604 | return names[2]; | ||
| 605 | } | ||
| 606 | } | ||
| 607 | |||
| 608 | if (longName && null != names[1]) | ||
| 609 | { | ||
| 610 | return names[1]; | ||
| 611 | } | ||
| 612 | else | ||
| 613 | { | ||
| 614 | return names[0]; | ||
| 615 | } | ||
| 616 | } | ||
| 617 | |||
| 618 | /// <summary> | ||
| 481 | /// Get an attribute value. | 619 | /// Get an attribute value. |
| 482 | /// </summary> | 620 | /// </summary> |
| 483 | /// <param name="sourceLineNumbers">Source line information about the owner element.</param> | 621 | /// <param name="sourceLineNumbers">Source line information about the owner element.</param> |
