List:Commits« Previous MessageNext Message »
From:Reggie Burnett Date:February 9 2011 1:49pm
Subject:bzr commit into wex-installer-1.0 branch (reggie.burnett:320)
View as plain text  
#At file:///C:/Users/Reggie/work/wex/installer-updated/ based on revid:reggie.burnett@strippedlfog5f48ja8rbk

  320 Reggie Burnett	2011-02-09
      additional work on Examples setup and plugin (not done but getting closer)

    added:
      StandardPlugins/Examples/ExamplesConfigPanel1.Designer.cs
      StandardPlugins/Examples/ExamplesConfigPanel1.cs
      StandardPlugins/Examples/ExamplesConfigPanel1.resx
      WexInstaller.Core/Resources/Server_Reflection.png
      WexInstaller.Core/RootPasswordPromptDlg.Designer.cs
      WexInstaller.Core/RootPasswordPromptDlg.cs
      WexInstaller.Core/RootPasswordPromptDlg.resx
      WexInstaller.Core/ServerProductConfigurationController.cs
    modified:
      Examples/Examples.wixproj
      Examples/Product.wxs
      Setup_Net/Product.wxs
      Setup_Net/products.xml
      StandardPlugins/Examples/ConfigurationController.cs
      StandardPlugins/Server/ConfigurationController.cs
      StandardPlugins/StandardPlugins.csproj
      WexInstaller.Core/PluginManager.cs
      WexInstaller.Core/ProductConfigurationController.cs
      WexInstaller.Core/Properties/Resources.Designer.cs
      WexInstaller.Core/Properties/Resources.resx
      WexInstaller.Core/WexInstaller.Core.csproj
=== modified file 'Examples/Examples.wixproj'
=== modified file 'Examples/Examples.wixproj'
--- a/Examples/Examples.wixproj	2011-02-08 21:23:56 +0000
+++ b/Examples/Examples.wixproj	2011-02-09 13:49:30 +0000
@@ -6,7 +6,7 @@
     <ProductVersion>3.5</ProductVersion>
     <ProjectGuid>{13190f97-5d72-4949-a77a-500a57da44bb}</ProjectGuid>
     <SchemaVersion>2.0</SchemaVersion>
-    <OutputName>Examples</OutputName>
+    <OutputName>mysql-examples-1.0.0</OutputName>
     <OutputType>Package</OutputType>
     <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
     <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>

=== modified file 'Examples/Product.wxs'
--- a/Examples/Product.wxs	2011-02-08 21:23:56 +0000
+++ b/Examples/Product.wxs	2011-02-09 13:49:30 +0000
@@ -38,7 +38,7 @@
       </Directory>
     </Directory>
 
-    <Feature Id="SampleDBFeature" Title="Sample Databases" Level="1">
+    <Feature Id="SampleDB" Title="Sample Databases" Level="1">
       <ComponentRef Id="WorldDBComponent" />
       <ComponentRef Id="SakilaDBComponent" />
       <ComponentRef Id="MenagerieDBComponent" />

=== modified file 'Setup_Net/Product.wxs'
--- a/Setup_Net/Product.wxs	2011-02-01 21:05:32 +0000
+++ b/Setup_Net/Product.wxs	2011-02-09 13:49:30 +0000
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?define ProductName="MySQL Universal Installer"?>
-<?define ProductVersion="1.0.6"?>
-<?define CatalogName="mysql-5.5-gpl"?>
+<?define ProductVersion="1.0.7"?>
+<?define CatalogName="mysql-5.1-gpl"?>
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
      xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
      xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
@@ -30,6 +30,8 @@
               <File Id="WexInstallerUpdater.exe" Name="WexInstallerUpdater.exe" 
                     Source="$(var.ProjectDir)..\WexInstallerUpdater\bin\$(var.Configuration)\WexInstallerUpdater.exe"/>
               <File Id="MySql.Data.dll" Name="MySql.Data.dll" Source="$(var.ProjectDir)..\WexInstaller\bin\$(var.Configuration)\mysql.data.dll"/>
+              <File Id="WexInstaller.Core.dll" Name="WexInstaller.Core.dll" Source="$(var.ProjectDir)..\WexInstaller\bin\$(var.Configuration)\wexinstaller.core.dll"/>
+              <File Id="StandardPlugins.dll" Name="StandardPlugins.dll" Source="$(var.ProjectDir)..\StandardPlugins\bin\$(var.Configuration)\standardplugins.dll"/>
               <RemoveFolder Id="DeleteShortcutFolder1" Directory="PMCompanyDir" On="uninstall" />
               <RemoveFolder Id="DeleteShortcutFolder2" Directory="ShortCutDir" On="uninstall" />
               <Registry Action="remove" Root="HKLM" 
@@ -70,17 +72,21 @@
             </Component>
             <Directory Id="ProductCache" Name="Product Cache">
               <Component Id="Products" Guid="">
+                <CreateFolder/>
                 <util:XmlFile Id="SetProductCachePath" Action="setValue" ElementPath="//ProductCachePath" Value="[ProductCache]" File="[#config.xml]" SelectionLanguage="XPath" Sequence="1" />
                 <util:XmlFile Id="SetInstallationRoot" Action="setValue" ElementPath="//InstallationRoot" Value="[INSTALLLOCATION]" File="[#config.xml]" SelectionLanguage="XPath" Sequence="2" />
                 <util:XmlFile Id="SetProductCode" Action="setValue" ElementPath="//ProductCode" Value="[ProductCode]" File="[#config.xml]" SelectionLanguage="XPath" Sequence="3" />
-                <!--<File Id="server" Name="mysql-5.5.8-win32.msi" Source="ProductCache\mysql-5.5.8-win32.msi"/>
-                <File Id="workbench" Name="mysql-workbench-gpl-5.2.29-win32.msi" Source="ProductCache\mysql-workbench-gpl-5.2.29-win32.msi"/>
-                -->
+                <File Id="server" Name="mysql-5.1.54-win32.msi" Source="ProductCache\mysql-5.1.54-win32.msi"/>
+                <File Id="workbench" Name="mysql-workbench-gpl-5.2.31a-win32.msi" Source="ProductCache\mysql-workbench-gpl-5.2.31a-win32.msi"/>
+                
                 <File Id="connector_odbc" Name="mysql-connector-odbc-5.1.6-win32.msi" Source="ProductCache\mysql-connector-odbc-5.1.6-win32.msi"/>
                 <File Id="connector_cpp" Name="mysql-connector-c++-1.0.5-win32.msi" Source="ProductCache\mysql-connector-c++-1.0.5-win32.msi"/>
-                <!--<File Id="connector_c" Name="mysql-connector-c-6.0.2-win32.msi" Source="ProductCache\mysql-connector-c-6.0.2-win32.msi"/>
-                <File Id="universion_docs" Name="mysql-universal-installer-document-bundle-1.0.0.0.msi" Source="ProductCache\mysql-universal-installer-document-bundle-1.0.0.0.msi"/>
-                -->
+                <File Id="connector_c" Name="mysql-connector-c-6.0.2-win32.msi" Source="ProductCache\mysql-connector-c-6.0.2-win32.msi"/>
+
+                <File Id="examples" Name="mysql-examples-1.0.0.msi" Source="ProductCache\mysql-examples-1.0.0.msi"/>
+
+                <!--<File Id="universion_docs" Name="mysql-universal-installer-document-bundle-1.0.0.0.msi" Source="ProductCache\mysql-universal-installer-document-bundle-1.0.0.0.msi"/>-->
+                
               </Component>
             </Directory>
           </Directory>

=== modified file 'Setup_Net/products.xml'
--- a/Setup_Net/products.xml	2011-02-02 17:35:12 +0000
+++ b/Setup_Net/products.xml	2011-02-09 13:49:30 +0000
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <ProductManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1" format="1">
-  <UpdateURL>file://C:\Users\Reggie\work\wex\installer-updated\Setup_Net\Output\mysql-universal-installer-1.0.5.exe</UpdateURL>
+  <UpdateURL>mysql-universal-installer-1.0.7.msi</UpdateURL>
   <UpdateVersion>1.0.7</UpdateVersion>
-  <UpdateHash>CB69C60143875DA4A6CDCA6E6C9FDC60BFC9853C</UpdateHash>
+  <UpdateHash>6C759C590061C096B29C2C83C6A3C40651F5FA84</UpdateHash>
   <ProductCatalogs>
     <ProductCatalog id="mysql-5.5-gpl" name="MySQL 5.5" description="MySQL 5.5 Community Edition" commercial="false">
       <SetupTypes>
@@ -60,9 +60,10 @@
           </Package>
         </Packages>
       </Product>
-      <Product name="mysql-server-5.1-gpl" title="MySQL Server" description="The core MySQL database server" upgradeId="{49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}" urlBaseDir="mysql-5.1">
+      <Product name="mysql-server-5.1-gpl" title="MySQL Server" description="The core MySQL database server" 
+               upgradeId="{49EB7A6A-1CEF-4A1E-9E89-B9A4993963E3}" urlBaseDir="mysql-5.1">
         <Packages>
-          <Package type="MSI" arch="X86" filename="mysql-5.1.54-win32.msi" id="{2430887C-B8A8-49D8-9185-9F451185AF7B}" thisVersion="5.1.54">
+          <Package type="MSI" arch="X86" filename="mysql-5.1.53-win32.msi" id="{297EBF0D-270D-404E-82B8-CB90B4931825}" thisVersion="5.1.53">
             <Feature name="SERVER" title="MySQL Server" description="Install MySQL Server." default="true" size="0" display="true" hasComponents="true">
               <Feature name="DebugBinaries" title="Debug binaries" description="Debug/trace versions of executables and libraries" default="true" size="0" display="true" hasComponents="true" />
               <Feature name="Client" title="Client Programs" description="Various helpful (commandline) tools including the mysql command line client" default="true" size="0" display="true" hasComponents="true" />
@@ -137,6 +138,15 @@
           </Package>
         </Packages>
       </Product>
+      <Product name="examples" title="Examples and sample databases"
+               description="A collection of examples and sample databases to help a developer get started."
+               upgradeId="8C8219CB-78A4-4AF8-8D49-F36FB1FE3320" urlBaseDir="examples">
+        <Packages>
+          <Package type="MSI" arch="Any" filename="mysql-examples-1.0.0.msi" id="{46B63307-6F7C-4E85-A77B-FA97365DF153}" thisVersion="1.0.0">
+            <Feature name="SampleDB" title="Sample Databases" description="Some interesting sample databases" default="true" size="0" display="true" hasComponents="true" />
+          </Package>
+        </Packages>
+      </Product>
     </ProductCategory>
   </ProductCategories>
 </ProductManifest>
\ No newline at end of file

=== modified file 'StandardPlugins/Examples/ConfigurationController.cs'
--- a/StandardPlugins/Examples/ConfigurationController.cs	2011-02-08 18:41:30 +0000
+++ b/StandardPlugins/Examples/ConfigurationController.cs	2011-02-09 13:49:30 +0000
@@ -16,14 +16,44 @@
     [ProductConfiguration("examples", 1)]
     public class ExamplesConfigurationController : ProductConfigurationController
     {
+        UserControl[] pages = new UserControl[1];
+        
+        List<string> sampleDbNames = new List<string>();
+        
+        public List<ServerProductConfigurationController> Servers = new List<ServerProductConfigurationController>();
+        
         public override int NumPages
         {
-            get { throw new NotImplementedException(); }
+            get { return pages.Length; }
         }
 
         public override UserControl[] Pages
         {
-            get { throw new NotImplementedException(); }
+            get { return pages; }
+        }
+
+        public override void Initialize()
+        {
+            pages[0] = new ExamplesConfigStep1(this);
+            sampleDbNames.Add("World");
+            sampleDbNames.Add("World (InnoDB)");
+            sampleDbNames.Add("Sakila");
+            sampleDbNames.Add("Menagerie");
+        }
+
+        public override void PostAction(ConfigurationAction action)
+        {
+            if (action == ConfigurationAction.Install)
+            {
+                // now we need a list of all running servers
+                Servers = PluginManager.Instance.GetServerControllers(true);
+            }
+            base.PostAction(action);
+        }
+
+        protected override void BackgroundConfigure(object sender, DoWorkEventArgs e)
+        {
+            base.BackgroundConfigure(sender, e);
         }
     }
 }

=== added file 'StandardPlugins/Examples/ExamplesConfigPanel1.Designer.cs'
--- a/StandardPlugins/Examples/ExamplesConfigPanel1.Designer.cs	1970-01-01 00:00:00 +0000
+++ b/StandardPlugins/Examples/ExamplesConfigPanel1.Designer.cs	2011-02-09 13:49:30 +0000
@@ -0,0 +1,170 @@
+using WexInstaller.Plugins.Properties;
+namespace WexInstaller.Plugins
+{
+    partial class ExamplesConfigStep1
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.actionLabel = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.serverList1 = new System.Windows.Forms.ComboBox();
+            this.serverList2 = new System.Windows.Forms.ComboBox();
+            this.serverList3 = new System.Windows.Forms.ComboBox();
+            this.serverList4 = new System.Windows.Forms.ComboBox();
+            this.groupBox1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // actionLabel
+            // 
+            this.actionLabel.Font = new System.Drawing.Font("Tahoma", 10F);
+            this.actionLabel.Location = new System.Drawing.Point(12, 80);
+            this.actionLabel.Name = "actionLabel";
+            this.actionLabel.Size = new System.Drawing.Size(443, 23);
+            this.actionLabel.TabIndex = 2;
+            this.actionLabel.Text = "Please select the install actions for each of the sample databases";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(39, 38);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(35, 13);
+            this.label1.TabIndex = 3;
+            this.label1.Text = "World";
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.serverList4);
+            this.groupBox1.Controls.Add(this.serverList3);
+            this.groupBox1.Controls.Add(this.serverList2);
+            this.groupBox1.Controls.Add(this.serverList1);
+            this.groupBox1.Controls.Add(this.label4);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Location = new System.Drawing.Point(37, 125);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(418, 288);
+            this.groupBox1.TabIndex = 4;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Sample Databases";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(39, 88);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(81, 13);
+            this.label2.TabIndex = 4;
+            this.label2.Text = "World (InnoDB)";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(39, 140);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(34, 13);
+            this.label3.TabIndex = 5;
+            this.label3.Text = "Sakila";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(39, 188);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(57, 13);
+            this.label4.TabIndex = 6;
+            this.label4.Text = "Menagerie";
+            // 
+            // serverList1
+            // 
+            this.serverList1.FormattingEnabled = true;
+            this.serverList1.Location = new System.Drawing.Point(185, 35);
+            this.serverList1.Name = "serverList1";
+            this.serverList1.Size = new System.Drawing.Size(182, 21);
+            this.serverList1.TabIndex = 7;
+            // 
+            // serverList2
+            // 
+            this.serverList2.FormattingEnabled = true;
+            this.serverList2.Location = new System.Drawing.Point(185, 88);
+            this.serverList2.Name = "serverList2";
+            this.serverList2.Size = new System.Drawing.Size(182, 21);
+            this.serverList2.TabIndex = 8;
+            // 
+            // serverList3
+            // 
+            this.serverList3.FormattingEnabled = true;
+            this.serverList3.Location = new System.Drawing.Point(185, 137);
+            this.serverList3.Name = "serverList3";
+            this.serverList3.Size = new System.Drawing.Size(182, 21);
+            this.serverList3.TabIndex = 9;
+            // 
+            // serverList4
+            // 
+            this.serverList4.FormattingEnabled = true;
+            this.serverList4.Location = new System.Drawing.Point(185, 185);
+            this.serverList4.Name = "serverList4";
+            this.serverList4.Size = new System.Drawing.Size(182, 21);
+            this.serverList4.TabIndex = 10;
+            // 
+            // ExamplesConfigStep1
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.actionLabel);
+            this.DoubleBuffered = true;
+            this.Name = "ExamplesConfigStep1";
+            this.Size = new System.Drawing.Size(560, 499);
+            this.Controls.SetChildIndex(this.actionLabel, 0);
+            this.Controls.SetChildIndex(this.groupBox1, 0);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label actionLabel;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.GroupBox groupBox1;
+        private System.Windows.Forms.ComboBox serverList4;
+        private System.Windows.Forms.ComboBox serverList3;
+        private System.Windows.Forms.ComboBox serverList2;
+        private System.Windows.Forms.ComboBox serverList1;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+    }
+}

=== added file 'StandardPlugins/Examples/ExamplesConfigPanel1.cs'
--- a/StandardPlugins/Examples/ExamplesConfigPanel1.cs	1970-01-01 00:00:00 +0000
+++ b/StandardPlugins/Examples/ExamplesConfigPanel1.cs	2011-02-09 13:49:30 +0000
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using WexInstaller.Core;
+
+namespace WexInstaller.Plugins
+{
+    public partial class ExamplesConfigStep1 : InstallerPanel
+    {
+        public ExamplesConfigStep1(ExamplesConfigurationController controller)
+        {
+            InitializeComponent();
+            Caption = "Examples Configuration";
+            Controller = controller;
+        }
+
+        private ExamplesConfigurationController Controller { get; set; }
+
+        public override void Activate()
+        {
+            PopulateServerList(serverList1);
+            PopulateServerList(serverList2);
+            PopulateServerList(serverList3);
+            PopulateServerList(serverList4);
+            base.Activate();
+        }
+
+        private void PopulateServerList(ComboBox serverList)
+        {
+            serverList.Items.Add("Do not install");
+            foreach (ServerProductConfigurationController server in Controller.Servers)
+                serverList.Items.Add(server.Owner.TitleWithVersion);
+        }
+    }
+}

=== added file 'StandardPlugins/Examples/ExamplesConfigPanel1.resx'
--- a/StandardPlugins/Examples/ExamplesConfigPanel1.resx	1970-01-01 00:00:00 +0000
+++ b/StandardPlugins/Examples/ExamplesConfigPanel1.resx	2011-02-09 13:49:30 +0000
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

=== modified file 'StandardPlugins/Server/ConfigurationController.cs'
--- a/StandardPlugins/Server/ConfigurationController.cs	2011-02-08 21:28:42 +0000
+++ b/StandardPlugins/Server/ConfigurationController.cs	2011-02-09 13:49:30 +0000
@@ -16,7 +16,6 @@
     [ProductConfiguration("mysql-server", 1)]
     public class ServerConfigurationController : ServerProductConfigurationController
     {
-        private BackgroundWorker bgw;
         private UserControl[] pages;
         private bool processedTemplate;
         private bool processedService;
@@ -28,12 +27,9 @@
         // UI Controls.
         public ServerInstallType ServerInstallType { get; set; }
         public bool Reconfigure { get; set; }
-        public bool EnableTCPIP { get; set; }
-        public int Port { get; set; }
         public bool CreateService { get; set; }
         public string ServiceName { get; set; }
         public bool StartAtStartup { get; set; }
-        public string RootPassword { get; set; }
         public string ExistingRootPassword { get; set; }
         public string ExistingConfigFile { get; set; }
 
@@ -67,19 +63,6 @@
             Initialize();
         }
 
-        public override void Configure()
-        {
-            CurrentState = ConfigState.ConfigurationInProgress;
-            Debug.Assert(bgw == null);
-            bgw = new BackgroundWorker();
-            bgw.WorkerReportsProgress = true;
-            bgw.WorkerSupportsCancellation = false;
-            bgw.DoWork += new DoWorkEventHandler(bgw_DoConfigure);
-            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_ConfigureCompleted);
-            bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ConfigureProgressChanged);
-            bgw.RunWorkerAsync();
-        }
-
         private bool ProcessTemplate()
         {
             OnConfigured(new ConfigurationEventArgs(ConfigurationEventType.Info, "VALID_TEMPLATE"));
@@ -213,7 +196,7 @@
             return processedSecuritySettings;
         }
 
-        private void bgw_DoConfigure(object sender, DoWorkEventArgs e)
+        protected override void BackgroundConfigure(object sender, DoWorkEventArgs e)
         {
             if (it == null)
                 Initialize();
@@ -231,24 +214,6 @@
             }
         }
 
-        private void bgw_ConfigureProgressChanged(object sender, ProgressChangedEventArgs e)
-        {
-            base.OnConfigured(e.UserState as ConfigurationEventArgs);
-        }
-
-        private void bgw_ConfigureCompleted(object sender, RunWorkerCompletedEventArgs e)
-        {
-            bgw.Dispose();
-            bgw = null;
-            if (CurrentState != ConfigState.ConfigurationError)
-                CurrentState = ConfigState.ConfigurationComplete;
-
-            ConfigurationEventArgs ce = new ConfigurationEventArgs(ConfigurationEventType.Finished, "CONFIGURE_COMPLETE");
-            ce.PercentComplete = 100;
-            ce.Details = "Product configuration controller finished configuration.";
-            base.OnConfigured(ce);
-        }
-
         public override void Initialize()
         {
             Logger.LogInformation("Product configuration controller initialization started.");
@@ -350,21 +315,21 @@
                 return "Dedicated Machine";
         }
 
-        public string GetConfigurationAsText()
-        {
-            StringBuilder s = new StringBuilder();
-            s.AppendLine("Configuration Type");
-            s.AppendLine(String.Format("     {0}", GetServerTypeAsString()));
-            s.AppendLine(String.Format("TCP/IP Networking {0}", EnableTCPIP ? "enabled" : "disabled"));
-            s.AppendLine(String.Format("     Port: {0}", EnableTCPIP ? Port.ToString() : "N/A"));
-            s.AppendLine("Windows Settings");
-            s.AppendLine(String.Format("     Windows Service Name: {0}", 
-                         String.IsNullOrEmpty(ServiceName) ? "<Not Set>" : ServiceName));
-            s.AppendLine("Security Settings");
-            s.AppendLine(String.Format("     Root Password {0}Set", 
-                         String.IsNullOrEmpty(RootPassword) ? "Not " : ""));
-            return s.ToString();
-        }
+        //public string GetConfigurationAsText()
+        //{
+        //    StringBuilder s = new StringBuilder();
+        //    s.AppendLine("Configuration Type");
+        //    s.AppendLine(String.Format("     {0}", GetServerTypeAsString()));
+        //    s.AppendLine(String.Format("TCP/IP Networking {0}", EnableTCPIP ? "enabled" : "disabled"));
+        //    s.AppendLine(String.Format("     Port: {0}", EnableTCPIP ? Port.ToString() : "N/A"));
+        //    s.AppendLine("Windows Settings");
+        //    s.AppendLine(String.Format("     Windows Service Name: {0}", 
+        //                 String.IsNullOrEmpty(ServiceName) ? "<Not Set>" : ServiceName));
+        //    s.AppendLine("Security Settings");
+        //    s.AppendLine(String.Format("     Root Password {0}Set", 
+        //                 String.IsNullOrEmpty(RootPassword) ? "Not " : ""));
+        //    return s.ToString();
+        //}
 
         protected override void OnConfigured(ConfigurationEventArgs e)
         {
@@ -466,13 +431,9 @@
         /// ========================================================================
         public override bool IsRunning
         {
-            get { throw new NotImplementedException(); }
+            get { return true; }
         }
 
-        public override string GetConnectionString(bool promptIfNecessary)
-        {
-            throw new NotImplementedException();
-        }
     }
 
     public enum ServerInstallType

=== modified file 'StandardPlugins/StandardPlugins.csproj'
--- a/StandardPlugins/StandardPlugins.csproj	2011-02-08 21:54:02 +0000
+++ b/StandardPlugins/StandardPlugins.csproj	2011-02-09 13:49:30 +0000
@@ -45,6 +45,12 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Examples\ConfigurationController.cs" />
+    <Compile Include="Examples\ExamplesConfigPanel1.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Examples\ExamplesConfigPanel1.Designer.cs">
+      <DependentUpon>ExamplesConfigPanel1.cs</DependentUpon>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
       <AutoGen>True</AutoGen>
@@ -74,6 +80,9 @@
     </Compile>
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="Examples\ExamplesConfigPanel1.resx">
+      <DependentUpon>ExamplesConfigPanel1.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>

=== modified file 'WexInstaller.Core/PluginManager.cs'
--- a/WexInstaller.Core/PluginManager.cs	2011-02-08 21:28:42 +0000
+++ b/WexInstaller.Core/PluginManager.cs	2011-02-09 13:49:30 +0000
@@ -7,15 +7,16 @@
 
 namespace WexInstaller.Core
 {
-    class PluginManager
+    public class PluginManager
     {
-        private static PluginManager Instance = new PluginManager();
         private bool loadedPlugins;
         private Dictionary<string, ControllerType> controllerTypes =
             new Dictionary<string, ControllerType>();
         private Dictionary<string, ProductConfigurationController> controllerCache = 
             new Dictionary<string,ProductConfigurationController>();
 
+        public static PluginManager Instance = new PluginManager();
+
         /// <summary>
         /// Retrieves the latest controller plugin (if any) associated with the given product name
         /// </summary>
@@ -108,6 +109,25 @@
 
             loadedPlugins = true;
         }
+
+        /// <summary>
+        ///  Returns a list of server controllers, possibly running
+        /// </summary>
+        /// <param name="running">If true only return the controllers whose servers are running</param>
+        /// <returns></returns>
+        public List<ServerProductConfigurationController> GetServerControllers(bool running)
+        {
+            List<ServerProductConfigurationController> servers = new List<ServerProductConfigurationController>();
+
+            foreach (ProductConfigurationController controller in controllerCache.Values)
+            {
+                if (!(controller is ServerProductConfigurationController)) continue;
+                ServerProductConfigurationController s = controller as ServerProductConfigurationController;
+                if (running && !s.IsRunning) continue;
+                servers.Add(s);
+            }
+            return servers;
+        }
     }
 
     struct ControllerType 

=== modified file 'WexInstaller.Core/ProductConfigurationController.cs'
--- a/WexInstaller.Core/ProductConfigurationController.cs	2011-02-08 21:28:42 +0000
+++ b/WexInstaller.Core/ProductConfigurationController.cs	2011-02-09 13:49:30 +0000
@@ -13,8 +13,9 @@
 {
     public abstract class ProductConfigurationController
     {
+        private BackgroundWorker bgw;
+
         public abstract int NumPages { get; }
-
         public abstract UserControl[] Pages { get; }
 
         public ConfigState CurrentState { get; protected set; }
@@ -23,7 +24,39 @@
         /// <summary>
         /// Virtual methods controllers can override
         /// </summary>
-        public virtual void Configure() { } 
+        public virtual void Configure()
+        {
+            CurrentState = ConfigState.ConfigurationInProgress;
+            Debug.Assert(bgw == null);
+            bgw = new BackgroundWorker();
+            bgw.WorkerReportsProgress = true;
+            bgw.WorkerSupportsCancellation = false;
+            bgw.DoWork += new DoWorkEventHandler(BackgroundConfigure);
+            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundConfigureCompleted);
+            bgw.ProgressChanged += new ProgressChangedEventHandler(BackgroundConfigureProgressChanged);
+            bgw.RunWorkerAsync();
+        }
+
+        protected virtual void BackgroundConfigure(object sender, DoWorkEventArgs e) { }
+
+        protected virtual void BackgroundConfigureProgressChanged(object sender, ProgressChangedEventArgs e)
+        {
+            OnConfigured(e.UserState as ConfigurationEventArgs);
+        }
+
+        protected virtual void BackgroundConfigureCompleted(object sender, RunWorkerCompletedEventArgs e)
+        {
+            bgw.Dispose();
+            bgw = null;
+            if (CurrentState != ConfigState.ConfigurationError)
+                CurrentState = ConfigState.ConfigurationComplete;
+
+            ConfigurationEventArgs ce = new ConfigurationEventArgs(ConfigurationEventType.Finished, "CONFIGURE_COMPLETE");
+            ce.PercentComplete = 100;
+            ce.Details = "Product configuration controller finished configuration.";
+            OnConfigured(ce);
+        }
+
         public virtual void Initialize() { }
         public virtual void PreAction(ConfigurationAction action) { }
         public virtual void PostAction(ConfigurationAction action) { }

=== modified file 'WexInstaller.Core/Properties/Resources.Designer.cs'
--- a/WexInstaller.Core/Properties/Resources.Designer.cs	2011-02-08 21:28:42 +0000
+++ b/WexInstaller.Core/Properties/Resources.Designer.cs	2011-02-09 13:49:30 +0000
@@ -102,6 +102,13 @@
             }
         }
         
+        internal static System.Drawing.Bitmap Server_Reflection {
+            get {
+                object obj = ResourceManager.GetObject("Server_Reflection", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap Tutorials_Icon {
             get {
                 object obj = ResourceManager.GetObject("Tutorials_Icon", resourceCulture);

=== modified file 'WexInstaller.Core/Properties/Resources.resx'
--- a/WexInstaller.Core/Properties/Resources.resx	2011-02-08 21:28:42 +0000
+++ b/WexInstaller.Core/Properties/Resources.resx	2011-02-09 13:49:30 +0000
@@ -117,7 +117,7 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="AddIn_Icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\AddOnsCategoryIcon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -130,7 +130,6 @@
   <data name="Documentation_Icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\DocsCategoryIcon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="linkpanel_divider" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\linkpanel_divider.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
@@ -140,4 +139,8 @@
   <data name="Tutorials_Icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\TutorialsCategoryIcon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Server_Reflection" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Server_Reflection.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
\ No newline at end of file

=== added file 'WexInstaller.Core/Resources/Server_Reflection.png'
Binary files a/WexInstaller.Core/Resources/Server_Reflection.png	1970-01-01 00:00:00 +0000 and b/WexInstaller.Core/Resources/Server_Reflection.png	2011-02-09 13:49:30 +0000 differ
=== added file 'WexInstaller.Core/RootPasswordPromptDlg.Designer.cs'
--- a/WexInstaller.Core/RootPasswordPromptDlg.Designer.cs	1970-01-01 00:00:00 +0000
+++ b/WexInstaller.Core/RootPasswordPromptDlg.Designer.cs	2011-02-09 13:49:30 +0000
@@ -0,0 +1,179 @@
+namespace WexInstaller.Core
+{
+    partial class RootPasswordPromptDlg
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.largeTitle = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.pictureBox1 = new System.Windows.Forms.PictureBox();
+            this.username = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.password = new System.Windows.Forms.TextBox();
+            this.cancelButton = new System.Windows.Forms.Button();
+            this.loginButton = new System.Windows.Forms.Button();
+            this.panel1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // panel1
+            // 
+            this.panel1.BackColor = System.Drawing.SystemColors.Window;
+            this.panel1.Controls.Add(this.password);
+            this.panel1.Controls.Add(this.label3);
+            this.panel1.Controls.Add(this.label2);
+            this.panel1.Controls.Add(this.username);
+            this.panel1.Controls.Add(this.pictureBox1);
+            this.panel1.Controls.Add(this.label1);
+            this.panel1.Controls.Add(this.largeTitle);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel1.Location = new System.Drawing.Point(0, 0);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(443, 193);
+            this.panel1.TabIndex = 0;
+            // 
+            // largeTitle
+            // 
+            this.largeTitle.AutoSize = true;
+            this.largeTitle.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.largeTitle.ForeColor = System.Drawing.Color.DodgerBlue;
+            this.largeTitle.Location = new System.Drawing.Point(24, 23);
+            this.largeTitle.Name = "largeTitle";
+            this.largeTitle.Size = new System.Drawing.Size(300, 19);
+            this.largeTitle.TabIndex = 0;
+            this.largeTitle.Text = "Please provide a MySQL Server 5.5 Login";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(25, 51);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(248, 14);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "Login as a user with root account privileges.";
+            // 
+            // pictureBox1
+            // 
+            this.pictureBox1.Image = global::WexInstaller.Core.Properties.Resources.Server_Reflection;
+            this.pictureBox1.Location = new System.Drawing.Point(50, 94);
+            this.pictureBox1.Name = "pictureBox1";
+            this.pictureBox1.Size = new System.Drawing.Size(59, 63);
+            this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+            this.pictureBox1.TabIndex = 2;
+            this.pictureBox1.TabStop = false;
+            // 
+            // username
+            // 
+            this.username.Location = new System.Drawing.Point(279, 96);
+            this.username.Name = "username";
+            this.username.Size = new System.Drawing.Size(122, 22);
+            this.username.TabIndex = 3;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(128, 99);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(145, 14);
+            this.label2.TabIndex = 4;
+            this.label2.Text = "Root Account Username:";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(211, 129);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(62, 14);
+            this.label3.TabIndex = 5;
+            this.label3.Text = "Password:";
+            // 
+            // password
+            // 
+            this.password.Location = new System.Drawing.Point(279, 126);
+            this.password.Name = "password";
+            this.password.PasswordChar = '*';
+            this.password.Size = new System.Drawing.Size(122, 22);
+            this.password.TabIndex = 6;
+            // 
+            // cancelButton
+            // 
+            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cancelButton.Location = new System.Drawing.Point(349, 205);
+            this.cancelButton.Name = "cancelButton";
+            this.cancelButton.Size = new System.Drawing.Size(75, 23);
+            this.cancelButton.TabIndex = 1;
+            this.cancelButton.Text = "Cancel";
+            this.cancelButton.UseVisualStyleBackColor = true;
+            // 
+            // loginButton
+            // 
+            this.loginButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.loginButton.Location = new System.Drawing.Point(258, 205);
+            this.loginButton.Name = "loginButton";
+            this.loginButton.Size = new System.Drawing.Size(75, 23);
+            this.loginButton.TabIndex = 2;
+            this.loginButton.Text = "Login";
+            this.loginButton.UseVisualStyleBackColor = true;
+            // 
+            // RootPasswordPromptDlg
+            // 
+            this.AcceptButton = this.loginButton;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.cancelButton;
+            this.ClientSize = new System.Drawing.Size(443, 248);
+            this.ControlBox = false;
+            this.Controls.Add(this.loginButton);
+            this.Controls.Add(this.cancelButton);
+            this.Controls.Add(this.panel1);
+            this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "RootPasswordPromptDlg";
+            this.Text = "Configuration";
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.Label largeTitle;
+        private System.Windows.Forms.PictureBox pictureBox1;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox password;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox username;
+        private System.Windows.Forms.Button cancelButton;
+        private System.Windows.Forms.Button loginButton;
+    }
+}
\ No newline at end of file

=== added file 'WexInstaller.Core/RootPasswordPromptDlg.cs'
--- a/WexInstaller.Core/RootPasswordPromptDlg.cs	1970-01-01 00:00:00 +0000
+++ b/WexInstaller.Core/RootPasswordPromptDlg.cs	2011-02-09 13:49:30 +0000
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace WexInstaller.Core
+{
+    public partial class RootPasswordPromptDlg : Form
+    {
+        public RootPasswordPromptDlg()
+        {
+            InitializeComponent();
+        }
+
+        public string Username
+        {
+            get { return username.Text.Trim(); }
+        }
+
+        public string Password
+        {
+            get { return password.Text.Trim(); }
+        }
+    }
+}

=== added file 'WexInstaller.Core/RootPasswordPromptDlg.resx'
--- a/WexInstaller.Core/RootPasswordPromptDlg.resx	1970-01-01 00:00:00 +0000
+++ b/WexInstaller.Core/RootPasswordPromptDlg.resx	2011-02-09 13:49:30 +0000
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

=== added file 'WexInstaller.Core/ServerProductConfigurationController.cs'
--- a/WexInstaller.Core/ServerProductConfigurationController.cs	1970-01-01 00:00:00 +0000
+++ b/WexInstaller.Core/ServerProductConfigurationController.cs	2011-02-09 13:49:30 +0000
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+using WexInstaller.Core;
+using System.ComponentModel;
+using System.Threading;
+using System.Diagnostics;
+
+namespace WexInstaller.Core
+{
+    public abstract class ServerProductConfigurationController : ProductConfigurationController
+    {
+        public bool EnableTCPIP { get; set; }
+        public int Port { get; set; }
+        public string RootPassword { get; set; }
+
+        public abstract bool IsRunning { get; }
+
+        public string GetConnectionString(bool promptIfNecessary)
+        {
+            string username = "root";
+            string rootPwd = RootPassword;
+
+            if (String.IsNullOrEmpty(rootPwd))
+            {
+                if (!promptIfNecessary) return null;
+                RootPasswordPromptDlg dlg = new RootPasswordPromptDlg();
+                DialogResult result = dlg.ShowDialog();
+                if (result == DialogResult.Cancel) return null;
+                username = dlg.Username;
+                rootPwd = dlg.Password;
+            }
+
+            string connStr = String.Format("server=localhost;uid={0};pwd={1}", username, rootPwd);
+
+            // if we are not doing TCP/IP then we assume named pipes
+            if (!EnableTCPIP)
+                connStr += "";
+            else
+                connStr += String.Format(";port={0}", Port);
+            return connStr;
+        }
+    }
+
+}

=== modified file 'WexInstaller.Core/WexInstaller.Core.csproj'
--- a/WexInstaller.Core/WexInstaller.Core.csproj	2011-02-08 21:28:42 +0000
+++ b/WexInstaller.Core/WexInstaller.Core.csproj	2011-02-09 13:49:30 +0000
@@ -58,6 +58,12 @@
     <Compile Include="ProductFeature.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="RootPasswordPromptDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="RootPasswordPromptDlg.Designer.cs">
+      <DependentUpon>RootPasswordPromptDlg.cs</DependentUpon>
+    </Compile>
     <Compile Include="ServerProductConfigurationController.cs" />
     <Compile Include="ProductConfigurationController.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -76,6 +82,9 @@
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="RootPasswordPromptDlg.resx">
+      <DependentUpon>RootPasswordPromptDlg.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <None Include="Resources\linkpanel_divider.png" />
@@ -98,6 +107,9 @@
   <ItemGroup>
     <None Include="Resources\TutorialsCategoryIcon.png" />
   </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\Server_Reflection.png" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.

Attachment: [text/bzr-bundle] bzr/reggie.burnett@oracle.com-20110209134930-mtr9yyf0ajwkd3hr.bundle
Thread
bzr commit into wex-installer-1.0 branch (reggie.burnett:320) Reggie Burnett9 Feb