diff options
Diffstat (limited to 'src/WixToolset.Data/IntermediateFieldExtensions.cs')
| -rw-r--r-- | src/WixToolset.Data/IntermediateFieldExtensions.cs | 370 |
1 files changed, 211 insertions, 159 deletions
diff --git a/src/WixToolset.Data/IntermediateFieldExtensions.cs b/src/WixToolset.Data/IntermediateFieldExtensions.cs index a73a6552..5d2ddf06 100644 --- a/src/WixToolset.Data/IntermediateFieldExtensions.cs +++ b/src/WixToolset.Data/IntermediateFieldExtensions.cs | |||
| @@ -20,20 +20,21 @@ namespace WixToolset.Data | |||
| 20 | 20 | ||
| 21 | switch (field.Definition.Type) | 21 | switch (field.Definition.Type) |
| 22 | { | 22 | { |
| 23 | case IntermediateFieldType.Bool: | 23 | case IntermediateFieldType.Bool: |
| 24 | return field.Value.AsBool(); | 24 | return field.Value.AsBool(); |
| 25 | 25 | ||
| 26 | case IntermediateFieldType.Number: | 26 | case IntermediateFieldType.LargeNumber: |
| 27 | return field.Value.AsNumber() != 0; | 27 | case IntermediateFieldType.Number: |
| 28 | return field.Value.AsLargeNumber() != 0; | ||
| 28 | 29 | ||
| 29 | case IntermediateFieldType.String: | 30 | case IntermediateFieldType.String: |
| 30 | return !String.IsNullOrEmpty(field.Value.AsString()); | 31 | return !String.IsNullOrEmpty(field.Value.AsString()); |
| 31 | 32 | ||
| 32 | case IntermediateFieldType.Path: | 33 | case IntermediateFieldType.Path: |
| 33 | return !String.IsNullOrEmpty(field.Value.AsPath()?.Path); | 34 | return !String.IsNullOrEmpty(field.Value.AsPath()?.Path); |
| 34 | 35 | ||
| 35 | default: | 36 | default: |
| 36 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to boolean"); | 37 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to boolean"); |
| 37 | } | 38 | } |
| 38 | } | 39 | } |
| 39 | 40 | ||
| @@ -46,20 +47,68 @@ namespace WixToolset.Data | |||
| 46 | 47 | ||
| 47 | switch (field.Definition.Type) | 48 | switch (field.Definition.Type) |
| 48 | { | 49 | { |
| 49 | case IntermediateFieldType.Bool: | 50 | case IntermediateFieldType.Bool: |
| 50 | return field.Value.AsBool(); | 51 | return field.Value.AsBool(); |
| 51 | 52 | ||
| 52 | case IntermediateFieldType.Number: | 53 | case IntermediateFieldType.LargeNumber: |
| 53 | return field.Value.AsNumber() != 0; | 54 | case IntermediateFieldType.Number: |
| 55 | return field.Value.AsLargeNumber() != 0; | ||
| 54 | 56 | ||
| 55 | case IntermediateFieldType.String: | 57 | case IntermediateFieldType.String: |
| 56 | return !String.IsNullOrEmpty(field.Value.AsString()); | 58 | return !String.IsNullOrEmpty(field.Value.AsString()); |
| 57 | 59 | ||
| 58 | default: | 60 | default: |
| 59 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to boolean"); | 61 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to boolean"); |
| 60 | } | 62 | } |
| 61 | } | 63 | } |
| 62 | 64 | ||
| 65 | public static long AsLargeNumber(this IntermediateField field) | ||
| 66 | { | ||
| 67 | if (field == null || field.Value == null || field.Value.Data == null) | ||
| 68 | { | ||
| 69 | return 0; | ||
| 70 | } | ||
| 71 | |||
| 72 | switch (field.Definition.Type) | ||
| 73 | { | ||
| 74 | case IntermediateFieldType.Bool: | ||
| 75 | return field.Value.AsBool() ? 1 : 0; | ||
| 76 | |||
| 77 | case IntermediateFieldType.LargeNumber: | ||
| 78 | case IntermediateFieldType.Number: | ||
| 79 | return field.Value.AsLargeNumber(); | ||
| 80 | |||
| 81 | case IntermediateFieldType.String: | ||
| 82 | return Convert.ToInt64(field.Value.AsString()); | ||
| 83 | |||
| 84 | default: | ||
| 85 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to large number"); | ||
| 86 | } | ||
| 87 | } | ||
| 88 | |||
| 89 | public static long? AsNullableLargeNumber(this IntermediateField field) | ||
| 90 | { | ||
| 91 | if (field == null || field.Value == null || field.Value.Data == null) | ||
| 92 | { | ||
| 93 | return null; | ||
| 94 | } | ||
| 95 | |||
| 96 | switch (field.Definition.Type) | ||
| 97 | { | ||
| 98 | case IntermediateFieldType.Bool: | ||
| 99 | return field.Value.AsBool() ? 1 : 0; | ||
| 100 | |||
| 101 | case IntermediateFieldType.LargeNumber: | ||
| 102 | case IntermediateFieldType.Number: | ||
| 103 | return field.Value.AsLargeNumber(); | ||
| 104 | |||
| 105 | case IntermediateFieldType.String: | ||
| 106 | return Convert.ToInt64(field.Value.AsString()); | ||
| 107 | |||
| 108 | default: | ||
| 109 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to large number"); | ||
| 110 | } | ||
| 111 | } | ||
| 63 | 112 | ||
| 64 | public static int AsNumber(this IntermediateField field) | 113 | public static int AsNumber(this IntermediateField field) |
| 65 | { | 114 | { |
| @@ -70,17 +119,18 @@ namespace WixToolset.Data | |||
| 70 | 119 | ||
| 71 | switch (field.Definition.Type) | 120 | switch (field.Definition.Type) |
| 72 | { | 121 | { |
| 73 | case IntermediateFieldType.Bool: | 122 | case IntermediateFieldType.Bool: |
| 74 | return field.Value.AsBool() ? 1 : 0; | 123 | return field.Value.AsBool() ? 1 : 0; |
| 75 | 124 | ||
| 76 | case IntermediateFieldType.Number: | 125 | case IntermediateFieldType.LargeNumber: |
| 77 | return field.Value.AsNumber(); | 126 | case IntermediateFieldType.Number: |
| 127 | return field.Value.AsNumber(); | ||
| 78 | 128 | ||
| 79 | case IntermediateFieldType.String: | 129 | case IntermediateFieldType.String: |
| 80 | return Convert.ToInt32(field.Value.AsString()); | 130 | return Convert.ToInt32(field.Value.AsString()); |
| 81 | 131 | ||
| 82 | default: | 132 | default: |
| 83 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to number"); | 133 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to number"); |
| 84 | } | 134 | } |
| 85 | } | 135 | } |
| 86 | 136 | ||
| @@ -93,17 +143,18 @@ namespace WixToolset.Data | |||
| 93 | 143 | ||
| 94 | switch (field.Definition.Type) | 144 | switch (field.Definition.Type) |
| 95 | { | 145 | { |
| 96 | case IntermediateFieldType.Bool: | 146 | case IntermediateFieldType.Bool: |
| 97 | return field.Value.AsBool() ? 1 : 0; | 147 | return field.Value.AsBool() ? 1 : 0; |
| 98 | 148 | ||
| 99 | case IntermediateFieldType.Number: | 149 | case IntermediateFieldType.LargeNumber: |
| 100 | return field.Value.AsNumber(); | 150 | case IntermediateFieldType.Number: |
| 151 | return field.Value.AsNumber(); | ||
| 101 | 152 | ||
| 102 | case IntermediateFieldType.String: | 153 | case IntermediateFieldType.String: |
| 103 | return Convert.ToInt32(field.Value.AsString()); | 154 | return Convert.ToInt32(field.Value.AsString()); |
| 104 | 155 | ||
| 105 | default: | 156 | default: |
| 106 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to number"); | 157 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to number"); |
| 107 | } | 158 | } |
| 108 | } | 159 | } |
| 109 | 160 | ||
| @@ -116,14 +167,14 @@ namespace WixToolset.Data | |||
| 116 | 167 | ||
| 117 | switch (field.Definition.Type) | 168 | switch (field.Definition.Type) |
| 118 | { | 169 | { |
| 119 | case IntermediateFieldType.String: | 170 | case IntermediateFieldType.String: |
| 120 | return new IntermediateFieldPathValue { Path = field.Value.AsString() }; | 171 | return new IntermediateFieldPathValue { Path = field.Value.AsString() }; |
| 121 | 172 | ||
| 122 | case IntermediateFieldType.Path: | 173 | case IntermediateFieldType.Path: |
| 123 | return field.Value.AsPath(); | 174 | return field.Value.AsPath(); |
| 124 | 175 | ||
| 125 | default: | 176 | default: |
| 126 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to string"); | 177 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to string"); |
| 127 | } | 178 | } |
| 128 | } | 179 | } |
| 129 | 180 | ||
| @@ -136,20 +187,21 @@ namespace WixToolset.Data | |||
| 136 | 187 | ||
| 137 | switch (field.Definition.Type) | 188 | switch (field.Definition.Type) |
| 138 | { | 189 | { |
| 139 | case IntermediateFieldType.Bool: | 190 | case IntermediateFieldType.Bool: |
| 140 | return field.Value.AsBool() ? "true" : "false"; | 191 | return field.Value.AsBool() ? "true" : "false"; |
| 141 | 192 | ||
| 142 | case IntermediateFieldType.Number: | 193 | case IntermediateFieldType.LargeNumber: |
| 143 | return field.Value.AsNumber().ToString(); | 194 | case IntermediateFieldType.Number: |
| 195 | return field.Value.AsLargeNumber().ToString(); | ||
| 144 | 196 | ||
| 145 | case IntermediateFieldType.String: | 197 | case IntermediateFieldType.String: |
| 146 | return field.Value.AsString(); | 198 | return field.Value.AsString(); |
| 147 | 199 | ||
| 148 | case IntermediateFieldType.Path: | 200 | case IntermediateFieldType.Path: |
| 149 | return field.Value.AsPath()?.Path; | 201 | return field.Value.AsPath()?.Path; |
| 150 | 202 | ||
| 151 | default: | 203 | default: |
| 152 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to string"); | 204 | throw new InvalidCastException($"Cannot convert field {field.Name} with type {field.Type} to string"); |
| 153 | } | 205 | } |
| 154 | } | 206 | } |
| 155 | 207 | ||
| @@ -169,27 +221,27 @@ namespace WixToolset.Data | |||
| 169 | 221 | ||
| 170 | switch (field.Type) | 222 | switch (field.Type) |
| 171 | { | 223 | { |
| 172 | case IntermediateFieldType.Bool: | 224 | case IntermediateFieldType.Bool: |
| 173 | data = value; | 225 | data = value; |
| 174 | break; | 226 | break; |
| 175 | 227 | ||
| 176 | case IntermediateFieldType.LargeNumber: | 228 | case IntermediateFieldType.LargeNumber: |
| 177 | data = value ? (long)1 : (long)0; | 229 | data = value ? (long)1 : (long)0; |
| 178 | break; | 230 | break; |
| 179 | 231 | ||
| 180 | case IntermediateFieldType.Number: | 232 | case IntermediateFieldType.Number: |
| 181 | data = value ? 1 : 0; | 233 | data = value ? 1 : 0; |
| 182 | break; | 234 | break; |
| 183 | 235 | ||
| 184 | case IntermediateFieldType.Path: | 236 | case IntermediateFieldType.Path: |
| 185 | throw new ArgumentException($"Cannot convert bool '{value}' to a 'Path' field type.", nameof(value)); | 237 | throw new ArgumentException($"Cannot convert bool '{value}' to a 'Path' field type.", nameof(value)); |
| 186 | 238 | ||
| 187 | case IntermediateFieldType.String: | 239 | case IntermediateFieldType.String: |
| 188 | data = value ? "true" : "false"; | 240 | data = value ? "true" : "false"; |
| 189 | break; | 241 | break; |
| 190 | 242 | ||
| 191 | default: | 243 | default: |
| 192 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); | 244 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); |
| 193 | }; | 245 | }; |
| 194 | 246 | ||
| 195 | return AssignFieldValue(field, data); | 247 | return AssignFieldValue(field, data); |
| @@ -216,27 +268,27 @@ namespace WixToolset.Data | |||
| 216 | 268 | ||
| 217 | switch (field.Type) | 269 | switch (field.Type) |
| 218 | { | 270 | { |
| 219 | case IntermediateFieldType.Bool: | 271 | case IntermediateFieldType.Bool: |
| 220 | data = (value != 0); | 272 | data = (value != 0); |
| 221 | break; | 273 | break; |
| 222 | 274 | ||
| 223 | case IntermediateFieldType.LargeNumber: | 275 | case IntermediateFieldType.LargeNumber: |
| 224 | data = value; | 276 | data = value; |
| 225 | break; | 277 | break; |
| 226 | 278 | ||
| 227 | case IntermediateFieldType.Number: | 279 | case IntermediateFieldType.Number: |
| 228 | data = (int)value; | 280 | data = (int)value; |
| 229 | break; | 281 | break; |
| 230 | 282 | ||
| 231 | case IntermediateFieldType.Path: | 283 | case IntermediateFieldType.Path: |
| 232 | throw new ArgumentException($"Cannot convert large number '{value}' to a 'Path' field type.", nameof(value)); | 284 | throw new ArgumentException($"Cannot convert large number '{value}' to a 'Path' field type.", nameof(value)); |
| 233 | 285 | ||
| 234 | case IntermediateFieldType.String: | 286 | case IntermediateFieldType.String: |
| 235 | data = value.ToString(); | 287 | data = value.ToString(); |
| 236 | break; | 288 | break; |
| 237 | 289 | ||
| 238 | default: | 290 | default: |
| 239 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); | 291 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); |
| 240 | }; | 292 | }; |
| 241 | 293 | ||
| 242 | return AssignFieldValue(field, data); | 294 | return AssignFieldValue(field, data); |
| @@ -263,27 +315,27 @@ namespace WixToolset.Data | |||
| 263 | 315 | ||
| 264 | switch (field.Type) | 316 | switch (field.Type) |
| 265 | { | 317 | { |
| 266 | case IntermediateFieldType.Bool: | 318 | case IntermediateFieldType.Bool: |
| 267 | data = (value != 0); | 319 | data = (value != 0); |
| 268 | break; | 320 | break; |
| 269 | 321 | ||
| 270 | case IntermediateFieldType.LargeNumber: | 322 | case IntermediateFieldType.LargeNumber: |
| 271 | data = (long)value; | 323 | data = (long)value; |
| 272 | break; | 324 | break; |
| 273 | 325 | ||
| 274 | case IntermediateFieldType.Number: | 326 | case IntermediateFieldType.Number: |
| 275 | data = value; | 327 | data = value; |
| 276 | break; | 328 | break; |
| 277 | 329 | ||
| 278 | case IntermediateFieldType.Path: | 330 | case IntermediateFieldType.Path: |
| 279 | throw new ArgumentException($"Cannot convert number '{value}' to a 'Path' field type.", nameof(value)); | 331 | throw new ArgumentException($"Cannot convert number '{value}' to a 'Path' field type.", nameof(value)); |
| 280 | 332 | ||
| 281 | case IntermediateFieldType.String: | 333 | case IntermediateFieldType.String: |
| 282 | data = value.ToString(); | 334 | data = value.ToString(); |
| 283 | break; | 335 | break; |
| 284 | 336 | ||
| 285 | default: | 337 | default: |
| 286 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); | 338 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); |
| 287 | }; | 339 | }; |
| 288 | 340 | ||
| 289 | return AssignFieldValue(field, data); | 341 | return AssignFieldValue(field, data); |
| @@ -315,25 +367,25 @@ namespace WixToolset.Data | |||
| 315 | { | 367 | { |
| 316 | switch (field.Type) | 368 | switch (field.Type) |
| 317 | { | 369 | { |
| 318 | case IntermediateFieldType.Bool: | 370 | case IntermediateFieldType.Bool: |
| 319 | throw new ArgumentException($"Cannot convert path '{value.Path}' to a 'bool' field type.", nameof(value)); | 371 | throw new ArgumentException($"Cannot convert path '{value.Path}' to a 'bool' field type.", nameof(value)); |
| 320 | 372 | ||
| 321 | case IntermediateFieldType.LargeNumber: | 373 | case IntermediateFieldType.LargeNumber: |
| 322 | throw new ArgumentException($"Cannot convert path '{value.Path}' to a 'large number' field type.", nameof(value)); | 374 | throw new ArgumentException($"Cannot convert path '{value.Path}' to a 'large number' field type.", nameof(value)); |
| 323 | 375 | ||
| 324 | case IntermediateFieldType.Number: | 376 | case IntermediateFieldType.Number: |
| 325 | throw new ArgumentException($"Cannot convert path '{value.Path}' to a 'number' field type.", nameof(value)); | 377 | throw new ArgumentException($"Cannot convert path '{value.Path}' to a 'number' field type.", nameof(value)); |
| 326 | 378 | ||
| 327 | case IntermediateFieldType.Path: | 379 | case IntermediateFieldType.Path: |
| 328 | data = value; | 380 | data = value; |
| 329 | break; | 381 | break; |
| 330 | 382 | ||
| 331 | case IntermediateFieldType.String: | 383 | case IntermediateFieldType.String: |
| 332 | data = value.Path; | 384 | data = value.Path; |
| 333 | break; | 385 | break; |
| 334 | 386 | ||
| 335 | default: | 387 | default: |
| 336 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); | 388 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); |
| 337 | }; | 389 | }; |
| 338 | } | 390 | } |
| 339 | 391 | ||
| @@ -356,53 +408,53 @@ namespace WixToolset.Data | |||
| 356 | { | 408 | { |
| 357 | switch (field.Type) | 409 | switch (field.Type) |
| 358 | { | 410 | { |
| 359 | case IntermediateFieldType.Bool: | 411 | case IntermediateFieldType.Bool: |
| 360 | if (value.Equals("yes", StringComparison.OrdinalIgnoreCase) || value.Equals("true", StringComparison.OrdinalIgnoreCase)) | 412 | if (value.Equals("yes", StringComparison.OrdinalIgnoreCase) || value.Equals("true", StringComparison.OrdinalIgnoreCase)) |
| 361 | { | 413 | { |
| 362 | data = true; | 414 | data = true; |
| 363 | } | 415 | } |
| 364 | else if (value.Equals("no", StringComparison.OrdinalIgnoreCase) || value.Equals("false", StringComparison.OrdinalIgnoreCase)) | 416 | else if (value.Equals("no", StringComparison.OrdinalIgnoreCase) || value.Equals("false", StringComparison.OrdinalIgnoreCase)) |
| 365 | { | 417 | { |
| 366 | data = false; | 418 | data = false; |
| 367 | } | 419 | } |
| 368 | else | 420 | else |
| 369 | { | 421 | { |
| 370 | throw new ArgumentException($"Cannot convert string '{value}' to a 'bool' field type.", nameof(value)); | 422 | throw new ArgumentException($"Cannot convert string '{value}' to a 'bool' field type.", nameof(value)); |
| 371 | } | 423 | } |
| 372 | break; | 424 | break; |
| 373 | 425 | ||
| 374 | case IntermediateFieldType.LargeNumber: | 426 | case IntermediateFieldType.LargeNumber: |
| 375 | if (Int64.TryParse(value, out var largeNumber)) | 427 | if (Int64.TryParse(value, out var largeNumber)) |
| 376 | { | 428 | { |
| 377 | data = largeNumber; | 429 | data = largeNumber; |
| 378 | } | 430 | } |
| 379 | else | 431 | else |
| 380 | { | 432 | { |
| 381 | throw new ArgumentException($"Cannot convert string '{value}' to a 'large number' field type.", nameof(value)); | 433 | throw new ArgumentException($"Cannot convert string '{value}' to a 'large number' field type.", nameof(value)); |
| 382 | } | 434 | } |
| 383 | break; | 435 | break; |
| 384 | 436 | ||
| 385 | case IntermediateFieldType.Number: | 437 | case IntermediateFieldType.Number: |
| 386 | if (Int32.TryParse(value, out var number)) | 438 | if (Int32.TryParse(value, out var number)) |
| 387 | { | 439 | { |
| 388 | data = number; | 440 | data = number; |
| 389 | } | 441 | } |
| 390 | else | 442 | else |
| 391 | { | 443 | { |
| 392 | throw new ArgumentException($"Cannot convert string '{value}' to a 'number' field type.", nameof(value)); | 444 | throw new ArgumentException($"Cannot convert string '{value}' to a 'number' field type.", nameof(value)); |
| 393 | } | 445 | } |
| 394 | break; | 446 | break; |
| 395 | 447 | ||
| 396 | case IntermediateFieldType.Path: | 448 | case IntermediateFieldType.Path: |
| 397 | data = new IntermediateFieldPathValue { Path = value }; | 449 | data = new IntermediateFieldPathValue { Path = value }; |
| 398 | break; | 450 | break; |
| 399 | 451 | ||
| 400 | case IntermediateFieldType.String: | 452 | case IntermediateFieldType.String: |
| 401 | data = value; | 453 | data = value; |
| 402 | break; | 454 | break; |
| 403 | 455 | ||
| 404 | default: | 456 | default: |
| 405 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); | 457 | throw new ArgumentOutOfRangeException(nameof(value), $"Unknown intermediate field type: {value.GetType()}"); |
| 406 | }; | 458 | }; |
| 407 | } | 459 | } |
| 408 | 460 | ||
