aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Iis/wixext/IIsDecompiler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/Iis/wixext/IIsDecompiler.cs')
-rw-r--r--src/ext/Iis/wixext/IIsDecompiler.cs1549
1 files changed, 1549 insertions, 0 deletions
diff --git a/src/ext/Iis/wixext/IIsDecompiler.cs b/src/ext/Iis/wixext/IIsDecompiler.cs
new file mode 100644
index 00000000..17e15348
--- /dev/null
+++ b/src/ext/Iis/wixext/IIsDecompiler.cs
@@ -0,0 +1,1549 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Iis
4{
5#if TODO_CONSIDER_DECOMPILER
6 using System;
7 using System.Collections;
8 using System.Globalization;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11 using IIs = WixToolset.Extensions.Serialize.IIs;
12 using Wix = WixToolset.Data.Serialize;
13
14 /// <summary>
15 /// The decompiler for the WiX Toolset Internet Information Services Extension.
16 /// </summary>
17 public sealed class IIsDecompiler : DecompilerExtension
18 {
19 /// <summary>
20 /// Creates a decompiler for IIs Extension.
21 /// </summary>
22 public IIsDecompiler()
23 {
24 this.TableDefinitions = IIsExtensionData.GetExtensionTableDefinitions();
25 }
26
27 /// <summary>
28 /// Get the extensions library to be removed.
29 /// </summary>
30 /// <param name="tableDefinitions">Table definitions for library.</param>
31 /// <returns>Library to remove from decompiled output.</returns>
32 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
33 {
34 return IIsExtensionData.GetExtensionLibrary(tableDefinitions);
35 }
36
37 /// <summary>
38 /// Decompiles an extension table.
39 /// </summary>
40 /// <param name="table">The table to decompile.</param>
41 public override void DecompileTable(Table table)
42 {
43 switch (table.Name)
44 {
45 case "Certificate":
46 this.DecompileCertificateTable(table);
47 break;
48 case "CertificateHash":
49 // There is nothing to do for this table, it contains no authored data
50 // to be decompiled.
51 break;
52 case "IIsAppPool":
53 this.DecompileIIsAppPoolTable(table);
54 break;
55 case "IIsFilter":
56 this.DecompileIIsFilterTable(table);
57 break;
58 case "IIsProperty":
59 this.DecompileIIsPropertyTable(table);
60 break;
61 case "IIsHttpHeader":
62 this.DecompileIIsHttpHeaderTable(table);
63 break;
64 case "IIsMimeMap":
65 this.DecompileIIsMimeMapTable(table);
66 break;
67 case "IIsWebAddress":
68 this.DecompileIIsWebAddressTable(table);
69 break;
70 case "IIsWebApplication":
71 this.DecompileIIsWebApplicationTable(table);
72 break;
73 case "IIsWebDirProperties":
74 this.DecompileIIsWebDirPropertiesTable(table);
75 break;
76 case "IIsWebError":
77 this.DecompileIIsWebErrorTable(table);
78 break;
79 case "IIsWebLog":
80 this.DecompileIIsWebLogTable(table);
81 break;
82 case "IIsWebServiceExtension":
83 this.DecompileIIsWebServiceExtensionTable(table);
84 break;
85 case "IIsWebSite":
86 this.DecompileIIsWebSiteTable(table);
87 break;
88 case "IIsWebVirtualDir":
89 this.DecompileIIsWebVirtualDirTable(table);
90 break;
91 case "IIsWebSiteCertificates":
92 this.DecompileIIsWebSiteCertificatesTable(table);
93 break;
94 default:
95 base.DecompileTable(table);
96 break;
97 }
98 }
99
100 /// <summary>
101 /// Finalize decompilation.
102 /// </summary>
103 /// <param name="tables">The collection of all tables.</param>
104 public override void Finish(TableIndexedCollection tables)
105 {
106 this.FinalizeIIsMimeMapTable(tables);
107 this.FinalizeIIsHttpHeaderTable(tables);
108 this.FinalizeIIsWebApplicationTable(tables);
109 this.FinalizeIIsWebErrorTable(tables);
110 this.FinalizeIIsWebVirtualDirTable(tables);
111 this.FinalizeIIsWebSiteCertificatesTable(tables);
112 this.FinalizeWebAddressTable(tables);
113 }
114
115 /// <summary>
116 /// Decompile the Certificate table.
117 /// </summary>
118 /// <param name="table">The table to decompile.</param>
119 private void DecompileCertificateTable(Table table)
120 {
121 foreach (Row row in table.Rows)
122 {
123 IIs.Certificate certificate = new IIs.Certificate();
124
125 certificate.Id = (string)row[0];
126 certificate.Name = (string)row[2];
127
128 switch ((int)row[3])
129 {
130 case 1:
131 certificate.StoreLocation = IIs.Certificate.StoreLocationType.currentUser;
132 break;
133 case 2:
134 certificate.StoreLocation = IIs.Certificate.StoreLocationType.localMachine;
135 break;
136 default:
137 // TODO: warn
138 break;
139 }
140
141 switch ((string)row[4])
142 {
143 case "CA":
144 certificate.StoreName = IIs.Certificate.StoreNameType.ca;
145 break;
146 case "MY":
147 certificate.StoreName = IIs.Certificate.StoreNameType.my;
148 break;
149 case "REQUEST":
150 certificate.StoreName = IIs.Certificate.StoreNameType.request;
151 break;
152 case "Root":
153 certificate.StoreName = IIs.Certificate.StoreNameType.root;
154 break;
155 case "AddressBook":
156 certificate.StoreName = IIs.Certificate.StoreNameType.otherPeople;
157 break;
158 case "TrustedPeople":
159 certificate.StoreName = IIs.Certificate.StoreNameType.trustedPeople;
160 break;
161 case "TrustedPublisher":
162 certificate.StoreName = IIs.Certificate.StoreNameType.trustedPublisher;
163 break;
164 default:
165 // TODO: warn
166 break;
167 }
168
169 int attribute = (int)row[5];
170
171 if (0x1 == (attribute & 0x1))
172 {
173 certificate.Request = IIs.YesNoType.yes;
174 }
175
176 if (0x2 == (attribute & 0x2))
177 {
178 if (null != row[6])
179 {
180 certificate.BinaryKey = (string)row[6];
181 }
182 else
183 {
184 // TODO: warn about expected value in row 5
185 }
186 }
187 else if (null != row[7])
188 {
189 certificate.CertificatePath = (string)row[7];
190 }
191
192 if (0x4 == (attribute & 0x4))
193 {
194 certificate.Overwrite = IIs.YesNoType.yes;
195 }
196
197 if (null != row[8])
198 {
199 certificate.PFXPassword = (string)row[8];
200 }
201
202 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
203 if (null != component)
204 {
205 component.AddChild(certificate);
206 }
207 else
208 {
209 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
210 }
211 }
212 }
213
214 /// <summary>
215 /// Decompile the IIsAppPool table.
216 /// </summary>
217 /// <param name="table">The table to decompile.</param>
218 private void DecompileIIsAppPoolTable(Table table)
219 {
220 foreach (Row row in table.Rows)
221 {
222 IIs.WebAppPool webAppPool = new IIs.WebAppPool();
223
224 webAppPool.Id = (string)row[0];
225
226 webAppPool.Name = (string)row[1];
227
228 switch ((int)row[3] & 0x1F)
229 {
230 case 1:
231 webAppPool.Identity = IIs.WebAppPool.IdentityType.networkService;
232 break;
233 case 2:
234 webAppPool.Identity = IIs.WebAppPool.IdentityType.localService;
235 break;
236 case 4:
237 webAppPool.Identity = IIs.WebAppPool.IdentityType.localSystem;
238 break;
239 case 8:
240 webAppPool.Identity = IIs.WebAppPool.IdentityType.other;
241 break;
242 case 0x10:
243 webAppPool.Identity = IIs.WebAppPool.IdentityType.applicationPoolIdentity;
244 break;
245 default:
246 // TODO: warn
247 break;
248 }
249
250 if (null != row[4])
251 {
252 webAppPool.User = (string)row[4];
253 }
254
255 if (null != row[5])
256 {
257 webAppPool.RecycleMinutes = (int)row[5];
258 }
259
260 if (null != row[6])
261 {
262 webAppPool.RecycleRequests = (int)row[6];
263 }
264
265 if (null != row[7])
266 {
267 string[] recycleTimeValues = ((string)row[7]).Split(',');
268
269 foreach (string recycleTimeValue in recycleTimeValues)
270 {
271 IIs.RecycleTime recycleTime = new IIs.RecycleTime();
272
273 recycleTime.Value = recycleTimeValue;
274
275 webAppPool.AddChild(recycleTime);
276 }
277 }
278
279 if (null != row[8])
280 {
281 webAppPool.IdleTimeout = (int)row[8];
282 }
283
284 if (null != row[9])
285 {
286 webAppPool.QueueLimit = (int)row[9];
287 }
288
289 if (null != row[10])
290 {
291 string[] cpuMon = ((string)row[10]).Split(',');
292
293 if (0 < cpuMon.Length && "0" != cpuMon[0])
294 {
295 webAppPool.MaxCpuUsage = Convert.ToInt32(cpuMon[0], CultureInfo.InvariantCulture);
296 }
297
298 if (1 < cpuMon.Length)
299 {
300 webAppPool.RefreshCpu = Convert.ToInt32(cpuMon[1], CultureInfo.InvariantCulture);
301 }
302
303 if (2 < cpuMon.Length)
304 {
305 switch (Convert.ToInt32(cpuMon[2], CultureInfo.InvariantCulture))
306 {
307 case 0:
308 webAppPool.CpuAction = IIs.WebAppPool.CpuActionType.none;
309 break;
310 case 1:
311 webAppPool.CpuAction = IIs.WebAppPool.CpuActionType.shutdown;
312 break;
313 default:
314 // TODO: warn
315 break;
316 }
317 }
318
319 if (3 < cpuMon.Length)
320 {
321 // TODO: warn
322 }
323 }
324
325 if (null != row[11])
326 {
327 webAppPool.MaxWorkerProcesses = (int)row[11];
328 }
329
330 if (null != row[12])
331 {
332 webAppPool.VirtualMemory = (int)row[12];
333 }
334
335 if (null != row[13])
336 {
337 webAppPool.PrivateMemory = (int)row[13];
338 }
339
340 if (null != row[14])
341 {
342 webAppPool.ManagedRuntimeVersion = (string)row[14];
343 }
344
345 if (null != row[15])
346 {
347 webAppPool.ManagedPipelineMode = (string)row[15];
348 }
349
350 if (null != row[2])
351 {
352 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
353
354 if (null != component)
355 {
356 component.AddChild(webAppPool);
357 }
358 else
359 {
360 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
361 }
362 }
363 else
364 {
365 this.Core.RootElement.AddChild(webAppPool);
366 }
367 }
368 }
369
370 /// <summary>
371 /// Decompile the IIsProperty table.
372 /// </summary>
373 /// <param name="table">The table to decompile.</param>
374 private void DecompileIIsPropertyTable(Table table)
375 {
376 foreach (Row row in table.Rows)
377 {
378 IIs.WebProperty webProperty = new IIs.WebProperty();
379
380 switch ((string)row[0])
381 {
382 case "ETagChangeNumber":
383 webProperty.Id = IIs.WebProperty.IdType.ETagChangeNumber;
384 break;
385 case "IIs5IsolationMode":
386 webProperty.Id = IIs.WebProperty.IdType.IIs5IsolationMode;
387 break;
388 case "LogInUTF8":
389 webProperty.Id = IIs.WebProperty.IdType.LogInUTF8;
390 break;
391 case "MaxGlobalBandwidth":
392 webProperty.Id = IIs.WebProperty.IdType.MaxGlobalBandwidth;
393 break;
394 }
395
396 if (0 != (int)row[2])
397 {
398 // TODO: warn about value in unused column
399 }
400
401 if (null != row[3])
402 {
403 webProperty.Value = (string)row[3];
404 }
405
406 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
407 if (null != component)
408 {
409 component.AddChild(webProperty);
410 }
411 else
412 {
413 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
414 }
415 }
416 }
417
418 /// <summary>
419 /// Decompile the IIsHttpHeader table.
420 /// </summary>
421 /// <param name="table">The table to decompile.</param>
422 private void DecompileIIsHttpHeaderTable(Table table)
423 {
424 foreach (Row row in table.Rows)
425 {
426 IIs.HttpHeader httpHeader = new IIs.HttpHeader();
427
428 httpHeader.Name = (string)row[3];
429
430 // the ParentType and Parent columns are handled in FinalizeIIsHttpHeaderTable
431
432 httpHeader.Value = (string)row[4];
433
434 this.Core.IndexElement(row, httpHeader);
435 }
436 }
437
438 /// <summary>
439 /// Decompile the IIsMimeMap table.
440 /// </summary>
441 /// <param name="table">The table to decompile.</param>
442 private void DecompileIIsMimeMapTable(Table table)
443 {
444 foreach (Row row in table.Rows)
445 {
446 IIs.MimeMap mimeMap = new IIs.MimeMap();
447
448 mimeMap.Id = (string)row[0];
449
450 // the ParentType and ParentValue columns are handled in FinalizeIIsMimeMapTable
451
452 mimeMap.Type = (string)row[3];
453
454 mimeMap.Extension = (string)row[4];
455
456 this.Core.IndexElement(row, mimeMap);
457 }
458 }
459
460 /// <summary>
461 /// Decompile the IIsWebAddress table.
462 /// </summary>
463 /// <param name="table">The table to decompile.</param>
464 private void DecompileIIsWebAddressTable(Table table)
465 {
466 foreach (Row row in table.Rows)
467 {
468 IIs.WebAddress webAddress = new IIs.WebAddress();
469
470 webAddress.Id = (string)row[0];
471
472 if (null != row[2])
473 {
474 webAddress.IP = (string)row[2];
475 }
476
477 webAddress.Port = (string)row[3];
478
479 if (null != row[4])
480 {
481 webAddress.Header = (string)row[4];
482 }
483
484 if (null != row[5] && 1 == (int)row[5])
485 {
486 webAddress.Secure = IIs.YesNoType.yes;
487 }
488
489 this.Core.IndexElement(row, webAddress);
490 }
491 }
492
493 /// <summary>
494 /// Decompile the IIsWebApplication table.
495 /// </summary>
496 /// <param name="table">The table to decompile.</param>
497 private void DecompileIIsWebApplicationTable(Table table)
498 {
499 foreach (Row row in table.Rows)
500 {
501 IIs.WebApplication webApplication = new IIs.WebApplication();
502
503 webApplication.Id = (string)row[0];
504
505 webApplication.Name = (string)row[1];
506
507 // these are not listed incorrectly - the order is low, high, medium
508 switch ((int)row[2])
509 {
510 case 0:
511 webApplication.Isolation = IIs.WebApplication.IsolationType.low;
512 break;
513 case 1:
514 webApplication.Isolation = IIs.WebApplication.IsolationType.high;
515 break;
516 case 2:
517 webApplication.Isolation = IIs.WebApplication.IsolationType.medium;
518 break;
519 default:
520 // TODO: warn
521 break;
522 }
523
524 if (null != row[3])
525 {
526 switch ((int)row[3])
527 {
528 case 0:
529 webApplication.AllowSessions = IIs.YesNoDefaultType.no;
530 break;
531 case 1:
532 webApplication.AllowSessions = IIs.YesNoDefaultType.yes;
533 break;
534 default:
535 // TODO: warn
536 break;
537 }
538 }
539
540 if (null != row[4])
541 {
542 webApplication.SessionTimeout = (int)row[4];
543 }
544
545 if (null != row[5])
546 {
547 switch ((int)row[5])
548 {
549 case 0:
550 webApplication.Buffer = IIs.YesNoDefaultType.no;
551 break;
552 case 1:
553 webApplication.Buffer = IIs.YesNoDefaultType.yes;
554 break;
555 default:
556 // TODO: warn
557 break;
558 }
559 }
560
561 if (null != row[6])
562 {
563 switch ((int)row[6])
564 {
565 case 0:
566 webApplication.ParentPaths = IIs.YesNoDefaultType.no;
567 break;
568 case 1:
569 webApplication.ParentPaths = IIs.YesNoDefaultType.yes;
570 break;
571 default:
572 // TODO: warn
573 break;
574 }
575 }
576
577 if (null != row[7])
578 {
579 switch ((string)row[7])
580 {
581 case "JScript":
582 webApplication.DefaultScript = IIs.WebApplication.DefaultScriptType.JScript;
583 break;
584 case "VBScript":
585 webApplication.DefaultScript = IIs.WebApplication.DefaultScriptType.VBScript;
586 break;
587 default:
588 // TODO: warn
589 break;
590 }
591 }
592
593 if (null != row[8])
594 {
595 webApplication.ScriptTimeout = (int)row[8];
596 }
597
598 if (null != row[9])
599 {
600 switch ((int)row[9])
601 {
602 case 0:
603 webApplication.ServerDebugging = IIs.YesNoDefaultType.no;
604 break;
605 case 1:
606 webApplication.ServerDebugging = IIs.YesNoDefaultType.yes;
607 break;
608 default:
609 // TODO: warn
610 break;
611 }
612 }
613
614 if (null != row[10])
615 {
616 switch ((int)row[10])
617 {
618 case 0:
619 webApplication.ClientDebugging = IIs.YesNoDefaultType.no;
620 break;
621 case 1:
622 webApplication.ClientDebugging = IIs.YesNoDefaultType.yes;
623 break;
624 default:
625 // TODO: warn
626 break;
627 }
628 }
629
630 if (null != row[11])
631 {
632 webApplication.WebAppPool = (string)row[11];
633 }
634
635 this.Core.IndexElement(row, webApplication);
636 }
637 }
638
639 /// <summary>
640 /// Decompile the IIsWebDirProperties table.
641 /// </summary>
642 /// <param name="table">The table to decompile.</param>
643 private void DecompileIIsWebDirPropertiesTable(Table table)
644 {
645 foreach (Row row in table.Rows)
646 {
647 IIs.WebDirProperties webDirProperties = new IIs.WebDirProperties();
648
649 webDirProperties.Id = (string)row[0];
650
651 if (null != row[1])
652 {
653 int access = (int)row[1];
654
655 if (0x1 == (access & 0x1))
656 {
657 webDirProperties.Read = IIs.YesNoType.yes;
658 }
659
660 if (0x2 == (access & 0x2))
661 {
662 webDirProperties.Write = IIs.YesNoType.yes;
663 }
664
665 if (0x4 == (access & 0x4))
666 {
667 webDirProperties.Execute = IIs.YesNoType.yes;
668 }
669
670 if (0x200 == (access & 0x200))
671 {
672 webDirProperties.Script = IIs.YesNoType.yes;
673 }
674 }
675
676 if (null != row[2])
677 {
678 int authorization = (int)row[2];
679
680 if (0x1 == (authorization & 0x1))
681 {
682 webDirProperties.AnonymousAccess = IIs.YesNoType.yes;
683 }
684 else // set one of the properties to 'no' to force the output value to be '0' if not other attributes are set
685 {
686 webDirProperties.AnonymousAccess = IIs.YesNoType.no;
687 }
688
689 if (0x2 == (authorization & 0x2))
690 {
691 webDirProperties.BasicAuthentication = IIs.YesNoType.yes;
692 }
693
694 if (0x4 == (authorization & 0x4))
695 {
696 webDirProperties.WindowsAuthentication = IIs.YesNoType.yes;
697 }
698
699 if (0x10 == (authorization & 0x10))
700 {
701 webDirProperties.DigestAuthentication = IIs.YesNoType.yes;
702 }
703
704 if (0x40 == (authorization & 0x40))
705 {
706 webDirProperties.PassportAuthentication = IIs.YesNoType.yes;
707 }
708 }
709
710 if (null != row[3])
711 {
712 webDirProperties.AnonymousUser = (string)row[3];
713 }
714
715 if (null != row[4] && 1 == (int)row[4])
716 {
717 webDirProperties.IIsControlledPassword = IIs.YesNoType.yes;
718 }
719
720 if (null != row[5])
721 {
722 switch ((int)row[5])
723 {
724 case 0:
725 webDirProperties.LogVisits = IIs.YesNoType.no;
726 break;
727 case 1:
728 webDirProperties.LogVisits = IIs.YesNoType.yes;
729 break;
730 default:
731 // TODO: warn
732 break;
733 }
734 }
735
736 if (null != row[6])
737 {
738 switch ((int)row[6])
739 {
740 case 0:
741 webDirProperties.Index = IIs.YesNoType.no;
742 break;
743 case 1:
744 webDirProperties.Index = IIs.YesNoType.yes;
745 break;
746 default:
747 // TODO: warn
748 break;
749 }
750 }
751
752 if (null != row[7])
753 {
754 webDirProperties.DefaultDocuments = (string)row[7];
755 }
756
757 if (null != row[8])
758 {
759 switch ((int)row[8])
760 {
761 case 0:
762 webDirProperties.AspDetailedError = IIs.YesNoType.no;
763 break;
764 case 1:
765 webDirProperties.AspDetailedError = IIs.YesNoType.yes;
766 break;
767 default:
768 // TODO: warn
769 break;
770 }
771 }
772
773 if (null != row[9])
774 {
775 webDirProperties.HttpExpires = (string)row[9];
776 }
777
778 if (null != row[10])
779 {
780 // force the value to be a positive number
781 webDirProperties.CacheControlMaxAge = unchecked((uint)(int)row[10]);
782 }
783
784 if (null != row[11])
785 {
786 webDirProperties.CacheControlCustom = (string)row[11];
787 }
788
789 if (null != row[12])
790 {
791 switch ((int)row[8])
792 {
793 case 0:
794 webDirProperties.ClearCustomError = IIs.YesNoType.no;
795 break;
796 case 1:
797 webDirProperties.ClearCustomError = IIs.YesNoType.yes;
798 break;
799 default:
800 // TODO: warn
801 break;
802 }
803 }
804
805 if (null != row[13])
806 {
807 int accessSSLFlags = (int)row[13];
808
809 if (0x8 == (accessSSLFlags & 0x8))
810 {
811 webDirProperties.AccessSSL = IIs.YesNoType.yes;
812 }
813
814 if (0x20 == (accessSSLFlags & 0x20))
815 {
816 webDirProperties.AccessSSLNegotiateCert = IIs.YesNoType.yes;
817 }
818
819 if (0x40 == (accessSSLFlags & 0x40))
820 {
821 webDirProperties.AccessSSLRequireCert = IIs.YesNoType.yes;
822 }
823
824 if (0x80 == (accessSSLFlags & 0x80))
825 {
826 webDirProperties.AccessSSLMapCert = IIs.YesNoType.yes;
827 }
828
829 if (0x100 == (accessSSLFlags & 0x100))
830 {
831 webDirProperties.AccessSSL128 = IIs.YesNoType.yes;
832 }
833 }
834
835 if (null != row[14])
836 {
837 webDirProperties.AuthenticationProviders = (string)row[14];
838 }
839
840 this.Core.RootElement.AddChild(webDirProperties);
841 }
842 }
843
844 /// <summary>
845 /// Decompile the IIsWebError table.
846 /// </summary>
847 /// <param name="table">The table to decompile.</param>
848 private void DecompileIIsWebErrorTable(Table table)
849 {
850 foreach (Row row in table.Rows)
851 {
852 IIs.WebError webError = new IIs.WebError();
853
854 webError.ErrorCode = (int)row[0];
855
856 webError.SubCode = (int)row[1];
857
858 // the ParentType and ParentValue columns are handled in FinalizeIIsWebErrorTable
859
860 if (null != row[4])
861 {
862 webError.File = (string)row[4];
863 }
864
865 if (null != row[5])
866 {
867 webError.URL = (string)row[5];
868 }
869
870 this.Core.IndexElement(row, webError);
871 }
872 }
873
874 /// <summary>
875 /// Decompile the IIsFilter table.
876 /// </summary>
877 /// <param name="table">The table to decompile.</param>
878 private void DecompileIIsFilterTable(Table table)
879 {
880 foreach (Row row in table.Rows)
881 {
882 IIs.WebFilter webFilter = new IIs.WebFilter();
883
884 webFilter.Id = (string)row[0];
885
886 webFilter.Name = (string)row[1];
887
888 if (null != row[3])
889 {
890 webFilter.Path = (string)row[3];
891 }
892
893 if (null != row[5])
894 {
895 webFilter.Description = (string)row[5];
896 }
897
898 webFilter.Flags = (int)row[6];
899
900 if (null != row[7])
901 {
902 switch ((int)row[7])
903 {
904 case (-1):
905 webFilter.LoadOrder = "last";
906 break;
907 case 0:
908 webFilter.LoadOrder = "first";
909 break;
910 default:
911 webFilter.LoadOrder = Convert.ToString((int)row[7], CultureInfo.InvariantCulture);
912 break;
913 }
914 }
915
916 if (null != row[4])
917 {
918 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[4]);
919
920 if (null != webSite)
921 {
922 webSite.AddChild(webFilter);
923 }
924 else
925 {
926 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[4], "IIsWebSite"));
927 }
928 }
929 else // Component parent
930 {
931 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
932
933 if (null != component)
934 {
935 component.AddChild(webFilter);
936 }
937 else
938 {
939 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
940 }
941 }
942 }
943 }
944
945 /// <summary>
946 /// Decompile the IIsWebLog table.
947 /// </summary>
948 /// <param name="table">The table to decompile.</param>
949 private void DecompileIIsWebLogTable(Table table)
950 {
951 foreach (Row row in table.Rows)
952 {
953 IIs.WebLog webLog = new IIs.WebLog();
954
955 webLog.Id = (string)row[0];
956
957 switch ((string)row[1])
958 {
959 case "Microsoft IIS Log File Format":
960 webLog.Type = IIs.WebLog.TypeType.IIS;
961 break;
962 case "NCSA Common Log File Format":
963 webLog.Type = IIs.WebLog.TypeType.NCSA;
964 break;
965 case "none":
966 webLog.Type = IIs.WebLog.TypeType.none;
967 break;
968 case "ODBC Logging":
969 webLog.Type = IIs.WebLog.TypeType.ODBC;
970 break;
971 case "W3C Extended Log File Format":
972 webLog.Type = IIs.WebLog.TypeType.W3C;
973 break;
974 default:
975 // TODO: warn
976 break;
977 }
978
979 this.Core.RootElement.AddChild(webLog);
980 }
981 }
982
983 /// <summary>
984 /// Decompile the IIsWebServiceExtension table.
985 /// </summary>
986 /// <param name="table">The table to decompile.</param>
987 private void DecompileIIsWebServiceExtensionTable(Table table)
988 {
989 foreach (Row row in table.Rows)
990 {
991 IIs.WebServiceExtension webServiceExtension = new IIs.WebServiceExtension();
992
993 webServiceExtension.Id = (string)row[0];
994
995 webServiceExtension.File = (string)row[2];
996
997 if (null != row[3])
998 {
999 webServiceExtension.Description = (string)row[3];
1000 }
1001
1002 if (null != row[4])
1003 {
1004 webServiceExtension.Group = (string)row[4];
1005 }
1006
1007 int attributes = (int)row[5];
1008
1009 if (0x1 == (attributes & 0x1))
1010 {
1011 webServiceExtension.Allow = IIs.YesNoType.yes;
1012 }
1013 else
1014 {
1015 webServiceExtension.Allow = IIs.YesNoType.no;
1016 }
1017
1018 if (0x2 == (attributes & 0x2))
1019 {
1020 webServiceExtension.UIDeletable = IIs.YesNoType.yes;
1021 }
1022
1023 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
1024 if (null != component)
1025 {
1026 component.AddChild(webServiceExtension);
1027 }
1028 else
1029 {
1030 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
1031 }
1032 }
1033 }
1034
1035 /// <summary>
1036 /// Decompile the IIsWebSite table.
1037 /// </summary>
1038 /// <param name="table">The table to decompile.</param>
1039 private void DecompileIIsWebSiteTable(Table table)
1040 {
1041 foreach (Row row in table.Rows)
1042 {
1043 IIs.WebSite webSite = new IIs.WebSite();
1044
1045 webSite.Id = (string)row[0];
1046
1047 if (null != row[2])
1048 {
1049 webSite.Description = (string)row[2];
1050 }
1051
1052 if (null != row[3])
1053 {
1054 webSite.ConnectionTimeout = (int)row[3];
1055 }
1056
1057 if (null != row[4])
1058 {
1059 webSite.Directory = (string)row[4];
1060 }
1061
1062 if (null != row[5])
1063 {
1064 switch ((int)row[5])
1065 {
1066 case 0:
1067 // this is the default
1068 break;
1069 case 1:
1070 webSite.StartOnInstall = IIs.YesNoType.yes;
1071 break;
1072 case 2:
1073 webSite.AutoStart = IIs.YesNoType.yes;
1074 break;
1075 default:
1076 // TODO: warn
1077 break;
1078 }
1079 }
1080
1081 if (null != row[6])
1082 {
1083 int attributes = (int)row[6];
1084
1085 if (0x2 == (attributes & 0x2))
1086 {
1087 webSite.ConfigureIfExists = IIs.YesNoType.no;
1088 }
1089 }
1090
1091 // the KeyAddress_ column is handled in FinalizeWebAddressTable
1092
1093 if (null != row[8])
1094 {
1095 webSite.DirProperties = (string)row[8];
1096 }
1097
1098 // the Application_ column is handled in FinalizeIIsWebApplicationTable
1099
1100 if (null != row[10])
1101 {
1102 if (-1 != (int)row[10])
1103 {
1104 webSite.Sequence = (int)row[10];
1105 }
1106 }
1107
1108 if (null != row[11])
1109 {
1110 webSite.WebLog = (string)row[11];
1111 }
1112
1113 if (null != row[12])
1114 {
1115 webSite.SiteId = (string)row[12];
1116 }
1117
1118 if (null != row[1])
1119 {
1120 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
1121
1122 if (null != component)
1123 {
1124 component.AddChild(webSite);
1125 }
1126 else
1127 {
1128 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
1129 }
1130 }
1131 else
1132 {
1133 this.Core.RootElement.AddChild(webSite);
1134 }
1135 this.Core.IndexElement(row, webSite);
1136 }
1137 }
1138
1139 /// <summary>
1140 /// Decompile the IIsWebVirtualDir table.
1141 /// </summary>
1142 /// <param name="table">The table to decompile.</param>
1143 private void DecompileIIsWebVirtualDirTable(Table table)
1144 {
1145 foreach (Row row in table.Rows)
1146 {
1147 IIs.WebVirtualDir webVirtualDir = new IIs.WebVirtualDir();
1148
1149 webVirtualDir.Id = (string)row[0];
1150
1151 // the Component_ and Web_ columns are handled in FinalizeIIsWebVirtualDirTable
1152
1153 webVirtualDir.Alias = (string)row[3];
1154
1155 webVirtualDir.Directory = (string)row[4];
1156
1157 if (null != row[5])
1158 {
1159 webVirtualDir.DirProperties = (string)row[5];
1160 }
1161
1162 // the Application_ column is handled in FinalizeIIsWebApplicationTable
1163
1164 this.Core.IndexElement(row, webVirtualDir);
1165 }
1166 }
1167
1168 /// <summary>
1169 /// Decompile the IIsWebSiteCertificates table.
1170 /// </summary>
1171 /// <param name="table">The table to decompile.</param>
1172 private void DecompileIIsWebSiteCertificatesTable(Table table)
1173 {
1174 foreach (Row row in table.Rows)
1175 {
1176 IIs.CertificateRef certificateRef = new IIs.CertificateRef();
1177
1178 certificateRef.Id = (string)row[1];
1179
1180 this.Core.IndexElement(row, certificateRef);
1181 }
1182 }
1183
1184 /// <summary>
1185 /// Finalize the IIsHttpHeader table.
1186 /// </summary>
1187 /// <param name="tables">The collection of all tables.</param>
1188 /// <remarks>
1189 /// The IIsHttpHeader table supports multiple parent types so no foreign key
1190 /// is declared and thus nesting must be done late.
1191 /// </remarks>
1192 private void FinalizeIIsHttpHeaderTable(TableIndexedCollection tables)
1193 {
1194 Table iisHttpHeaderTable = tables["IIsHttpHeader"];
1195
1196 if (null != iisHttpHeaderTable)
1197 {
1198 foreach (Row row in iisHttpHeaderTable.Rows)
1199 {
1200 IIs.HttpHeader httpHeader = (IIs.HttpHeader)this.Core.GetIndexedElement(row);
1201
1202 if (1 == (int)row[1])
1203 {
1204 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement("IIsWebVirtualDir", (string)row[2]);
1205 if (null != webVirtualDir)
1206 {
1207 webVirtualDir.AddChild(httpHeader);
1208 }
1209 else
1210 {
1211 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisHttpHeaderTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[2], "IIsWebVirtualDir"));
1212 }
1213 }
1214 else if (2 == (int)row[1])
1215 {
1216 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[2]);
1217 if (null != webSite)
1218 {
1219 webSite.AddChild(httpHeader);
1220 }
1221 else
1222 {
1223 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisHttpHeaderTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[2], "IIsWebSite"));
1224 }
1225 }
1226 }
1227 }
1228 }
1229
1230 /// <summary>
1231 /// Finalize the IIsMimeMap table.
1232 /// </summary>
1233 /// <param name="tables">The collection of all tables.</param>
1234 /// <remarks>
1235 /// The IIsMimeMap table supports multiple parent types so no foreign key
1236 /// is declared and thus nesting must be done late.
1237 /// </remarks>
1238 private void FinalizeIIsMimeMapTable(TableIndexedCollection tables)
1239 {
1240 Table iisMimeMapTable = tables["IIsMimeMap"];
1241
1242 if (null != iisMimeMapTable)
1243 {
1244 foreach (Row row in iisMimeMapTable.Rows)
1245 {
1246 IIs.MimeMap mimeMap = (IIs.MimeMap)this.Core.GetIndexedElement(row);
1247
1248 if (2 < (int)row[1] || 0 >= (int)row[1])
1249 {
1250 // TODO: warn about unknown parent type
1251 }
1252
1253 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement("IIsWebVirtualDir", (string)row[2]);
1254 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[2]);
1255 if (null != webVirtualDir)
1256 {
1257 webVirtualDir.AddChild(mimeMap);
1258 }
1259 else if (null != webSite)
1260 {
1261 webSite.AddChild(mimeMap);
1262 }
1263 else
1264 {
1265 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisMimeMapTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[2], "IIsWebVirtualDir"));
1266 }
1267 }
1268 }
1269 }
1270
1271 /// <summary>
1272 /// Finalize the IIsWebApplication table.
1273 /// </summary>
1274 /// <param name="tables">The collection of all tables.</param>
1275 /// <remarks>
1276 /// Since WebApplication elements may nest under a specific WebSite or
1277 /// WebVirtualDir (or just the root element), the nesting must be done late.
1278 /// </remarks>
1279 private void FinalizeIIsWebApplicationTable(TableIndexedCollection tables)
1280 {
1281 Table iisWebApplicationTable = tables["IIsWebApplication"];
1282 Table iisWebSiteTable = tables["IIsWebSite"];
1283 Table iisWebVirtualDirTable = tables["IIsWebVirtualDir"];
1284
1285 Hashtable addedWebApplications = new Hashtable();
1286
1287 if (null != iisWebSiteTable)
1288 {
1289 foreach (Row row in iisWebSiteTable.Rows)
1290 {
1291 if (null != row[9])
1292 {
1293 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement(row);
1294
1295 IIs.WebApplication webApplication = (IIs.WebApplication)this.Core.GetIndexedElement("IIsWebApplication", (string)row[9]);
1296 if (null != webApplication)
1297 {
1298 webSite.AddChild(webApplication);
1299 addedWebApplications[webApplication] = null;
1300 }
1301 else
1302 {
1303 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebSiteTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Application_", (string)row[9], "IIsWebApplication"));
1304 }
1305 }
1306 }
1307 }
1308
1309 if (null != iisWebVirtualDirTable)
1310 {
1311 foreach (Row row in iisWebVirtualDirTable.Rows)
1312 {
1313 if (null != row[6])
1314 {
1315 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement(row);
1316
1317 IIs.WebApplication webApplication = (IIs.WebApplication)this.Core.GetIndexedElement("IIsWebApplication", (string)row[6]);
1318 if (null != webApplication)
1319 {
1320 webVirtualDir.AddChild(webApplication);
1321 addedWebApplications[webApplication] = null;
1322 }
1323 else
1324 {
1325 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebVirtualDirTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Application_", (string)row[6], "IIsWebApplication"));
1326 }
1327 }
1328 }
1329 }
1330
1331 if (null != iisWebApplicationTable)
1332 {
1333 foreach (Row row in iisWebApplicationTable.Rows)
1334 {
1335 IIs.WebApplication webApplication = (IIs.WebApplication)this.Core.GetIndexedElement(row);
1336
1337 if (!addedWebApplications.Contains(webApplication))
1338 {
1339 this.Core.RootElement.AddChild(webApplication);
1340 }
1341 }
1342 }
1343 }
1344
1345 /// <summary>
1346 /// Finalize the IIsWebError table.
1347 /// </summary>
1348 /// <param name="tables">The collection of all tables.</param>
1349 /// <remarks>
1350 /// Since there is no foreign key relationship declared for this table
1351 /// (because it takes various parent types), it must be nested late.
1352 /// </remarks>
1353 private void FinalizeIIsWebErrorTable(TableIndexedCollection tables)
1354 {
1355 Table iisWebErrorTable = tables["IIsWebError"];
1356
1357 if (null != iisWebErrorTable)
1358 {
1359 foreach (Row row in iisWebErrorTable.Rows)
1360 {
1361 IIs.WebError webError = (IIs.WebError)this.Core.GetIndexedElement(row);
1362
1363 if (1 == (int)row[2]) // WebVirtualDir parent
1364 {
1365 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement("IIsWebVirtualDir", (string)row[3]);
1366
1367 if (null != webVirtualDir)
1368 {
1369 webVirtualDir.AddChild(webError);
1370 }
1371 else
1372 {
1373 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebErrorTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[3], "IIsWebVirtualDir"));
1374 }
1375 }
1376 else if (2 == (int)row[2]) // WebSite parent
1377 {
1378 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[3]);
1379
1380 if (null != webSite)
1381 {
1382 webSite.AddChild(webError);
1383 }
1384 else
1385 {
1386 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebErrorTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ParentValue", (string)row[3], "IIsWebSite"));
1387 }
1388 }
1389 else
1390 {
1391 // TODO: warn unknown parent type
1392 }
1393 }
1394 }
1395 }
1396
1397 /// <summary>
1398 /// Finalize the IIsWebVirtualDir table.
1399 /// </summary>
1400 /// <param name="tables">The collection of all tables.</param>
1401 /// <remarks>
1402 /// WebVirtualDir elements nest under either a WebSite or component
1403 /// depending upon whether the component in the IIsWebVirtualDir row
1404 /// is the same as the one in the parent IIsWebSite row.
1405 /// </remarks>
1406 private void FinalizeIIsWebVirtualDirTable(TableIndexedCollection tables)
1407 {
1408 Table iisWebSiteTable = tables["IIsWebSite"];
1409 Table iisWebVirtualDirTable = tables["IIsWebVirtualDir"];
1410
1411 Hashtable iisWebSiteRows = new Hashtable();
1412
1413 // index the IIsWebSite rows by their primary keys
1414 if (null != iisWebSiteTable)
1415 {
1416 foreach (Row row in iisWebSiteTable.Rows)
1417 {
1418 iisWebSiteRows.Add(row[0], row);
1419 }
1420 }
1421
1422 if (null != iisWebVirtualDirTable)
1423 {
1424 foreach (Row row in iisWebVirtualDirTable.Rows)
1425 {
1426 IIs.WebVirtualDir webVirtualDir = (IIs.WebVirtualDir)this.Core.GetIndexedElement(row);
1427 Row iisWebSiteRow = (Row)iisWebSiteRows[row[2]];
1428
1429 if (null != iisWebSiteRow)
1430 {
1431 if ((string)iisWebSiteRow[1] == (string)row[1])
1432 {
1433 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement(iisWebSiteRow);
1434
1435 webSite.AddChild(webVirtualDir);
1436 }
1437 else
1438 {
1439 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
1440
1441 if (null != component)
1442 {
1443 webVirtualDir.WebSite = (string)row[2];
1444 component.AddChild(webVirtualDir);
1445 }
1446 else
1447 {
1448 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebVirtualDirTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
1449 }
1450 }
1451 }
1452 else
1453 {
1454 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebVirtualDirTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[2], "IIsWebSite"));
1455 }
1456 }
1457 }
1458 }
1459
1460 /// <summary>
1461 /// Finalize the IIsWebSiteCertificates table.
1462 /// </summary>
1463 /// <param name="tables">The collection of all tables.</param>
1464 /// <remarks>
1465 /// This table creates CertificateRef elements which nest under WebSite
1466 /// elements.
1467 /// </remarks>
1468 private void FinalizeIIsWebSiteCertificatesTable(TableIndexedCollection tables)
1469 {
1470 Table IIsWebSiteCertificatesTable = tables["IIsWebSiteCertificates"];
1471
1472 if (null != IIsWebSiteCertificatesTable)
1473 {
1474 foreach (Row row in IIsWebSiteCertificatesTable.Rows)
1475 {
1476 IIs.CertificateRef certificateRef = (IIs.CertificateRef)this.Core.GetIndexedElement(row);
1477 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[0]);
1478
1479 if (null != webSite)
1480 {
1481 webSite.AddChild(certificateRef);
1482 }
1483 else
1484 {
1485 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, IIsWebSiteCertificatesTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[0], "IIsWebSite"));
1486 }
1487 }
1488 }
1489 }
1490
1491 /// <summary>
1492 /// Finalize the WebAddress table.
1493 /// </summary>
1494 /// <param name="tables">The collection of all tables.</param>
1495 /// <remarks>
1496 /// There is a circular dependency between the WebAddress and WebSite
1497 /// tables, so nesting must be handled here.
1498 /// </remarks>
1499 private void FinalizeWebAddressTable(TableIndexedCollection tables)
1500 {
1501 Table iisWebAddressTable = tables["IIsWebAddress"];
1502 Table iisWebSiteTable = tables["IIsWebSite"];
1503
1504 Hashtable addedWebAddresses = new Hashtable();
1505
1506 if (null != iisWebSiteTable)
1507 {
1508 foreach (Row row in iisWebSiteTable.Rows)
1509 {
1510 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement(row);
1511
1512 IIs.WebAddress webAddress = (IIs.WebAddress)this.Core.GetIndexedElement("IIsWebAddress", (string)row[7]);
1513 if (null != webAddress)
1514 {
1515 webSite.AddChild(webAddress);
1516 addedWebAddresses[webAddress] = null;
1517 }
1518 else
1519 {
1520 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebSiteTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "KeyAddress_", (string)row[7], "IIsWebAddress"));
1521 }
1522 }
1523 }
1524
1525 if (null != iisWebAddressTable)
1526 {
1527 foreach (Row row in iisWebAddressTable.Rows)
1528 {
1529 IIs.WebAddress webAddress = (IIs.WebAddress)this.Core.GetIndexedElement(row);
1530
1531 if (!addedWebAddresses.Contains(webAddress))
1532 {
1533 IIs.WebSite webSite = (IIs.WebSite)this.Core.GetIndexedElement("IIsWebSite", (string)row[1]);
1534
1535 if (null != webSite)
1536 {
1537 webSite.AddChild(webAddress);
1538 }
1539 else
1540 {
1541 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, iisWebAddressTable.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Web_", (string)row[1], "IIsWebSite"));
1542 }
1543 }
1544 }
1545 }
1546 }
1547 }
1548#endif
1549}